1. 程式人生 > 其它 >筆記:C++程式設計Ⅱ

筆記: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函式。

********