(我被灌输的第一印象是输入输出运算符不能重载成成员函数,后来发现不是不能,而是习惯上的选择。)
众所周知,作为类的非静态成员函数,第一个参数隐藏为this指针,这样才能被对象调通过 obj.fun() 的方式实现调用。若将输入/输出运算符重载为成员函数:
#include<iostream>
using namespace std;
class Data
{
private:
int a;
int b;
public:
Data() { a = 0; b = 0; cout << "无参构造" << endl; }
Data(int m, int n):a(m),b(n) {cout << "有参构造" << endl; }
Data(const Data& d) { a = d.a; b = d.b; cout << "复制构造" << endl; }
~Data() { cout << "析构函数" << endl; }
ostream& operator <<(ostream& os) {//这里将输出运算符重载为成员函数
os << "a=" << a << " b=" << b << endl;
return os;
}
};
void test()
{
Data data(1, 2);
Data data2(2, 3);
//data.operator<<(cout);//<<重载为成员函数后的调用方式1
data << cout;//<<重载为成员函数后的调用方式2
cout << "****************" << endl;
data2 <<(data << cout);//<<重载为成员函数后连续输出
}
最终输出为:
可以看出理论上输入/输出运算符是可以重载为成员函数的,但是在使用时与我们平常使用的习惯很不相同(即习惯上输出运算符在前,输出对象在后;但若将输出运算符重载为成员函数,输出对象在前,输出运算符在后),故此一般将其重载为全局函数