最近看到了一个题目,有必要对重载运算符进行深入理解。
#include<iostream> using namespace std; class MyClass { public: MyClass(int i = 0) { cout << i; } MyClass(const MyClass &x) { cout << 2; } MyClass &operator=(const MyClass &x) { cout << 3; return *this; } ~MyClass() { cout << 4; } }; int main() { MyClass obj1(1), obj2(2); MyClass obj3=obj1; cout<<"-------"<<endl; MyClass obj4; obj4=obj1; cout<<"-------"<<endl; return 0; }
最后输出结果为:
122-------
03-------
4444
分析:MyClass obj1(1), obj2(2);对象创建过程中会调用构造函数,所以会输出12,MyClass obj3=obj1;执行时会调用拷贝构造函数来对对象进行构造,而没有进行运算符重载,也就是说运算符重载是在对象构造之后再进行相应操作, MyClass obj4;obj4=obj1;这两句执行的结果正好说明了这一点,拷贝构造函数发生在对象还没有创建;赋值操作符重载仅发生在对象已经创建的情况下。
对于“=”重载, MyClass &operator=(const MyClass &x), 符号&表示返回类型的引用,如果将&去掉会产生截然不同的效果,我们去掉上面代码重载运算符中的&,输出结果为:
122-------
0324-------
4444
对比上面输出结果可以看到在03后面多输出了24,也就是执行了一次构造函数和一次析构函数,由于重载时返回类型为MyClass类,所以需要构造一个新的类,这个返回值是为了赋值运算可以连续进行,如a3=a2=a4,返回的新对象可以作为右值继续为左值赋值。所以通常在运算符重载的时候需要加上引用&,这样可以避免临时构造的类出现。