养浩然之气,做博学之人
对下面这段代码进行分析编译运行的结果是:
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
编辑:孙小北
本文地址: https://www.xiaowangyun.com/wyblog/detail/?id=172
版权归属: www.xiaowangyun.com 转载时请以链接形式注明出处
0 条评论