C++ 中的拷贝(复制)构造函数与 = 运算符

使用拷贝构造函数的五种情况:

               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】免费获取数百本计算机经典书籍

    C++ 中的拷贝(复制)构造函数与 = 运算符

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

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

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

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

(0)
上一篇 2023年2月10日 上午4:39
下一篇 2023年2月10日 上午4:40

相关推荐