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

举报
孙小北 发表于 2022/01/23 23:45:50 2022/01/23
【摘要】 对下面这段代码进行分析编译运行的结果是:A、编译错误   B、编译成功,运行时程序崩溃     C、编译运行正常,输出10class A{ private: int value; public: A(int n){ value = n; } A(A other){ value = other.value; } void Print() {cout<...

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

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的拷贝构造函数。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。