c++复制构造函数

作者 chauncy 日期 2016-12-09
c++复制构造函数

今天看了effectC++看到了,不知构造函数,就回忆了一下,然后网上看了一些资料,就来总结一下

class Widget  {
      public:
      Widget();   //default 构造函数
      Widget(const Widget & rhs);   //copy 构造函数
      Widget& operator=(const Widget& rhs);  //copy assignment 操作符
      ~Widget{};();
};

Widget w1;       //default 构造函数
Widget w2(w1);  //调用copy构造函数
w1 = w2;        //调用copy assignment操作符

当你看到赋值操作符小心,因为”=”语法可以用来调用copy构造函数

Widget w3 = w1    //copy 构造函数

copy 构造,和copy 赋值,很容易区分,幸好,如果一个新的对象别定义(与上面的w3),则调用copy构造,反之则赋值.看到很多网上的资料都是说,只要一看到对象赋值另外一个同类型的对象,就是copy 构造,这是错误的现在来看

至于我当初学习copy构造的时候,为什么要引用来作为传递了??

传入参数用const类型的引用,可以节省参数赋值的开支,最后赋值给的是this指针指向的对象,复制构造函数会默认的进行简单变量的赋值。
另外重要的原因就是:避免递归调用!
如果定义如下的构造函数:

Widget:: Widget( Widget rhs);

那么当用一个 Widget对象初始化另一个 Widget对象时,如

Widget w4=w4; //假设w4是一个已存在Widget对象

该复制构造函数就会被无限制地递归下去:调用WIdget(Widgetr)