2018-03-09 孙小北

剑指offer题目c++中不允许复制构造函数传值参数的理解

养浩然之气,做博学之人

对下面这段代码进行分析编译运行的结果是:

A、编译错误   B、编译成功,运行时程序崩溃     C、编译运行正常,输出10

class A{  
private:  
    int value;  
public:  
    A(int n){ value = n; }  
    A(A other){ value = other.value; }  
    void Print() {cout<<value<<endl; }  
};  
int main(void)  
{  
    A a = 10;  
    A b = a;  
    b.Print();  
    return 0;  
}

答案:A、编译错误。复制构造函数A(Aother)传入的参数是A的一个实例。由于是传值参数,我们把形参复制到实参会调用复制构造函数。因此如果允许复制构造函数传值,就会在复制构造函数内调用复制构造函数,就会形成永无休止的递归调用从而导致栈溢出。C++的标准不允许复制构造函数传值参数,只能将构造函数修改为A(const A& other),也就是把传值参数改为常量引用。(注意:传指针也是不可以的,只能改为引用)。拷贝构造函数的参数使用引用类型不是为了减少一次内存拷贝,而是避免拷贝构造函数无限制的递归下去。

下面这几种情况下会调用拷贝构造函数

(1)显式或隐式地用同类型的一个对象来初始化另外一个对象。如上例中的CExample ccc = aaa;

(2)作为实参传递给一个函数。如上例中的bbb.myTestFunc(aaa);

(3)在函数体内返回一个对象时,也会调用返回值类型的拷贝构造函数

(4)初始化序列容器中的元素时。比如vector<string> svec(5),string的缺省构造函数和拷贝构造函数都会被调用。

(5)用列表的方式初始化数组元素时。string a[] = {string(“hello”),string(“world”)};会调用string的拷贝构造函数。


参考:剑指Offer

关于c++中不允许复制构造函数传值参数的理解:http://blog.csdn.net/xiaoquantouer/article/details/70145348

编辑:孙小北

本文地址: http://www.xiaowangyun.com/wyblog/detail/?id=172

版权归属: www.xiaowangyun.com   转载时请以链接形式注明出处

物以类聚

最新评论

2017-10-06

一辈子不长,只有珍惜了,才不至于后悔。

2017-10-06

懂得感恩,才能走得更远。

标签云

归档

取消

感谢您的支持,您的每一次打赏都是一次鼓励!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦