重載 << 運算子


如果您想要輸出一個物件的資料,例如一個自訂的Point物件中的x與y值,則您通常會這麼作:
Point p1(10, 5);
cout << p1.x << ", " << p2.y << endl;


每一次若都要這麼撰寫程式碼,事實上也是很麻煩的,您可以重載 << 運算子,讓 << 擁有輸出物件資料的能力,例如使下面這段程式碼與上面的作用相同:
Point p1(10, 5);
cout << p1 << endl;


要重載 << 運算子,其方法與重載其它運算子類似,其語法如下:
ostream &operator<<(ostream &s, class-name ob) {
    // 實作
    return s;
}


第一個參數是ostream型態的參數,也就是輸出串流,傳回這個串流給cout的話,就可以顯示輸出至串流中的資訊,第二個參數是要輸出的物件,實作時將指定輸出的資訊。

下面這個程式是個使用friend函式來重載 << 的範例:
#include <iostream> 
using namespace std;

class Point {
int x, y;

public:
Point() {
x = y = 0;
}

Point(int x, int y) {
this->x = x;
this->y = y;
}

friend ostream &operator<<(ostream &s, Point p);
};

ostream &operator<<(ostream &s, Point p) {
s << "("<< p.x << ", " << p.y << ")";
return s;
}

int main() {
Point p1(1, 3), p2(10, 5);

cout << "p1: " << p1 << endl
<< "p2: " << p2 << endl;

return 0;
}

執行結果:
p1: (1, 3)
p2: (10, 5) 

通常重載 << 運算子時,會使用friend函式,這是因為重載 << 函式時,它不是一個成員函式,理由在於 << 左邊不是物件,而是一個輸出串流,由於 << 函式不是成員函式,若要能存取資料成員,則該資料成員必須設定為public,使用friend函式來進行重載的話,則不用受此限制。

下面這個程式示範了不使用friend函式來重載,由於 << 函式不是成員函式,所以x與y必須宣告為public才可以:
#include <iostream> 
using namespace std;

class Point {
public:
int x, y;

Point() {
x = y = 0;
}

Point(int x, int y) {
this->x = x;
this->y = y;
}
};

ostream &operator<<(ostream &s, Point p) {
s << "("<< p.x << ", " << p.y << ")";
return s;
}

int main() {
Point p1(1, 3), p2(10, 5);

cout << "p1: " << p1 << endl
<< "p2: " << p2 << endl;

return 0;
}

執行結果:
p1: (1, 3)
p2: (10, 5)