筆記:C++程式設計Ⅱ
筆記:C++程式設計Ⅱ
conversion function.轉換函式
operator double()函式無返回值,返回值為double,可將Fraction型別轉換為double型別。
non-explicit-one-argument ctor
執行+操作符時,會將4轉換為Fraction型別,呼叫成員方法operator+
編譯器執行+操作符時,既可以將f轉換為double型別,有可以將4轉換為Fraction型別,呼叫成員方法operator+,存在二義性,編譯器會報錯。
explicit-one-argument ctor
會報錯是因為先將f轉化為double型別,再與4相加,得到4.6,而double型別無法轉化為Fraction型別(已申明explicit)。
關鍵字explicit,可以阻止不應該允許的經過轉換建構函式進行的隱式轉換的發生,宣告為explicit的建構函式不能在隱式轉換中使用。
Pointer-like classes
過載了操作符*和->,讓這個類使用起來像指標一樣,有一點需要注意,操作符->在嗲用的時候其實需要兩個:sp->->method(),可以理解為編譯器在這裡做了優化,呼叫->操作符時,不會消耗掉該操作符。
function-like classes(仿函式)
通過過載operator(),使該類使用起來像函式一樣。
member template 成員模板
在模板類內部,可以擁有其他的成員模板。
specialization 模板特化
對於模板類,在一些特殊情況下,可能有更好的處理方式處理,採用特化的,當有特化版本,且資料型別匹配時,會優先呼叫模板特化。
partial specialization 模板偏特化(個數的偏)
比如,當vector傳入的資料型別為bool時,不一定需要一個1位元組的大小來儲存,可以只用1bit來儲存,所以有個上述特化,採用Bitmap來作為實際的實現方式,更加節約記憶體。
partial specialization 模板偏特化(範圍的偏)
當傳入型別為指標的時候,呼叫class C<T*>。
reference
reference一般不用於引數的申明,而用於引數型別和返回型別的描述
注意:
double func(const double& im)
double func(const double im)
以上兩個函式並不構成過載,二者不能同時存在。
vptr和vtbl
每一個含有虛擬函式的類,頭部會有一個指向虛擬函式表vtbl的虛指標vptr,虛擬函式表vtbl是分佈構建了,所以切勿在建構函式裡面使用虛擬函式,可能會導致呼叫錯誤。虛擬函式表構建完成後,才能實現正確的呼叫,本質就是(*(p->vptr)[n])(p),這就是多型的本質。
談談const
之前談過引用並不能構成過載,而const構成過載,當成員函式const和non-const時,const物件只能呼叫const函式。
********