Effective C++ 條款3
1、在一個函式宣告式內,const可以和函數傳回值、各參數、函數自身(如果是成員函數)產生關聯。
2、許多人漠視一個事實:兩個成員函數如果只是常量性(constness)不同,可以被重載。這實在是一個重要的C++特徵。包括const修飾成員函數本身,或者成員函數的傳回值。
3、const成員函數不可以更改對象內任何non-static成員變數。
4、在一個成員函數裡,static_cast<char&>(static_cast<const TextBlock&>(*this)[position]); 因為static_cast和[]操作符同優先順序,所以結合性決定是先進行那個運算,因為它們的結合性都為從左至右,所以cast操作先於[]執行。
5、編譯器強制實施bitwise constness(事實上的常量性),但你編寫程式時應該使用“概念上的常量性”。後者是說const成員函數有時可以更改某些成員變數,這些需要被const成員函數更改的變數就可以聲明為mutable。(P23 effective C++)。
Effective C++ 條款4
1、永遠在使用對象之前先將它初始化。對於任何類成員的內建類型,你必須手工完成此事。至於內建類型以外的任何其他東西,初始化責任落在建構函式身上。規則很簡單:確保每一個建構函式都將對象的每一個成員初始化。即使成員是內建類型,你也需要在成員初始化列表裡面將其初始化,因為有的時候如果內建類型是const或者reference,他們就必須初始化,而不能被賦值。
2、因為vector、list、deque等順序容器是模板類,一旦制定了其儲存的類型,如list<int> myList; 那麼myList就是一個類的對象了。自然就可以直接用來對另一個類型相同的list賦值。如,list<int> hisList = myList;調用的是類的copy建構函式?
3、C++有著十分固定的“成員初始化次序”。次序總是相同的:base classes更早於derived classes,而class的成員變數總是以其聲明次序被初始化。
Effective C++ 條款5、6
1、什麼時候empty class(空類)不再是個空類呢?當C++處理過它之後。是的,如果你自己沒有聲明,編譯器就會為它聲明(編譯器版本的)一個copy建構函式、一個copy assignment操作符和一個解構函式。此外如果你沒有聲明任何建構函式,編譯器也會為你聲明一個default建構函式。所有這些函數都是public且inline。注意,惟有當這些函數被需要(被調用),它們才會被編譯器建立出來。
2、注意copy建構函式和copy assignment操作符的形參都有const限定,並且都是引用。copy assignment操作符返回自身的引用。
3、有的時候,編譯器會拒絕為類產生copy assignment操作符:
一,內含reference成員或者const成員的類。
二,如果某個base classes將copy assignment操作符聲明為private,編譯器拒絕為其derived classes產生一個copy assignment操作符。畢竟編譯器為derived class 所生的copy assignment操作符想象中可以處理base class成分,但它們無法調用derived class無權調用的成員函數。
4、有的時候某些類的對象沒有相同的對象。如房子HomeForSale類。所以有必要禁止這樣的類被複製。也就是禁止編譯器為這樣的類自動產生copy建構函式、copy assignment操作符。為實現這個功能,可以將相應的函式宣告為private並且不予實現。連空函數體都不必要,只需要在類定義中將方法聲明為private,並且沒有必要寫出形參的名稱。一般而言,這個方法並不絕對安全,因為menber函數和friend函數還是可以調用你的private函數。C++ iostream庫中的類使用這個方法來阻止copy行為。
除此之外,還有一個方法:定義一個輔助基類Uncopyable,其中將它的copy建構函式和copy assignment操作符聲明為private,可以不予實現(不定義)。