Effective C++学习笔记——构造/析构/拷贝运算
2013-10-02 22:58
204 查看
条款9:决不再构造和析构过程中调用virtual函数,包括通过函数间接调用virtual函数。
应用:想在一个继承体系中,一个derived class被创建时,某个调用(例如生成相应的日志log)会有相对应的实现。
原因: base class的构造函数会先被调用,而在base class 构造期间virtual函数绝不会下降到dedrived class阶层。事实上,C++的其它部分(dynamic_cast & typeid),在此期间也是一样的把对象视为base class。
解决办法:籍由”令derived class 将必要的构造信息向上(通过函数参数)传递至base class的构造函数“。可以在dedrived class中定义一个private static函数来得到该构造信息, 定义为static是为了避免使用尚未初始化好的dedrived class 成员。
条款10、11: 令assignment操作符返回一个reference to *this。同时注意在operator=中处理”自我复制“!
说明:operator=要考虑”自我复制安全性“和”异常安全性“。涉及的技术包括:比较”来源对象“和”目标对象“的地址、精心周到的语句顺序、以及copy-and-swap技术。
条款12:复制对象时勿忘其每一个成分
备注:不要尝试以某个copying函数来实现另一个copying函数(copy构造函数,operator=函数)。
应用:想在一个继承体系中,一个derived class被创建时,某个调用(例如生成相应的日志log)会有相对应的实现。
原因: base class的构造函数会先被调用,而在base class 构造期间virtual函数绝不会下降到dedrived class阶层。事实上,C++的其它部分(dynamic_cast & typeid),在此期间也是一样的把对象视为base class。
解决办法:籍由”令derived class 将必要的构造信息向上(通过函数参数)传递至base class的构造函数“。可以在dedrived class中定义一个private static函数来得到该构造信息, 定义为static是为了避免使用尚未初始化好的dedrived class 成员。
条款10、11: 令assignment操作符返回一个reference to *this。同时注意在operator=中处理”自我复制“!
说明:operator=要考虑”自我复制安全性“和”异常安全性“。涉及的技术包括:比较”来源对象“和”目标对象“的地址、精心周到的语句顺序、以及copy-and-swap技术。
class A
{
...
private:
int *p;
}
//1 各种不安全
A& A::operator=(const A& rhs)
{
delete p;
p = new A(*rhs.p);
return *this;
}
//2 语句顺序的改变,带来“自我复制安全”(虽然也许不够高效)与“异常安全”。
A& A::operator=(const A& rhs)
{
pOrig = p;
p = new A(*rhs.p);
delete pOrig;
return *this;
}
//3 copy-and-swap技术
void A::swap(A& rhs)
{
...//交换*this与rhs
}
A& A::operator=(const A& rhs)
{
A temp(rhs);
swap(rhs);
return *this;
}
//4 巧妙伶俐的利用值传递在制造临时副本,即使有可能更为高效(在“函数参数构造”)却牺牲了清晰性。
A& A::operator=(const A rhs)
{
swap(rhs);
return *this;
}
条款12:复制对象时勿忘其每一个成分
备注:不要尝试以某个copying函数来实现另一个copying函数(copy构造函数,operator=函数)。
相关文章推荐
- 计算几何学习笔记之基本运算
- php——学习笔记,算术运算符合字符串运算符
- shell学习笔记之四(整数运算)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.4基本类型与运算(4.4.5-4.4.10)
- 我的php学习笔记(二)php基本数据类型、基本语法和基本运算类型及其应用
- Effective C++学习笔记-内存管理
- python学习笔记——浅拷贝与深拷贝
- 学习笔记2:c++位运算-异或运算
- Adobe FLEX学习笔记(6)- is 运算…
- 抽象代数学习笔记(5) 运算
- Effective C++学习笔记:确定基类有虚析构函数
- c++ primer(第五版)学习笔记及习题答案代码版(第十四章)重载运算与类型转换
- Effective C++学习笔记 (1)
- 透彻了解inline的里里外外——effective c++学习笔记
- 编程学习笔记3--大整数的运算
- Python3学习笔记03-基本数据类型、序列、运算及缩进和选择
- Effective c++学习笔记——条款11:在operateor=中自我赋值
- python学习笔记 1 数学运算
- effective c++学习笔记0
- [C++学习] effective c++ 笔记 pass by value ,pass by reference