问题:现有类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. C++11_ tuple

    版权声明:本文为博主原创文章,未经博主允许不得转载. tuple 是一个可以装载任何变量的容器,C++11的Variadic Templates给tuple的实现带来了极大方便. tuple的实现基于 ...

  2. Linux下系统的定时及延时任务

    一.系统的延时 是临时的.对系统做的任务指定一个时间点.发起的命令是at at    时间点(now+1min)      ## 设定任务实行时间 at>  执行命令               ...

  3. React之前端路由

    通过之前的博客介绍,对于react,我们已经可以写单个组件.复合组件/单个页面了,接下来就是实现页面的跳转了,这个时候,我们就需要前端路由了. 一.react-router-dom 安装这个依赖,th ...

  4. pytorch在CPU和GPU上加载模型

    pytorch允许把在GPU上训练的模型加载到CPU上,也允许把在CPU上训练的模型加载到GPU上.CPU->CPU,GPU->GPU torch.load('gen_500000.pkl ...

  5. 【排序】归并排序,C++实现

    原创文章,转载请注明出处! 博客文章索引地址 博客文章中代码的github地址 # 基本思想(分治法)       归并排序中, “归”代表递归的意思,即递归的将数组通过折半的方式分离为单个数组. “ ...

  6. [转载][QT][SQL]sql学习记录3_sqlite之update delete like

    转载自:详见 : http://www.runoob.com/sqlite/sqlite-create-table.html 约束表实例 下面是一个实例,它创建了一个 COMPANY 表,ID 作为主 ...

  7. 多态 Java 2015/9/16

    多态:http://www.cnblogs.com/chenssy/p/3372798.html     多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定, ...

  8. javascript的slice()与splice()方法

    (1)数组和String对象都有slice()方法. //Array var list = ['A','B','C','D','DS']; console.log(list.slice(,));//截 ...

  9. UESTC794 Balloon Game 博弈

    题目链接:Balloon Game 题目大意: Alice 和 Bob进行一个博弈游戏,他们要摆放气球,保证颜色一样的气球全部相邻出现,现在在一个序列中气球有一部分已经摆放,还有一些未摆放,用&quo ...

  10. shell编程--遍历目录下的文件

    假定目录text下有如下文件      目录:dir_1.dir_2.dir_3 文件:text_1.text_2 遍历目录下所有的文件是目录还是文件 if -- if类型: #!bin/sh for ...