使用拷贝构造函数的五种情况:
1 根据另一个同类型的对象显式或者隐式初始化一个对象
2 复制一个对象,将它作为实参传给一个函数
3 从函数返回时复制一个对象
4初始化顺序容器中的元素
5 根据元素初始化列表初始化数组元素
临时对象的问题:
在使用一个临时对象( 可能是无名对象 或者 返回对象值时 ) 创建构造另一个对象的过程的中,c++会优化掉该临时对象的产生,直接以相同参数调用相关构造函数构或者 直接调用拷贝构造函数 到 目标对象.
若不是对象创建,而是对象赋值,则在赋值表达式的右值处的临时对象创建不能省略,临时对象赋值给左值后,表达式结束,临时对象被析构。
下面的例子:
class A{
public:
int a;
A(int a):a(a){cout<<"creat A"<<endl;}
A( A &ca){ *this=ca;cout<<"copy A"<<endl;};
};
A f()
{
A a(1);
return a;
}
A g()
{
return A(5);
}
int main()
{
A a=g();
A b=f();
A c=1;
c=g();
c=f();
return 0;
}
对比,对象a初始化时调用个g()有优化。b初始化时,先生通过a拷贝函数生成一个临时对象,然后初始化b。后面c=1的初始化包含一个隐式转换,因为类A有一个包含一个参数的构造函数。
通过实验,在VS和GCC的编译器处理后的结构是不一样的。
原文链接: https://www.cnblogs.com/ysen/p/3232369.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/98258
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!