问题:现有类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"声明函数防止这种隐式转换。

最新文章

  1. Python之路,Day7 - Python基础7 面向对象
  2. zendstudio快捷键收录
  3. mac brew mysql 启动之后报错
  4. 闲来无事——第一弹 Java基础 基本数据类型
  5. Java正则表达式--网页爬虫
  6. 在artTemplate的标签中使用外部函数的方法
  7. MySQL 资源大全中文版
  8. python 自动化之路 day 04
  9. xcode 最近打开文件列表显示为空或不显示最近打开的项目或(no recent projects)解决办法
  10. Python操作SQLAchemy
  11. Vue的双向数据绑定
  12. Centos 7 下, 安装odoo 10
  13. js Jquery字符UrlEncode 编码 C#(asp.net)解码 Server HttpUtility 区别 cookies存中文
  14. C#实现二维码生成与解码
  15. SpringBoot日记——Thymeleaf模板引擎篇
  16. [java] java中的初始化顺序
  17. jffs2系统制作2
  18. servlet的小例子
  19. Ubuntu 16.04安装IntelliJ出品的数据库管理工具DataGrip
  20. 时区时差换算(GMT,UTC,PST,PDT)

热门文章

  1. C++面向对象高级编程(二)基础篇
  2. Django项目的ORM操作之--模型类数据查询
  3. vue-keep-alive
  4. flowable EngineConfiguration的作用和继承关系(1)
  5. RxJava 1.x 笔记:过滤型操作符
  6. JS修改标签中的文本且不影响其中标签
  7. Microsoft Office Powerpoint、Visio 已停止工作解决办法
  8. sysbench工具使用
  9. IAuthenticationManager.SignOut 退不了
  10. Jmeter-ForEach控制器