Effective C++ 读书笔记(11-17):构造析构和赋值函数
2009-10-14 00:07
387 查看
Item11--如果class内动态置有内存,请为此class声明一个copy constructor和一个assignment运算符
也就是说,class内有一个指针,使用new来动态申请内存的情况下,默认的copy constructor和assignment运算符是浅拷贝(bitwise copy),也即直接拷贝指针的值,可能会有内存泄露的危险String a("hello");{String b("hello");b=a;}当b=a,b原来的内容变成野指针,当b结束作用域后a的内容也被删除。这真是灾难
所以条款11告诉我们:class内有指针需要申请内存,则自己撰写拷贝构造和赋值函数,避免内存泄露和异常。
Item 12 -- 在constructor中尽量以initialization动作取代assignment动作
原因:1,const、reference只能通过初始化列表进行初始化
2,从效率角度。对象的构造分成两阶段:初始化data member(可以根据初始化列表进行,无则初始化为0等默认值),执行被调用的构造函数。所以执行assignment实际执行了两次赋值。
3,基本类型的non-const, non-reference对象,初始化和赋值之间没有2所说的区别
Item 13 -- initialization中的members初始化次序应该和其在class内的声明次序相同
原因也很容易理解:编译器构造和析构的顺序是相反的,编译器不可能针对初始化列表中的顺序进行初始化,否则重载不同初始化顺序的构造函数会让编译器头晕的。编译器内部确定是按照class内的声明次序,如果初始化列表不同,很可能初始化列表的数据会错误。核心:先按class内声明成员默认赋值,然后调用初始化参数列表进行初始化。
Item 14 -- 总是让base class拥有virtual destructor
原因很容易理解:基类指针指向具体派生类,delete基类指针的时候,需要虚函数进行多态。小tip:如果析构函数不是虚的,那么基类和派生类的析构都要调用
,先调用派生,再调用基类
tip2:虚函数要占用class空间,要综合考量
Item 15 -- 令operator= 传回"*this的reference"
原因:objA = objB = objC这种连续的重载=号行为e.g.
String& String::operator =(const String&rhs) { … return *this; } |
Item16-- 在operator=中为所有的data members设定(赋值)内容
原因:编译器会默认为你生成一个operator=,采用bitwise,所以最好都是自己写一个注意点:继承机制的引入,Base中的私有成员Derived对象无法访问
要么 Base::operator=(rhs),要么staqtic_cast<Base&>(*this) = rhs两种方式解决
Item17 -- 在Operator=中检查是否"自己赋值给自己"
一般采用的方法:C& C::operator=(const C&rhs) { if(this==&rhs) return * this; } |
相关文章推荐
- effective C++ 读书笔记 条款17 以独立语句讲newed对象置入智能指针
- Effective C++ 读书笔记(17)
- effective C++ 读书笔记(11-28)
- effective C++ 读书笔记 条款11
- 【Effective C++】读书笔记 条款13~条款17
- 读书笔记《Effective C++》条款17:以独立语句将newed对象置入智能指针
- 读书笔记: effective C++ C++ 构造函数和赋值函数的不同, 赋值函数需要释放原有的资源
- effective C++ 11_在operator= 中处理"自我赋值" 读书笔记
- 读书笔记《Effective c++》 条款11 在operator= 中处理“自我赋值”
- effective C++——第二章:构造、析构和赋值(item11~item17)
- Effective C++ 总结3 构造函数,析构函数和赋值操作符 (条款11 - 17)
- effective C++ 读书笔记 条款11
- Effective C++ 读书笔记(11)
- 读书笔记《Effective c++》 条款17 以独立语句将newed对象置入智能指针
- Effective C++ 第二版 17)operator=检查自己 18)接口完整 19)成员和友元函数
- 读书笔记(11) Android的线程和线程池
- 读书笔记《Effective C++》条款21:必须返回对象时,别妄想返回其reference
- 【Effective C++】读书笔记 条款49~51
- 读书笔记《Effective C++》条款28:避免返回handles指向对象内部成分
- 《Beginning Perl》读书笔记4:11~13章