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

[C++]复制构造函数、赋值操作符与隐式类类型转换的更多相关文章

  1. C++ 隐式类类型转换和转换操作符

    隐式类类型转换 C++语言定义了内置类型之间的几个自动转换.也可以定义如何将其他类型的对象隐式转换为我们的类类型,或将我们的类类型的对象隐式转换为其他类型.为了定义到类类型的隐式转换,需要定义合适的构 ...

  2. C++ 隐式类类型转换

    <C++ Primer>中提到: “可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换.” 这里应该注意的是, “可以用单个形参进行调用” 并不是指构造函数 ...

  3. 析构函数-复制构造函数-赋值操作符重载-默认构造函数<代码解析>

    通过下面primer中的一道习题,可以更深刻的了解,析构函数,复制构造函数,赋值操作符重载,默认构造函数的使用. 但是我的结果与primer习题解答里面的并不相同,可能是编译器不同的原因导致. // ...

  4. 【c++】explicit 隐式类类型转换

    上代码 #include <iostream> #include <sstream> using namespace std; class A { public: A(cons ...

  5. C++隐式类类型转化

    隐式类类型转换:可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换 class Person { public: Person(): mName()name, mAge ...

  6. C++类构造函数、拷贝构造函数、复制构造函数、复制构造函数、构造函数显示调用和隐式调用

    一. 构造函数是干什么的   class Counter   {   public:            // 类Counter的构造函数            // 特点:以类名作为函数名,无返回 ...

  7. explicit:C++规定,当定义了只有一个参数的构造函数时,同时也定义了一种隐式的类型转换

    explicit研究   explicit是C++中的关键字,不是C语言中的.英文直译是“明确的”.“显式的”意思.出现这个关键字的原因,是在C++中有这样规定的基础上:当定义了只有一个参数的构造函数 ...

  8. 实例理解scala 隐式转换(隐式值,隐式方法,隐式类)

    作用 简单说,隐式转换就是:当Scala编译器进行类型匹配时,如果找不到合适的候选,那么隐式转化提供了另外一种途径来告诉编译器如何将当前的类型转换成预期类型.话不多说,直接测试 ImplicitHel ...

  9. Scala中的Implicit(隐式转换,隐式参数,隐式类)

    文章来自:http://www.cnblogs.com/hark0623/p/4196452.html  转发请注明 代码如下: /** * 隐式转换 隐式参数 隐式类 */ //隐式转换 class ...

随机推荐

  1. ES的Zen发现机制

    ES的Zen发现机制 Zen发现机制是ElasticSearch默认的发现模块.它提供的是单播发现,但是可被拓展为支持云环境下或者其他形式的发现机制.zen 发现模块集成了其他模块,如在发现期间,节点 ...

  2. RESTful设计方法

    REST REST,即Representational State Transfer的缩写.维基百科称其为“具象状态传输”,国内大部分人理解为“表现层状态转化”. RESTful是一种开发理念.维基百 ...

  3. HM visual studio编译报错

    今天,编译HM的代码,发现编译报如下错误. error MSB6003: The specified task executable "cl.exe" could not be r ...

  4. 《Drools7.0.0.Final规则引擎教程》第4章 4.3 日历

    日历 日历可以单独应用于规则中,也可以和timer结合使用在规则中使用.通过属性calendars来定义日历.如果是多个日历,则不同日历之间用逗号进行分割. 在Drools中,日历的概念只是将日历属性 ...

  5. wireshark的一些快捷键

    恢复原来的大小   ‘crtl’+‘=’  即按住crtl建和=键(backspace左边那个键) 缩小 ‘crtl’+‘-’ 即按住crtl建和-键(backspace左边第二个键) 放大 ‘crt ...

  6. 【集成学习】lightgbm调参案例

    lightgbm使用leaf_wise tree生长策略,leaf_wise_tree的优点是收敛速度快,缺点是容易过拟合. # lightgbm关键参数 # lightgbm调参方法cv 代码git ...

  7. Python:数据结构(list, tuple, Dict & Set)

    list: Python中内置的有序数据结构,即数组.由于Python是动态语言,因此数组元素的类型没有限定. classmates = [“Michael”, “David”,”Bob”,”Trac ...

  8. 对Json的各种遍历方法

    慎用for in函数(有可能由于原型链的问题导致遍历问题): 如果要是用for in  一定要使用if (obj1.hasOwnProperty(key)) {}先做判断 解决方法 :1.eval() ...

  9. Web应用中使用JavaMail发送邮件进行用户注册

    现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件.邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息.今天我们也来实现一个这样的功能 ...

  10. BZOJ3083 遥远的国度 【树链剖分】

    BZOJ3083 遥远的国度 Description zcwwzdjn在追杀十分sb的zhx,而zhx逃入了一个遥远的国度.当zcwwzdjn准备进入遥远的国度继续追杀时,守护神RapiD阻拦了zcw ...