Effective C++ 第二章总结

目录

1、条款5:了解C++默默编写并调用哪些函数

2、条款6:若不想使用编译器自动生成的函数,就该明确拒绝

3、条款7:为多态基类声明virtual析构函数

4、条款8:别让异常逃离析构函数

5、条款9:绝不在构造函数和析构过程中调用virtual函数

6、条款10:令operator=返回一个referece to *this

7、条款11:在operator=中处理“自我赋值”  【补充剑指offer第一题】

8、条款12:复制对象时毋忘其每一个成分


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:复制对象时毋忘其每一个成分

  • 创建派生类对象时,派生类的构造函数中记得调用基类构造函数初始化基类成员变量+派生类成员变量。

猜你喜欢

转载自blog.csdn.net/qq_33457548/article/details/89639589