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

  • 相关阅读:
    CLSCompliantAttribute
    杂言
    批处理修改目录的隐藏属性
    unittest基本用法
    unittest跳过用例
    MySQL流程控制结构
    MySQL视图
    MySQL函数
    unittest断言 & 数据驱动
    PLSQL
  • 原文地址:https://www.cnblogs.com/xiaodingmu/p/8082883.html
Copyright © 2020-2023  润新知