重载输入输出运算符<< 学习
转自:https://developer.aliyun.com/article/297612,https://blog.csdn.net/My_heart_/article/details/51534624
1.介绍
cin和cout分别是istream类和ostream类的对象,在类库提供的头文件中已经对这两个类的“<<”和“>>”进行了重载。
若自定义的类要使用<</>>作为输入或输出,需要重载:
istream & operator >> (istream &, 自定义类 &);// 第一个参数和函数的类型都必须是istream&类型,第二个参数是要进行输入操作的类。都是引用类型。 ostream & operator << (ostream &, 自定义类 &);// 第一个参数和函数的类型都必须是ostream&类型,第二个参数是要进行输出操作的类。
只能将重载“>>”和“<<”的函数作为友元函数或普通的函数,而不能将它们定义为成员函数, 因为定义为成员函数需要当前类是操作符的左输入。
作为友元函数主要是为了能访问类的私有成员,如果类没有私有成员,那么不定义为友元函数也没问题。
分析cout<<c3; 编译系统把“cout<<c3”解释为 operator<<(cout, c3);以两者为实参调用重载的operator<<函数,并且返回对象对cout的引用。
那么重载函数里的<<实际上是C++自己定义的重载函数:
std::cout << 1;
语句,等价于cout.operator<<(1);
std::cout << 1 <<"hello";
语句,等价于( cout.operator<<(1) ).operator<<("hello");
return output的作用是什么?是为了能连续向输出流插入信息。
2.重载规则
- 重载为类成员函数还是全局函数?
类成员函数:
class person{ private: int age; public: person(int a) { this->age=a; } inline bool operator == (const person &ps) const; }; // 只需要传入右操作数即可,当前类对象是左操作数 inline bool person::operator==(const person &ps) const { if (this->age==ps.age) return true; return false; }
全局函数:
-
如果一个重载操作符是类成员函数,那么只有当与 它的左操数是该类的对象时,该操作符才会被调用。如果该操作符的左操作数必须是其他的类型,则操作符必须被重载为全局名字空间的成员。
-
C++要求赋值=,下标[],调用(), 和成员指向-> 操作符必须被定义为类成员操作符。任何把这些操作符定义为名字空间成员的定义都会被标记为编译时刻错误。
-
如果有一个操作数是类型如string类的情形那么对于对称操作符比如等于操作符最好定义为全局名字空间成员。