目录
5、条款9:绝不在构造函数和析构过程中调用virtual函数
6、条款10:令operator=返回一个referece to *this
7、条款11:在operator=中处理“自我赋值” 【补充剑指offer第一题】
1、条款5:了解C++默默编写并调用哪些函数
- 默认构造函数,拷贝构造函数,赋值操作符,以及析构函数。
2、条款6:若不想使用编译器自动生成的函数,就该明确拒绝
class Uncopyable
{
protected:
Uncopyable() {};
Uncopyable() {};
private:
Uncopyable(const Uncopyable&);
Uncopyable& operator=(const Uncopyable&);
};
class HomeForSale :private Uncopyable //copy构造函数和赋值操作符不可以调用,默认的已经不存在
{
};
- 为使得默认的赋值操作符和拷贝构造函数不再被默认创建,可将相应的成员函数声明为private且不予实现。像上述代码示例一样。
3、条款7:为多态基类声明virtual析构函数
- 多态时要把基类的析构函数定义虚析构函数,原因时因为基类指针若指向派生类对象,当释放内存时,若基类不声明为虚析构函数,只会调用基类析构函数,不会释放派生类的内存,从而导致内存泄漏。
- 若不是多态情况下,基类析构函数就不该定义为虚析构函数。
4、条款8:别让异常逃离析构函数
- 析构函数绝对不要吐出异常,若在析构函数中发生了异常,则应该使用try-catch捕捉异常,然后吐下异常或结束程序。
- 如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么class应该提供一个普通函数(而非在析构函数中)执行该操作。
5、条款9:绝不在构造函数和析构过程中调用virtual函数
- 构造函数中不能使用虚函数,原因:基类的构造函数中可能会使用派生类中的虚函数,那么由于此时派生类中的成员对象未被初始化,就会造成错误。
- 析构函数中不能使用虚函数,原因:析构函数可能已经释放了对象的内存,此时若再调用虚函数会出现错误。
6、条款10:令operator=返回一个referece to *this
7、条款11:在operator=中处理“自我赋值” 【补充剑指offer第一题】
CMyString& CMyString::operator = (const CMyString &str)
{
if (this != &str) //判断str是否为this
{
CMyString strTemp(str); //创建str的副本strTemp
char* pTemp = strTemp.m_pData; //交换this和strTemp中的data数据
strTemp.m_pData = m_pData;
m_pData = pTemp;
}
}
8、条款12:复制对象时毋忘其每一个成分
- 创建派生类对象时,派生类的构造函数中记得调用基类构造函数初始化基类成员变量+派生类成员变量。