目錄
輸入和輸出操作符
算術操作符和關系操作符
下標操作符
自加、自減操作符
成員訪問操作符
1 輸入和輸出操作符
1.1 輸出操作符
1.1.1 示例
復制代碼
#include <iostream>
#include <string>
using namespace std;
class A
{
friend ostream& operator<<(ostream& out, const A& a);
public:
A(const string &s = "", int v = 0) : ss(s), val(v) {} //構造函數帶默認參數
private:
int val;
string ss;
};
ostream& operator<<(ostream& out, const A& a)
{
out << "a.ss:" << a.ss << " " << "a.val:" << a.val;
return out;
}
int main()
{
A a("hello", 23);
cout << a << endl;
A b;
cout << b << endl;
}
復制代碼
結果
1.1.2 說明
1)IO操作必須為非成員函數
原因:I/O操作的接口返回的是ostream&對象(只有返回左值,這樣才可以連續的輸出,例如cout << a << b)。自定義的輸出操作符應該與其相似。如果將其定義為成員函數(有個首默認參數this,即指向自己的指針),左操作數只能是該類型的對象,則沒法辦到。例如:Sales_item; item << cout; 與常規定義相反,因此只能為非成員函數。
2)因為要訪問指定類的私有成員,所以在該類中聲明輸出操作符為友員函數。
3)第一個形參必須為引用。因為I/O對象不可以復制。同理返回值必須為一個引用。
4)第一個形參不可以為const,因為寫入到流會改變其值。
5)第二個為引用,這樣可以避免復制。參數可以為const,可以接收const對象和非const對象;否則,如果為非const,則只能接收非coust對象。一般為const,畢竟只是輸出而已,不改變對象。
1.2 輸入操作符
1.2.1 示例
復制代碼
#include <iostream>
#include <string>
using namespace std;
class A
{
friend ostream& operator<<(ostream& out, const A& a);
friend istream& operator>>(istream& in, A& a);
public:
A(const string &s = "", int v = 0) : ss(s), val(v) {}
private:
int val;
string ss;
};
ostream& operator<<(ostream& out, const A& a)
{
out << "a.ss:" << a.ss << " " << "a.val:" << a.val;
return out;
}
istream& operator>>(istream& in, A& a)
{
in >> a.ss >> a.val;
if(in)
{
cout << "Input right" << endl;
}
else
{
cout << "in.fail:" << in.fail() << endl;
cout << "input wrong!" << endl;
}
return in;
}
int main()
{
A a("hello", 23);
cout << a << endl;
A b;
cin >> b;
cout << b << endl;
}
復制代碼