#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(){}
};
effective c++ 05,06,07
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.