2023年全國(guó)碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩34頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、泛型程序設(shè)計(jì)與模板,C++程序設(shè)計(jì)任建吉,函數(shù)模板,Generic Programming (泛型程序設(shè)計(jì))算法實(shí)現(xiàn)時(shí)不指定具體要操作的數(shù)據(jù)的類型 泛型 — 算法實(shí)現(xiàn)一遍 適用于多種數(shù)據(jù)結(jié)構(gòu) 優(yōu)勢(shì): 減少重復(fù)代碼的編寫 大量編寫模板, 使用模板的程序設(shè)計(jì) ? 函數(shù)模板? 類模板,函數(shù)模板,為了交換兩個(gè)int變量的值, 需要編寫如下Swap函數(shù): void Swap(int & x, int & y)

2、{ int tmp = x; x = y;y = tmp; },函數(shù)模板,為了交換兩個(gè)double型變量的值, 還需要編寫如下Swap 函數(shù): void Swap(double & x, double & y) { double tmp = x; x = y;y = tmp; },能否只寫一個(gè)Swap, 就 能交換各種類型的變量?,函數(shù)模板,用 函數(shù)模板 解決template 返回值類型 模

3、板名 (形參表) { 函數(shù)體 },函數(shù)模板,交換兩個(gè)變量值的函數(shù)模板 template void Swap(T & x, T & y) { T tmp = x; x = y;y = tmp; },函數(shù)模板,函數(shù)模板定義,編譯器由模板自動(dòng)生成函數(shù)的過程,稱為模板的實(shí)例化。由模板實(shí)例化而得到的函數(shù),稱之為模板函數(shù),函數(shù)模板,函數(shù)模板中可以有不止一個(gè)類型參數(shù) template T2 print(T

4、1 arg1, T2 arg2){ cout<< arg1 << " "<< arg2<<endl; return arg2; },函數(shù)模板,求數(shù)組最大元素的MaxElement函數(shù)模板 template T MaxElement(T a[], int size) //size是數(shù)組元素個(gè)數(shù) { T tmpMax = a[0];for( int

5、i = 1; i < size; ++i ) if( tmpMax < a[i] ) tmpMax = a[i]; return tmpMax; },函數(shù)模板,函數(shù)模板可以重載, 只要它們的形參表不同即可 例, 下面兩個(gè)模板可以同時(shí)存在: template void print(T1 arg1, T2 arg2) { coutvoid print(T arg1, T arg2) { cout<&

6、lt; arg1 << " "<< arg2<<endl; },函數(shù)模板,C++編譯器遵循以下優(yōu)先順序:Step 1: 先找參數(shù)完全匹配的普通函數(shù)(非由模板實(shí)例化而得的函數(shù))Step 2: 再找參數(shù)完全匹配的模板函數(shù) Step 3: 再找實(shí)參經(jīng)過自動(dòng)類型轉(zhuǎn)換后能夠匹配的普通函數(shù) Step 4: 上面的都找不到, 則報(bào)錯(cuò),函數(shù)模板,例: 函數(shù)模板調(diào)用順序 template

7、 T Max(T a, T b){ cout T Max(T a, T2 b){ cout << "Template Max 2" <<endl; return 0; },函數(shù)模板,函數(shù)模板,賦值兼容原則引起函數(shù)模板中類型參數(shù)的二義性templateT myFunction(T arg1, T arg2) {cout<<arg1<<“ ”&l

8、t;<arg2<<“\n”;return arg1; }...myFunction(5, 7); //ok: replace T with intmyFunction(5.8, 8.4); //ok: replace T with doublemyFunction(5, 8.4); //error: replace T with int or double? 二義性,函數(shù)模板,可以在函數(shù)模板中使用多個(gè)類型

9、參數(shù), 可以避免二義性 templateT1 myFunction( T1 arg1, T2 arg2) { cout<<arg1<<“ ”<<arg2<<“\n”; return arg1; } ...myFunction(5, 7); //ok:replace T1 and T2 with int myFunction(5.8, 8.4); //ok: replace T

10、1 and T2 with double myFunction(5, 8.4); //ok: replace T1 with int, T2 with double,類模板,類模板,類模板,對(duì)于這些數(shù)組類? 除了元素的類型不同之外, 其他的完全相同類模板? 在定義類的時(shí)候給它一個(gè)/多個(gè)參數(shù) ? 這個(gè)/些參數(shù)表示不同的數(shù)據(jù)類型在調(diào)用類模板時(shí), 指定參數(shù), 由編譯系統(tǒng)根據(jù)參數(shù)提供 的數(shù)據(jù)類型自動(dòng)產(chǎn)生相應(yīng)的模板類,類模板定義,C+

11、+的類模板的寫法如下: template class 類模板名{ 成員函數(shù)和成員變量 }; 類型參數(shù)表的寫法就是:class 類型參數(shù)1, class 類型參數(shù)2, ...,類模板定義,類模板里的成員函數(shù), 如在類模板外面定義時(shí), template 返回值類型 類模板名::成員函數(shù)名(參數(shù)表) { ...... },類模板定義,用類模板定義對(duì)象的寫法如下:類模板名 對(duì)象名(構(gòu)造函數(shù)實(shí)際參數(shù)表); 如果類模板

12、有無參構(gòu)造函數(shù), 那么也可以只寫: 類模板名 對(duì)象名;,類模板定義,Pair類模板:template class Pair{ public:T1 key; //關(guān)鍵字T2 value; //值Pair(T1 k,T2 v):key(k),value(v) { };bool operator & p) const; };templatebool Pair::operator & p) c

13、onst//Pair的成員函數(shù) operator <{ return key < p.key; },類模板定義,Pair類模板使用:int main(){ Pair student("Tom",19); //實(shí)例化出一個(gè)類 Paircout << student.key << " " << student.value; retur

14、n 0; },輸出結(jié)果:Tom 19,使用類模板聲明對(duì)象,編譯器由類模板生成類的過程叫類模板的實(shí)例化 ? 編譯器自動(dòng)用具體的數(shù)據(jù)類型 替換類模板中的類型參數(shù), 生成模板類的代碼 由類模板實(shí)例化得到的類叫模板類? 為類型參數(shù)指定的數(shù)據(jù)類型不同, 得到的模板類不同,使用類模板聲明對(duì)象,同一個(gè)類模板的兩個(gè)模板類是不兼容的 Pair * p; Pair a; p = & a; //wrong,函數(shù)模版作為類模板成員

15、,#include using namespace std; template class A{ public:templatevoid Func(T2 t) { cout a;a.Func('K'); //成員函數(shù)模板 Func被實(shí)例化 return 0; },程序輸出:K,若函數(shù)模板改為template void Func(T t){cout<<t}將報(bào)錯(cuò) “decl

16、aration of ‘class T’ shadows template parm ‘class T’,類模板與非類型參數(shù),類模板的參數(shù)聲明中可以包括非類型參數(shù) template ? 非類型參數(shù): 用來說明類模板中的屬性 ? 類型參數(shù): 用來說明類模板中的屬性類型, 成員操作 的參數(shù)類型和返回值類型,類模板與非類型參數(shù),類模板的 “” 中可以出現(xiàn)非類型參數(shù): template class CArray{ T array[

17、size]; public: void Print( ) { for(int i = 0; i < size; ++i) cout << array[i] << endl; } };,類模板與非類型參數(shù),CArray a2; CArray a3; 注意: CArray和CArray完全是兩個(gè)類 這兩個(gè)類的對(duì)象之間不能互相賦值,類模板與繼承,類模板派生出類模板 模板類 (即類模板中類型/

18、非類型參數(shù)實(shí)例化后的類) 派生出類模板 普通類派生出類模板 模板類派生出普通類,(1) 類模板從類模板派生,(2) 類模板從類模板派生,template classA{ T1v1;T2v2; };template class B:public A { T v; }; int main() { B obj1; return 0;} 自動(dòng)生成兩個(gè)模板類:A和B,(3) 類模板從普通類派生,class A { int v1; };

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論