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

  • 相关阅读:
    八. 输入输出(IO)操作2.面向字符的输入流
    八. 输入输出(IO)操作1.输入输出基本概念
    七. 多线程编程11.线程的挂起、恢复和终止
    七. 多线程编程10.线程死锁
    nginx 配置身份验证 http_auth_basic_module
    liunx mysql 备份
    8080 端口只允许内网访问配置
    nginx 配置白名单
    liunx tomcat 运行模式apr
    liunx contos 7.4 安装redis集群
  • 原文地址:https://www.cnblogs.com/xiaodingmu/p/8082883.html
Copyright © 2011-2022 走看看