欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報(bào)邀請碼778899分享:java C++——模版

柚子快報(bào)邀請碼778899分享:java C++——模版

http://yzkb.51969.com/

當(dāng)我們要書寫一個(gè)交換函數(shù)的時(shí)候,我要考慮到存在多種類型的情況

void Swap(int& left, int& right)

{

int temp = left;

left = right;

right = temp;

}

void Swap(double& left, double& right)

{

double temp = left;

left = right;

right = temp;

}

void Swap(char& left, char& right)

{

char temp = left;

left = right;

right = temp;

}

還有很多,我只列舉這些,那么這樣我想完成交換,就會變得非常的麻煩,所以C++出現(xiàn)了模版。

一.模版的類型

? ? 1.函數(shù)模版

? ? 2.類模板

二 . 函數(shù)模板

1 函數(shù)模板概念

? ? 函數(shù)模板代表了一個(gè)函數(shù)家族,該函數(shù)模板與類型無關(guān),在使用時(shí)被參數(shù)化,根據(jù)實(shí)參類型產(chǎn)生 函數(shù)的特定類型版本。

2. 函數(shù)模板格式

? ? template

? ? 返回值類型 函數(shù)名(參數(shù)列表){}

template

void Swap(T& left, T& right)

{

T temp = left;

left = right;

right = temp;

}

?注意:class是用來定義模板參數(shù)關(guān)鍵字,也可以使用typename切記:不能使用struct代替 class

3.函數(shù)模板的原理

? ? 函數(shù)模板是一個(gè)藍(lán)圖,它本身并不是函數(shù),是編譯器用使用方式產(chǎn)生特定具體類型函數(shù)的模具。 所以其實(shí)模板就是將本來應(yīng)該我們做的重復(fù)的事情交給了編譯器

? ? ?在編譯器編譯階段,對于模板函數(shù)的使用,編譯器需要根據(jù)傳入的實(shí)參類型來推演生成對應(yīng)類型的函數(shù)以供調(diào)用。比如:當(dāng)用double類型使用函數(shù)模板時(shí),編譯器通過對實(shí)參類型的推演, 將T確定為double類型,然后產(chǎn)生一份專門處理double類型的代碼,對于字符類型也是如此。?

4.函數(shù)模板的實(shí)例化

? ? ?用不同類型的參數(shù)使用函數(shù)模板時(shí),稱為函數(shù)模板的實(shí)例化。模板參數(shù)實(shí)例化分為:隱式實(shí)例化 和顯式實(shí)例化。?

? ? 1. 隱式實(shí)例化:讓編譯器根據(jù)實(shí)參推演模板參數(shù)的實(shí)際類型

template

T Add(const T& left, const T& right)

{

return left + right;

}

int main()

{

int a1 = 10, a2 = 20;

double d1 = 10.0, d2 = 20.0;

Add(a1, a2);

Add(d1, d2);

return 0;

}

當(dāng)我們傳遞兩個(gè)不同類型的值的時(shí)候,就會出現(xiàn)報(bào)錯(cuò)的情況,所以有兩種解決的方案:

? 1.使用強(qiáng)轉(zhuǎn)? ?

? ?2.使用顯示實(shí)例化

Add(a1, (int)d1);//強(qiáng)轉(zhuǎn)

2.?顯式實(shí)例化:在函數(shù)名后的<>中指定模板參數(shù)的實(shí)際類型

Add(a1, d1);//顯示實(shí)例化

5.模板參數(shù)的匹配原則?

? ? 1. 一個(gè)非模板函數(shù)可以和一個(gè)同名的函數(shù)模板同時(shí)存在,而且該函數(shù)模板還可以被實(shí)例化為這 個(gè)非模板函數(shù)

int Add(int left, int right)

{

return left + right;

}

template

T Add(const T& left, const T& right)

{

return left * right;

}

int main()

{

int a = 10, b = 5;

cout << Add(a, b) << endl;

return 0;

}

那么我調(diào)用Add函數(shù)的時(shí)候,會調(diào)用哪一個(gè)呢?

由此看見,都存在的情況下,會先執(zhí)行已經(jīng)編好的函數(shù),而不是模版函數(shù)。?

? ?2. 對于非模板函數(shù)和同名函數(shù)模板,如果其他條件都相同,在調(diào)動(dòng)時(shí)會優(yōu)先調(diào)用非模板函數(shù)而 不會從該模板產(chǎn)生出一個(gè)實(shí)例。如果模板可以產(chǎn)生一個(gè)具有更好匹配的函數(shù), 那么將選擇模板?

?

三.類模板

1 類模板的定義格式

template

class 類模板名

{

// 類內(nèi)成員定義

};

例子:?

#include

using namespace std;

// 類模版

template

class ST

{

public:

ST(size_t capacity = 4)

{

_array = new T[capacity];

_capacity = capacity;

_size = 0;

}

void Push(const T& data);

private:

T* _array;

int _capacity;

int _size;

};

template

void ST::Push(const T& data)

{

// 擴(kuò)容

_array[_size] = data;

++_size;

}

int main()

{

ST st1; // int

ST st2; // double

return 0;

}

因?yàn)榫幾g器不好確定棧的類型,所以這里用顯示實(shí)例化來進(jìn)行,使得編譯器可以確定其類型。

2 類模板的實(shí)例化?

? ?類模板實(shí)例化與函數(shù)模板實(shí)例化不同,類模板實(shí)例化需要在類模板名字后跟<>,然后將實(shí)例化的 類型放在<>中即可,類模板名字不是真正的類,而實(shí)例化的結(jié)果才是真正的類。

// ST是類名,ST才是類型

ST st1; // int

ST st2; // double

?

柚子快報(bào)邀請碼778899分享:java C++——模版

http://yzkb.51969.com/

文章鏈接

評論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。

轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://m.gantiao.com.cn/post/19589144.html

發(fā)布評論

您暫未設(shè)置收款碼

請?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問

文章目錄