1 在基類構造函數期間,虛函數還不是虛函數,即若是在基類構造函數中調用虛函數,結果調用的是基類的虛函數,而不會調用到派生類的。
2 一旦派生類的構造函數開始執行,對象內的派生類成員變量便呈現出未定義值,因此C++會認爲這些派生類成員彷彿已再也不存在了,當進入 基類的析構函數中後,對象就成爲一個基類對象,此時,C++的其它部分,包括虛函數,dynamic_cast等也都這麼看待該對象。
3 能夠合理假設按值傳遞的代價並不昂貴的惟一對象就是內置類型,STL的迭代器和函數對象,其它類型儘可能使用按引用傳遞。
4 C++中,調用者可以使用成員函數返回的某個成員的引用來改變該成員的值,即便該成員是私有的。
5 C++中,虛函數是動態綁定,而其缺省參數的值是靜態綁定,因此,毫不要從新定義繼承來的虛函數的缺省參數值。
6 理論上,編譯器要求每個變量都要有定義,若是是靜態成員,除了在頭文件中聲明外,還要在源文件中定義,有一個例外:若是靜態成員是整型(如int, bool, char),那麼能夠在聲明時提供初始值,而且不會取該成員的地址,那麼就不須要在源文件中提供定義了。
7 取enum類型和宏的地址是不合法的,定義enum類型和宏不會致使內存分配。
8 const vector<int>::iterator iter, iter是迭代器常量,不能改變iter,但能夠改變iter指向的值 vector<int>::const_iterator iter,iter是常量迭代器,能夠改變iter,但不能夠改變iter指向的值
9 若是函數的返回類型是內置類型,那麼改動函數返回值歷來就不合法。例如fun() = 1;
10 應避免const成員函數返回非const引用,由於這樣可能會致使返回值被修改,若是返回值是成員變量或成員變量的一部分,實際上改變的就是對象內部數據。例如,下面的操做實際就把text[0]的值修改爲了'K',雖然不是GetChar()函數自己修改的,可是因爲返回的是非const引用,致使調用該函數的語句塊能夠改變對象成員的值:函數
class A { char text[10]; char& GetChar(int i) const{ return text[i]; } } A a; strcpy(a.text, "Hello"); char* pch = &(a.GetChar(0)); *pch = 'K';