C++重载运算符的理解

最近看到了一个题目,有必要对重载运算符进行深入理解。

#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,返回的新对象可以作为右值继续为左值赋值。所以通常在运算符重载的时候需要加上引用&,这样可以避免临时构造的类出现。

原文地址:https://www.cnblogs.com/xiaodingmu/p/8082883.html