effective c++閱讀筆記

拷貝構造函數:以同型對象初始化自我對象
People p;
People p2§;
People p3=p; p2,p3都是調用拷貝構造函數,因爲都是用p初始化p2,p3
賦值構造函數:從另一個同型對象中拷貝其值到自我對象
People p4; 這裏已經初始化了
p4=p3; 賦值構造函數

當一個對象作爲一個函數實參傳遞時,調用拷貝構造函數,當自定義類型作爲參數時,最好使用引用傳遞。

條款2:儘量以const,enum,inline 替換#define
對於形似函數的宏,最好以inline函數替代#define
當調用宏名出錯時,你將很難找到錯誤的來源,因爲宏名不會進入符號表,並且預處理器進行替換時,可能會出現多份相同的數據,增加了代碼量

class People{
private:
static const int num=5; //常量聲明式
int age;
double height;
}
類中的式子僅爲聲明,定義在類外
const int People::num; //定義式,此時不可以再設初值
條款3:儘可能使用const
const char * p; p指向的內容不能變
char * const p; p不能變
const char * const p; p指向的內容不能變,p不能變
條款4:確定對象被使用前已先被初始化
在使用對象之前手動將其初始化,對於自定義類型,要使用構造函數初始化對象的每一個成員,最好使用成員初值列來初始化成員
People(int valage,double valheight):age(valage),height(valheight){}
條款5:瞭解c++默默編寫並調用哪些函數
當類中含有引用類型成員時,不會自動生成copy assignment函數,需要自己定義
條款6:若不想使用編譯器自動生成的函數,就該明確拒絕
如果不想使用或不需要copy和copy assignment函數,需要自己定義這兩個函數,並且聲明爲private,函數體要爲空。還可以定義一個基類,在基類中定義這兩個函數,聲明爲private,函數體要爲空(或只聲明),然後繼承這個基類。
條款7:爲多態基類聲明virtual析構函數
只有當class類中至少含有一個virtual函數,才能爲它聲明virtual析構函數
條款8:別讓異常逃離析構函數
析構函數不要吐出異常。如果一個被析構函數調用的函數可能拋出異常,析構函數應該捕捉任何異常,然後吞下他們(不傳播)或結束程序
如果客戶需要對某個操作函數運行期間拋出的異常做出反應,那麼class應該提供一個普通函數(不在析構函數中)執行該操作。
條款9:絕不在構造和析構過程中調用virtual函數
在base class構造期間,virtual函數不是virtual函數,即不會發生動態綁定,只會調用基類的版本
條款10:令operator=返回一個 reference to *this
賦值操作符都應該如此 +=,-= …
條款11:在operator=中處理自我賦值
在operator=中最前面加入證同測試:
if(this==b) return *this;
else …
或者用中間值將其保存起來,若沒有異常則賦值
或者使用copy and swap技術:
void swap(People &b)
People & operator=(const People &a){
People tmp(a);
swap(tmp);
return *this;
}
People & operator=(const People &a){
swap(a); //值傳遞
return *this;
}

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