第5條 泛型性的風味之一:基礎
1c++模板提供了編譯期多型的能力
說到物件導向特性之一「多型」,通常指常規的多型,即通過虛函式實現的「動態多型」或者叫」執行期多型「,而該條款說的模板提供的「編譯期間多型」,也可以叫「靜態多型」。
首先介紹下執行多型
執行多型可以簡單地概括為「乙個介面,多種方法」,程式在執行時才決定呼叫的函式,它是物件導向程式設計領域的核心概念。
c++多型性是通過虛函式來實現的,虛函式允許子類重新定義父類宣告為virtual成員函式或析構函式(為了當用乙個基類的指標刪除乙個派生類的物件時,派生類的析構函式會被呼叫。)注:
建構函式不能是虛函式
順便說下
成員函式的過載(overload)、覆蓋(override)與隱藏(hidden)過載
相同的範圍(在同乙個類中)
函式名字相同
引數不同
virtual 關鍵字可有可無
覆蓋(派生類函式覆蓋基類函式)
不同的範圍(分別位於派生類與基類)
函式名字相同
引數相同
基類函式必須有 virtual 關鍵字
隱藏(派生類的函式遮蔽了與其同名的基類函式)
如果派生類的函式與基類的函式同名,但是引數不同。此時,不論有無 virtual 關鍵字,基類的函式將被隱藏(注意別與過載混淆)
如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有 virtual關鍵字。此時,基類的函式被隱藏(注意別與覆蓋混淆)
多型與非多型的實質區別就是函式位址是早繫結還是晚繫結。如果函式的呼叫,在編譯器編譯期間就可以確定函式的呼叫位址,並生產**,是靜態的,就是說位址是早繫結的。而如果函式呼叫的位址不能在編譯器期間確定,需要在執行時才確定,這就屬於晚繫結。
#include using namespace std;
class demoone
void g()
// other functions...
};class demotwo
void g(double a=1.12,double b=1.123)
// other functions...
};templatevoid h(t& t)
int main()
第7條 為什麼不特例化函式模板
1 c++主要有哪兩種形式的模板,他們分別如何進行特例化
c++有類模板和函式模板之分。這兩種模板的工作方式也不完全一樣,最明顯的區別就在於過載,普通的c++類是不能進行過載的,因此類模板也不能進行過載。另一方面,在同一作用域內,普通的c++函式如果名字相同,引數列表不同就會發生過載,因此函式模板也執行過載。
首先說明下什麼事特例化
當特例化乙個函式模板時,必須為原模板中的每個模板引數都提供實參。使用關鍵字template後跟乙個空尖括號<>,即template <>
,以指出我們正在特例化乙個模板。
template void fun(t a)
template <> // 對int型特例化
void fun(int a)
int main()
結果如下:the main template fun(): a
specialized template for int type: 10
the main template fun(): 9.15
對於除int型外的其他資料型別,都會呼叫通用版本的函式模板fun(t a)
;對於int型,則會呼叫特例化版本的fun(int a)
。注意,
乙個特例化版本的本質是乙個例項
,而非函式的過載。因此,特例化不影響函式匹配。
除了特例化函式模板,我們還可以
特例化類模板
。下面是乙個簡單的例子:
template class test
};
template<> // 對int型特例化
class test
};
int main()
結果如下:
specialized template object
general template object
general template object
另外,與函式模板不同,類模板的特例化不必為所有模板引數提供實參。我們可以只指定一部分而非所有模板引數,這種叫做類模板的
偏特化或
部分特例化(partial specialization)
。例如,c++標準庫中的類vector的定義:
template class vector
;
// 部分特例化
template class vector;
在vector這個例子中,
乙個引數被繫結到bool型別,而另乙個引數仍未繫結需要由使用者指定
。注意,乙個類模板的部分特例化版本仍然是乙個
模板,因為使用它時使用者還必須為那些在特例化版本中未指定的模板引數提供實參。
類模板可以被偏特例化或全特例化,函式模板則只能夠被全特例化,不過函式模板可以被過載,所以我們可以通過過載也能達到類似偏特例化的效果
Exceptional C 學習筆記1
第一條 vector的使用 1 v i 與 v.at i 這個知識點主要是講用和at訪問vector元素的區別。如果的話,因為標準並沒有要求它做範圍檢查,所以效率較高,但訪問越界不會丟擲異常,可能會產生未定義行為。如果是用at的話,該成員函式會進行下標越界檢查,所以越界時會丟擲異常out of ra...
C Primer Chapter One學習筆記
筆記 1.流 從io裝置上讀入或寫出的字串行,用來說明字元隨時間順序生成或消耗。2.輸入輸出符可連用原因 operator 或operator 返回stream物件。3.要測試程式那個語句出錯,使用cout 4.新建乙個內建型別,如int i 0 最好先初始化,不然用到的時候沒初始化會產生奇怪的錯誤...
BroadcastReceiver學習筆記
需要注意 的是,不要在 onreceive 方法中新增過多的邏輯或者進行任何的耗時操作,因為在廣播接收 器中是不允許開啟執行緒的,當 onreceive 方法執行了較長時間而沒有結束時,程式就會報錯。有序broadcast,sendorderedbroadcast intent,null abort...