临时对象与拷贝构造函数

来源:互联网 发布:mac apache 目录 编辑:程序博客网 时间:2024/06/04 20:06

百度百科:拷贝构造函数
拷贝构造函数,是一种特殊的构造函数,它由编辑器调用来完成一些基于同一类的其他对象的构建及初始化。其唯一的参数(对象的引用)是不可变的(const类型)。此函数经常用在函数调用时用户定义类型的值传递及返回。拷贝构造函数要调用基类的拷贝构造函数和成员函数。如果可以的话,它将用常量方式调用,另外,也可以用非常量方式调用。

 一直认为对象初始化 函数值传参 函数值返回 是调用拷贝构造函数的。现在感觉理解片面,没理解问题的根源。拷贝构造函数的调用和临时对象初始化脱离不了关系。

对象以自己为拷贝进行初始化的时候调用会调用以自身类型为参数类型的构造函数,也就是拷贝构造函数。

函数值传参,值返回的时候会产生临时对象,临时对象会以原来的对象进行初始化工作。

所有以上三种情况调用拷贝构造函数是因为对象以自身为拷贝进行初始化或临时对象以自身为拷贝进行初始化导致的。

另外,还要注意C++的重载与隐藏规则对构造函数定义产生的影响。

 

除了传参和返回值产生临时对象,隐式转换、无名对象也会产生临时对象,调用的是相应的构造函数初始化。

 

class BB  {  public:      ~BB(){ ;}    };    // 经测试 拷贝构造函数是构造函数中的一种,const Class& objSelf 是一个默认的版本 ,编译器一定会默认生成的   // 初始化时候(包括临时对象的初始化:传参 返回值 -以自身作为参数构造 ) 可能以自身作为参数构造,只要相应的构造函数满足条件,就会调用   //这也就是赋值 函数传参 函数返回值 会调用拷贝构造函数。   //隐式转换会产生临时对象 这种临时对象初始化时调用符合传参的构造函数,而不是拷贝构造函数。   //无名对象会产生临时对象   //函数的值传参 值返回会产生临时对象   class AA  {  public:      AA(){ ; }      ~AA(){};        AA( const AA& aa , int nn = 100 )       {           int n = 100;      }        AA(  const BB& aa ) //这个也可能发生在传参和返回值时的隐式类型转换 ,不会再调用const Class& objSelf 版本的拷贝构造函数       {                   //这种构造函数容易和强转重载 发生二义性           ;      }                   //参数仅仅以const修饰作为重载会产生调用不明确   };    AA test_bb( AA a )  {      BB b;      return b;  }  //////////////////////////////////////////////////////////////////////////     void main()  {      {  //      AA a = AA(); //产生临时对象   //      AA ab = BB();   //      BB bb;           AA a1;          AA a2 = a1;  //      //AA aa = bb;           test_bb(a1);            int n = 10;      }  }