《Effective C++》构造函数析构函数Assignment运算符(二)

2014-11-24 11:37:43 · 作者: · 浏览: 2
rence的方式返回,那么是返回A的引用还是B的引用,毫无疑问是A的,如果是B的,那么执行的顺序是这样的,先将B赋给A,然后将C的值赋给B,赋值其实就是将右边的值赋给左边的返回值吗!这样然不是我们想要的,我想要的其实是将B赋给A,然后将C在赋给A,当然写这样等式的绝对不是一个合格的程序员。所以operator=必须返回左边对象的reference。我一直在想this为什么是一个指针类型而不是一个reference呢?因为我们必须在operator=方法的最后一句加上return *this;而不是 return this;
16:在operator=中为所有data member赋值
这是毫无疑问的,如果有部分data member没有被赋值,那么被赋值的对象不就是残废了的吗!有时候我们可能会在为类加data member的时候忘了再operator=中为它赋值了,或是在子类的operator=中忘了为父类的data member赋值。当然这些都不是重点,不记得不是问题,出错了自然就知道了,为父类的data member赋值只需要在子类的operator=中加上Base::operator=(this);如果编译器不支持调用base的operator=的话,可以做类型转换啊,static_case<&Base>(*this)=Derived;我发现在类型转换中,转换成的类型一般都是指针或是引用,特别是转换类型在左边的时候就一定不能是by value的方式,会产生临时变量,然后给临时变量赋值,当然不是你想要的。在为指针类型的data member 赋值时要记住一点,是为指针所指的对象赋值,而不是为指针赋值,如果你让data member一会儿指向这一会指向那的,可能会出现某些地址不可到达而出现内存泄露。
17:在operator =中检查是否自己赋值给自己
在为一个对象赋值之前,先要确认这个对象是否动态配置内存,如果动态配置内存,先要回收掉这块内存,不然当这个对象被赋值,指向别的地址后就会出现内存泄露,当然也不能一发现它动态配置内存了就把它先回收掉,因为可能出现把自己赋给自己的情况,你总不能因为把自己赋给自己之后,自己就莫名其妙的被回收了吧,所以在operator=中药检查是否自己赋值给自己。