zoukankan      html  css  js  c++  java
  • [C++]复制构造函数、赋值操作符与隐式类类型转换

    问题:现有类A定义如下:

    class A
    {
    public:
            A(int a)                            //构造函数
            {
                    m_a = a;
                    cout<<"constructor"<<endl;
            }


            A(const A &d)                  //复制构造函数
            {
                    m_a = d.m_a;
                    cout<<"copy constructor"<<endl;
            }
     
            A& operator=(const A &oA)                   //重载赋值操作符
            {
                    m_a = oA.m_a;
                    cout<<"operator="<<endl;
                    return *this;
            }
    private:
            int m_a;
    };

    讨论以下3种情况的输出:

    1. /***************************************** test1 *****************************************/

    int main(int argc, char *argv[])
    {
           A obj = 2;
            system("pause");
            return 0;
    }

    2. /***************************************** test2 *****************************************/

    int main(int argc, char *argv[])
    {
           A obj1(1);
            A obj2 = obj1;
            system("pause");
            return 0;
    }

    3. /***************************************** test3 *****************************************/

    int main(int argc, char *argv[])
    {
           A obj(1);
           obj = 2;
            system("pause");
            return 0;
    }

     

    对于test1输出结果为:constructor

    解释:语句 A obj = 2; 是对象obj的声明和初始化,也就是构造对象obj。“=”在这里表示的是初始化,不是赋值。由于 2 和 obj 类型不同,将发生隐式类类型转换,调用 A(int a) 构造函数。

     

    对于test2输出结果为:copy constructor

    解释:语句 A obj2 = obj1; 同样也是对象的声明和初始化,也就是构造对象obj2。“=”在这里表示的是初始化,不是赋值。由于obj1和obj2类型一致,直接调用复制构造函数构造对象obj2。

     

    对于test3输出结果为:constructor [换行] operator=

    解释:语句 obj = 2; 由于对象obj已经声明并初始化了,因此这里的“=”表示的是赋值。又因为 2 和 obj 类型不同,首先2隐式转换为A类型的临时对象,再调用赋值操作符函数对obj进行赋值。

     

    备注:

    1. “=”表示的是初始化还是赋值关键在于等号左边对象是否已经存在(已经被构造)。如果不存在,则是初始化,应该调用构造函数或复制构造函数(具体视情况而定);如果存在,则是赋值,应该调用赋值操作符函数。

    2. 隐式类类型转换:用单个实参来调用的构造函数定义了从形参类型到类类型的一个隐式转换(C++ Primer)。如果是多个实参,则无法完成隐式转换。可以用关键字"explicit"声明函数防止这种隐式转换。

  • 相关阅读:
    WEB网站类型系统中使用的OFFICE控件
    【架构】原型设计工具一览
    【云计算】mesos+marathon 服务发现、负载均衡、监控告警方案
    【自动部署该怎么做?】
    【OpenStack 虚拟机初始化user-data & Cloud-init】
    【数据可视化 参考资料】
    【RabbitMQ 参考资料】
    【CloudFoundry】架构、设计参考
    【OpenStack项目管理-CPU/内存/存储/网络 配额管理】
    【前端自动化构建 grunt、gulp、webpack】
  • 原文地址:https://www.cnblogs.com/ymy124/p/3638132.html
Copyright © 2011-2022 走看看