在使用變數時不進行初始化是不好的行為,在程式中有可能讀入乙個未初始化的值就可能導致程式崩潰。
對於內建型別,保證在使用物件之前進行初始化:
int x = 0;
const
char* text = "a c-style string"
double d;
std::cin >> d;
對於結構體成員的初始化,要區別初始化和賦值的區別:
class phonenumber
//這裡是賦值不是初始化
phonenumber():name(0),number(0){} //這裡才是初始化(成員初值列)
};
在c++中,物件的成員變數的初始化動作發生在進入建構函式本體之前,上面利用成員初值列的方法初始化的效率較高,同時不浪費default建構函式做的一切
另外一種情況,c++對「定義於不同編譯單元內的non-local static物件」的初始化相對次序並無明確定義。也就是如果某編譯單元內的某個non-loacl static物件的初始化動作使用了另乙個編譯單元內某個non-local static物件,而它所用到的這個物件可能尚未被初始化,如果出現這種情況,那麼問題是致命的。
解決這個的方法就是將每個non-loacl static物件搬到自己的專屬函式內(該物件在此函式內被宣告為static)。這些函式返回乙個reference指向它所含的物件。然後使用者呼叫這些函式,而不直接指涉這些物件。這個手法的基礎在於:c++保證,函式內的local static物件「會在該函式被呼叫期間」、「首次遇上該物件之定義式」時被初始化:
class filesystem;
filesystem& tfs() //這個函式用來替換tfs物件;它在filesystem class
class directory;
directory::directory(params)
directory& temdir() //定義temdir物件為「函式物件」
如此,在呼叫temdir物件時,c++會對tfs進行初始化,並對temdir也進行初始化
空類並不是空類,c++編譯器會自動為其宣告乙個copy建構函式、乙個copy assignment操作符和乙個析構函式,如果你沒有宣告任何建構函式,那麼編譯器也會為你宣告乙個default建構函式(這些函式都是public且inline的)。
這些會引起一些比較容易忽視的問題:比如通過copy assignment操作符去給乙個類賦值乙個擁有不能進行賦值成員的類時會引起編譯器的警告(類中有引用成員,將這個類用過=號賦予給另乙個類時會出現錯誤,因為c++不允許reference改變指向物件)
解決這個「麻煩」的方法,即不想使用編譯器自動生成的函式。手動宣告copy建構函式和copy assignment操作符,將其為private:
class uncopyable
~uncopyable(){}
private:
uncopyable(const uncopyable&);
uncopyable& operator=(const uncopyable&);
};class homeforsale:private uncopyable;
這樣,任何想嘗試拷貝homeforsale物件的行為編譯器會進行報錯。
析構函式絕對不要吐出異常。如果乙個被析構函式呼叫的函式可能丟擲異常,析構函式應該捕捉異常,然後吞下他們(不傳播)或者結束程式;
如果客戶需要對某個操作函式執行期間丟擲的異常做出反應,那麼class應該提供乙個普通函式(而非在析構函式中)執行該操作。
class accesslevels
void setreadwrite(int
value)
int getreadwrite() const
void setwriteonly(int
value)
private:
int noaccess; //對此int無任何訪問
int readonly; //對此int做唯讀訪問
int readwrite; //對此int做讀寫訪問
int writeonly; //對此int做只能寫訪問
};
寫成上述這樣是值得建議和安全的,有以下好處:
1、完美的封裝性,不管你的成員變數以後怎麼變使用者都不會知道;
2、可以為「所有可能的實現」提供彈性。
類中所有的成員變數都應該為private,不管是public還是protected都是不安全的,因為乙個可以被所有人訪問,另乙個可以被所有「親戚」訪問,protected相比較public並不具有多好的隱秘性。
Effective C 筆記簡易總結以及程式演示
在使用變數時不進行初始化是不好的行為,在程式中有可能讀入乙個未初始化的值就可能導致程式崩潰。對於內建型別,保證在使用物件之前進行初始化 int x 0 const char text a c style string double d std cin d 對於結構體成員的初始化,要區別初始化和賦值的...
Effective C 學習筆記
學習effective c 已經有相當長的一段時間了,今天抽出時間又堵了一遍第一部分 c語言 c 以c語言為基礎,幾乎支援所有的c語言成分,例如區塊 語句 預處理 內建資料型別 陣列 指標等,c語言的侷限是 沒有模板 沒有異常 沒有過載 物件導向的c 也就是加上了物件特性的c,類 封裝 繼承 多型 ...
Effective C 學習筆記
1 c 是乙個複合式的語言 c 中不同部分有著不同的語言特性,例如 1.1 在c中傳遞形參時,按照值傳遞比按照指標傳遞效率更高 1.2 在物件導向程式中,物件要按照const引用而不是按照值傳遞 1.3 在stl程式設計中採取按照值傳遞方式 所以說c 中沒有統一的準則,要按照不同的特性採取不同的使用...