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

首頁綜合 正文
目錄

柚子快報邀請碼778899分享:java C++——模版

柚子快報邀請碼778899分享:java C++——模版

http://yzkb.51969.com/

當我們要書寫一個交換函數(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ù)模板代表了一個函數(shù)家族,該函數(shù)模板與類型無關(guān),在使用時被參數(shù)化,根據(jù)實參類型產(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ù)模板是一個藍圖,它本身并不是函數(shù),是編譯器用使用方式產(chǎn)生特定具體類型函數(shù)的模具。 所以其實模板就是將本來應該我們做的重復的事情交給了編譯器

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

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

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

? ? 1. 隱式實例化:讓編譯器根據(jù)實參推演模板參數(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;

}

當我們傳遞兩個不同類型的值的時候,就會出現(xiàn)報錯的情況,所以有兩種解決的方案:

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

? ?2.使用顯示實例化

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

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

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

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

? ? 1. 一個非模板函數(shù)可以和一個同名的函數(shù)模板同時存在,而且該函數(shù)模板還可以被實例化為這 個非模板函數(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ù)的時候,會調(diào)用哪一個呢?

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

? ?2. 對于非模板函數(shù)和同名函數(shù)模板,如果其他條件都相同,在調(diào)動時會優(yōu)先調(diào)用非模板函數(shù)而 不會從該模板產(chǎn)生出一個實例。如果模板可以產(chǎn)生一個具有更好匹配的函數(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)

{

// 擴容

_array[_size] = data;

++_size;

}

int main()

{

ST st1; // int

ST st2; // double

return 0;

}

因為編譯器不好確定棧的類型,所以這里用顯示實例化來進行,使得編譯器可以確定其類型。

2 類模板的實例化?

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

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

ST st1; // int

ST st2; // double

?

柚子快報邀請碼778899分享:java C++——模版

http://yzkb.51969.com/

文章鏈接

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

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

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

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

發(fā)布評論

您暫未設置收款碼

請在主題配置——文章設置里上傳

掃描二維碼手機訪問

文章目錄