拷贝构造函数

拷贝构造函数的调用

四种情况下会调用拷贝构造函数
1.初始化

void main()

{

    A a1;

    A a2 = a1;//调用copy构造函数

    a2 = a1;//浅copy,不会调用copy构造函数

}

2.初始化

void main()

{

    A a1;

    A a2(a1);//调用copy构造函数

}

3.函数值传递


void f(A p)

{...}



void main()

{

    A a;

    f(a);//a实参去初始化形参p,会调用copy构造函数

}

4.返回匿名对象


A g()

{

    A a;

    return a;.//先调用copy构造函数,用a对象创建了一个匿名对象;再执行a的析构函数(因为a为局部对象)

}



void main()

{

    A a0;

    a0 = g();//匿名对象浅copy给a0,匿名对象被析构

    A a1 = g();//匿名对象直接去初始化a1,不会调用copy构造函数(此时c++编译器直接把匿名对象转成a1)

}

注意

  1. 只有一个对象对另一个同类型的对象进行初始化才会调用拷贝构造函数,但是匿名对象对另一个同类型的对象初始化不会调用拷贝构造函数,因为c++编译器对这种情况进行优化,直接将匿名对象转化为该对象,不需要进行额外的内存分配,提高了效率;

  2. 如果匿名对象对另一个同类型的对象赋值(非初始化),则匿名对象赋值给另一个对象后,匿名对象会被析构。

  3. 如果参数是引用传递,则不会调用任何构造函数;如果是按值传递,则调用复制构造函数,按参数的值构造一个临时对象,这个临时对象仅仅在函数执行是存在,函数执行结束之后调用析构函数。

原文链接: https://www.cnblogs.com/hunter-w/p/13260159.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    拷贝构造函数

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/363340

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 下午2:53
下一篇 2023年3月2日 下午2:54

相关推荐