effective c++ 05,06,07

#pragma once

#include <string>
using std::string;

/*
     條款05
	 編譯器會爲class自動創建 default構造函數,一個析構函數,一個copy構造函數,一個 copy assignment操作符
*/

/*
	1. 當成員變量有 const 變量, 編譯器無法自動生成default構造函數; 不會自動生成 copy assignment操作符函數
	   必須自己主動添加構造函數和copy assignment操作符函數
	2. 成員變量爲引用時也是如此。
	3. 如果base class將copy assignment操作符聲明爲private, 編譯器將拒絕爲derived class 生成copy assignment操作符
*/
class CTest
{
public:
	CTest(int nVal = 0, double dVal = 0.0):m_nVal(nVal),m_dVal(dVal){}

public:
	const int   m_nVal;

	double     &m_dVal;
};

inline void TestAll()
{
	CTest t1;
}

/*
	條款06 禁止編譯器自動生成函數,可將相應的函數聲明爲private並且不予實現。
*/
class CMyClass
{
private:
	CMyClass(const CMyClass &);                 // 禁止 copy 構造函數

	CMyClass& operator=(const CMyClass &);      // 禁止 copy assignment操作符函數
};

// 方法2
class IUncopyable
{
protected:
	IUncopyable(){}
	~IUncopyable(){}

private:
	IUncopyable(const IUncopyable &);
	IUncopyable & operator=(const IUncopyable &);
};

class CXxx : private IUncopyable
{

};

// 方法3 使用 boost 庫裏面的 nocopyable class

/*
	條款06
	polymorphic base class 應該聲明一個virtual析構函數。如果class帶有任何virtual函數,它就應該擁有一個virtual析構函數。
	class的設計目的如果不是作爲base classes使用,或者不是爲了具備多態性,就不應該聲明virtual析構函數。

*/
class CPure
{
public:
	virtual ~CPure() = 0; // 小技巧,應該在cpp文件中實現該方法; CPure::~CPure(){}
};




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章