1、不想使用編譯器自動生成的函數,就該明確拒絕
若沒有自定義的構造,拷貝構造,operator=,編譯器會自動產生一份默認的,默認產生的權限都是public的,如果程序中不想用到拷貝等操作,可以自定義一份private權限的。
2、多態基類的析構函數聲明爲virtual
1.具有多態性質的base class,應該聲明一個virtual析構函數,如果class中帶有任何virtual,析構都應該聲明爲virtual。
2.如果不是用於多態情況,或者作爲base class使用,不應該聲明爲virtual。
3、絕不在構造和析構過程中調用virtual函數
在多繼承情況下,都在構造函數中調用虛函數,在構造派生類時,派生類還未構造完成,所以把基類當成派生類了。
4、令operator=返回一個 reference to *this
calss test
{
public:
test &operator=(const test &src)
{
'''
return *this;
}
};
可以用於連鎖形式
test a,b,c,d;
d = c = b = a;
但是在處理時還應該注意自賦值問題;
calss test
{
public:
test &operator=(const test &src)
{
if(this == &src)
return *this;
''''''
return *this;
}
test(const test &src)
{
//拷貝構造一定要傳遞引用==》防止遞歸構造
}
};
5、new 和 delete採用相同的形式
new一個單一對象時,用delete刪除對象;
new一個數組時(自定義類型),new[ ] 刪除時 也同樣要 delete[ ],因爲在new時,會在數組前提供一個記錄對象個數的元素。
以獨立語句將newed 的對象置入智能指針中,防止拋出異常時察覺不到內存泄漏。
6、傳遞對象至函數中,用引用
傳遞對象參數時用引用,可以減少形參到實參的構造,析構等操作,提高效率。
但是內置類型以值傳遞更快。