9. 若不想使用編譯器自動生成的函數(shù),就該明確的拒絕
#include "stdafx.h"
#include <string>
using namespace std;
class UnCopyAble
{
protected:
UnCopyAble(){}
~UnCopyAble(){}
private:
//放入private,則不允許使用拷貝構(gòu)造和對象間賦值
//即使不慎在 membre或friend中使用,則鏈接通不過。
//原因是只有聲明
UnCopyAble(const UnCopyAble&);
UnCopyAble& operator=(const UnCopyAble &);
};
class HomeForSale : private UnCopyAble //class 不再聲明copy構(gòu)造函數(shù)和賦值重載
{
public:
};
int _tmain(int argc, _TCHAR* argv[])
{
HomeForSale sale1;
//以下將不允許
HomeForSale sale2(sale1);
//以下將不允許
HomeForSale sale3;
sale3 = sale1;
return 0;
}
10.為多態(tài)基類聲明virtual析構(gòu)函數(shù)
總結(jié):帶有多態(tài)性質(zhì)的基類應(yīng)該聲明一個virtual析構(gòu)函數(shù)。如果class帶有任何virutal,它也應(yīng)該擁有一個virtual析構(gòu)函數(shù)。
class設(shè)計目的不是作為基類來使用的,或不是為了具備多態(tài)性,就不應(yīng)該聲明virutal析構(gòu)函數(shù)(一個類如果加入了virutal函數(shù),則類大小
會發(fā)生變化。因為有包含virutal table pointer)。
11. 別讓異常逃離析構(gòu)函數(shù)
析構(gòu)函數(shù)絕對不要吐出異常,這樣會帶來“過早結(jié)束程序”或“發(fā)生不明確行為”。如果一個析構(gòu)函數(shù)可能要拋出異常,析構(gòu)函數(shù)應(yīng)該捕捉任何異常,然后吞下
它,或者結(jié)束程序。如果要在某個函數(shù)運行時拋出的異常做出反應(yīng),那么class應(yīng)該提供一個普通函數(shù)執(zhí)行這個操作。例如下:
class DBConn
{
public:
//供客戶使用的函數(shù)
void Close()
{
db.close();
closed =
true;
}
~DBConn()
{
if(!closed)
{
try
{
db.close();
//關(guān)閉連接,如果客戶不調(diào)用Close的話
}
catch (

)
{
//寫入日志,記下close調(diào)用失敗
}
}
}
private:
DBConnection db;
bool closed;
12. 絕不在構(gòu)造和析構(gòu)過程中調(diào)用virtual函數(shù)
// testss.cpp : 定義控制臺應(yīng)用程序的入口點。
//
#include "stdafx.h"
#include <
string>
#include <list>
using namespace std;
class Transaction
{
public:
Transaction();
void init();
virtual void logTranscation() = 0;
};
Transaction::Transaction()
{
init();
}
void Transaction::init()
{
logTranscation();
}
class BuyTransaction :
public Transaction
{
public:
void logTranscation()
{
printf("BuyTransaction log

\n");
}
};
int _tmain(
int argc, _TCHAR* argv[])
{
BuyTransaction b;
return 0;
}
以上代碼,會有一個BuyTransaction構(gòu)造函數(shù)被調(diào)用,但首先是Transaction更早被調(diào)用。在derived class對象的base class構(gòu)造期間,對象的類型是base class.若使用運行期類型信息,也會把對象視為base class類型。本例,構(gòu)造函數(shù)中調(diào)用init,而init中調(diào)用Transaction::logTransaction。而logTransaction又是抽象方法,導(dǎo)致程序異常中止。當(dāng)然如果非抽象方法,則會調(diào)用Transaction中的logTransaction。
同樣,析構(gòu)函數(shù),一旦derived class析構(gòu)函數(shù)先開始執(zhí)行。對象內(nèi)的derived class成員變量便呈現(xiàn)現(xiàn)未定義值。所以c++視它們不存在。進(jìn)入base class析構(gòu)函數(shù)后對象就成為一個base class對象。
13. 令operator=返回一個reference to *this
14. 在operator=中處理“自我賦值”