Effective C++是copy constructor 还是 copy assignment(“=”)的判断

copy 构造函数被用来“以同型对象初始化自我对象”。 copy assignment(当然冲在了=) 被用来“从另一个同型对象中拷贝其值到自我对象”。

例如下例:

class Wiget {
   public:
      Widget(); // default constructor
      Widget(const Widget& rhs);
      Widget& operator=(const Widget& rhs);
      ...
};


Widget w1; // 调用default constructor
Widget w2(w1); // 调用copy constructor
w1 = w2; // 调用copy assigment operator, 因为w1, w2 构建出出来了

但是, 当你看到赋值符号的时候, 必须小心。 因为“=”语法也可以用来调用从copy constructor:

Widget w3 = w2; // 调用赋值构造函数, 因为w3 是一个新定义的对象。

幸运的是, “copy 构造” 很容易和“copy 赋值”区分开来。 如果一个新对象被定义式, 一定会有一个构造函数被调用(如w3), 不可能调用赋值操作, 如果没有新对象定义, (例如前面的w1 = w2), 就不会有构造函数被调用。 当然就是赋值操作。

NOTE: 关于构造函数, 也可以按照如下调用:

Widget w4 = Widget();


Copy 构造函数非常重要, 因为当该类对象需要pass by value作为参数传递给函数(形参 )的时候, 这个将实参复制给形参就需要通过copy 构造函数完成。 例如:


bool hasAccepted(Widget w);
............

Widget aWidget;
if(hasAccepted(aWidget))....

参数w 是以pass by value 的方式传递给函数hasAccepted, 所以上述调用中, aWidget被复制到w体内, 这个复制动作需要有Widget 的复制构造函数完成。 “pass by value” 意味着调用复制构造函数。 以by value 的方式传递用户自定义类型通常是一个坏主意,  pass-by-reference -to-const往往是一个很好地选择。


 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值