成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C++之函數(shù)模板

開發(fā) 前端
在 C++標(biāo)準(zhǔn)庫中,幾乎所有的代碼都是模板代碼,可以說沒有C++模板就沒有STL。

為什么需要模板

相信寫過Java的童鞋們都知道泛型編程,在C++中與之對(duì)應(yīng)的就是模板。

模板是一種對(duì)類型進(jìn)行參數(shù)化的工具,通常有兩種形式:函數(shù)模板和類模板。

模板是一些為多種類型而編寫的函數(shù)和類,而且這些類型都沒有指定。當(dāng)使用模板的時(shí)候,你只需要把所希望的類型作為一個(gè)(顯式或者隱式的)實(shí)參傳遞給模板。 另外,由于模板是語言本身所具有的特性,所以它完全支持類型檢查和作用域。使用模板的目的就是能夠讓程序員編寫與類型無關(guān)的代碼,盡可能地減少重復(fù)代碼。

眾所周知,C++是一門強(qiáng)類型的靜態(tài)語言。在聲明變量、函數(shù)和大多數(shù)其他類型的實(shí)體的時(shí)候,C++要求我們使用指定的類型。 然而,對(duì)于許多代碼,除了類型不同之外,其余的代碼看起來都是相同的。例如我們需要實(shí)現(xiàn)一個(gè)交換兩個(gè)變量的函數(shù),為了通用性, 這個(gè)交換變量的函數(shù)不能固定兩個(gè)變量的類型,這就使得模版橫空出世。。。

在C++標(biāo)準(zhǔn)庫中,幾乎所有的代碼都是模板代碼,可以說沒有C++模板就沒有STL。

模板函數(shù)

首先我們看下函數(shù)模板的格式:

template <typename 形參名,typename 形參名,......> 
返回類型 函數(shù)名(參數(shù)列表)
{
    函數(shù)體
}

或者使用class關(guān)鍵字也可:

template <class 形參名,class 形參名,......>  
返回類型 函數(shù)名(參數(shù)列表)
{
    函數(shù)體
}

為什么會(huì)有兩種不同的格式呢?這是因?yàn)殍b于歷史的原因,你可能還會(huì)使用class取代typename,來定義類型參數(shù)。 在C++語言的演化過程中,關(guān)鍵字typename的出現(xiàn)相對(duì)較晚一些;在它之前,關(guān)鍵字class是引入類型參數(shù)的唯一方式,并一直作為有效方式保留下來。 但是更加標(biāo)準(zhǔn)的格式是使用typename關(guān)鍵字。

例如我們使用模板定義了返回較大值的模板函數(shù):

template <typename T>
const T& max_fun(const T& a,const T& b){
    return a >= b? a:b;
}

下面我們調(diào)用一下我們定義的模板函數(shù)max_fun:

int main(int argc, char* argv[]) {
    // 都是int類型 ok
    int max = max_fun(10,10);
    // 都是double類型 ok
    int max = max_fun(10,10);
    // 一個(gè)int類型,一個(gè)double類型 編譯不通過
    int max = max_fun(10,11.0);
    std::cout << "max:" << max << std::endl;
    return 0;
}

在上面的例子中我們發(fā)現(xiàn)函數(shù)max_fun(10,11.0)報(bào)錯(cuò)了,無法編譯通過,這是為什么呢?因?yàn)槲覀兌x的模板函數(shù)max_fun只有一個(gè)參數(shù)類型, 但是max_fun(10,11.0)卻傳了兩個(gè)不同的參數(shù)類型,二載函數(shù)模板中是不允許進(jìn)行自動(dòng)類型轉(zhuǎn)換的,因此報(bào)錯(cuò),有兩種方式可以解決這個(gè)報(bào)錯(cuò):

  • 一是對(duì)實(shí)參進(jìn)行強(qiáng)制類型轉(zhuǎn)換,使它們可以互相匹配:
max_fun(10,static_cast<int>(11.0));
  • 二是顯式指定(或者限定)T的類型:
max_fun<int>(10,11.0);

重點(diǎn):在函數(shù)模板實(shí)參演繹的過程中,是不允許進(jìn)行自動(dòng)類型轉(zhuǎn)換的。

重載函數(shù)模板

模板函數(shù)在使用時(shí)編譯器回自動(dòng)實(shí)現(xiàn)實(shí)例化,只要使用函數(shù)模板,(編譯器)會(huì)自動(dòng)地引發(fā)這樣一個(gè)實(shí)例化過程,因此程序員并不需要額外地請(qǐng)求模板的實(shí)例化。

和普通函數(shù)一樣,函數(shù)模板也可以被重載。就是說,相同的函數(shù)名稱可以根據(jù)不同的函數(shù)參數(shù)具有不同的函數(shù)定義; 于是,當(dāng)使用函數(shù)名稱進(jìn)行函數(shù)調(diào)用的時(shí)候,C++編譯器必須決定究竟要調(diào)用哪個(gè)候選函數(shù)。

一個(gè)非模板函數(shù)可以和一個(gè)同名的函數(shù)模板同時(shí)存在,而且該函數(shù)模板還可以被實(shí)例化為這個(gè)非模板函數(shù)。 對(duì)于非模板函數(shù)和同名的函數(shù)模板,如果其他條件都是相同的話,那么在調(diào)用的時(shí)候,重載解析過程通常會(huì)調(diào)用非模板函數(shù),而不會(huì)從該模板產(chǎn)生出一個(gè)實(shí)例。

下面我們通過一個(gè)小例子來了解下重載函數(shù)模板:

#include <iostream>
#include <memory>

template <typename T>
const T& max_fun(const T& a,const T& b){
std::cout << "模板類型max_fun:"<< std::endl;
return a >= b? a:b;
}

const int& max_fun(const int& a,const int& b){
std::cout << "int 類型max_fun:"<< std::endl;
return a >= b? a:b;
}

int main(int argc, char* argv[]) {
// 都是double類型 匹配到模板函數(shù)max_fun
//    int max = max_fun(10.0,11.0);
// 都是int類型 匹配到 普通函數(shù)max_fun
//    int max = max_fun(10,10);
// 一個(gè)char類型,一個(gè)double類型 匹配到普通函數(shù)max_fun
int max = max_fun('a',11.0);
std::cout << "max:" << max << std::endl;
return 0;
}

在上面的例子main函數(shù)中我們多次調(diào)用了函數(shù)max_fun,那么怎么區(qū)分是調(diào)用了模板函數(shù)max_fun還是調(diào)用了重載的普通函數(shù)max_fun呢?

有一條規(guī)則是這樣的:

一個(gè)非模板函數(shù)可以和一個(gè)同名的函數(shù)模板同時(shí)存在,而且該函數(shù)模板還可以被實(shí)例化為這個(gè)非模板函數(shù)。對(duì)于非模板函數(shù)和同名的函數(shù)模板,如果其他條件都是相同的話,那么在調(diào)用的時(shí)候,重載解析過程通常會(huì)調(diào)用非模板函數(shù),而不會(huì)從該模板產(chǎn)生出一個(gè)實(shí)例。

因此在上面的例子中我們可以很容易地看出第17行調(diào)用的是模板函數(shù)max_fun,因?yàn)闆]有參數(shù)是double類型的max_fun被重載。 但在第19行因?yàn)橛幸粋€(gè)參數(shù)是int類型的重載函數(shù)max_fun,因此這一行調(diào)用的是普通重載函數(shù)max_fun。

那么在第21行也是調(diào)用了int類型的重載函數(shù)max_fun,這是為什么呢?

這是因?yàn)槟0迨遣辉试S自動(dòng)類型轉(zhuǎn)化的,但普通函數(shù)可以進(jìn)行自動(dòng)類型轉(zhuǎn)換,所以第21行調(diào)用的是int類型的重載函數(shù)max_fun(‘a(chǎn)’和11.0都被轉(zhuǎn)化為int)。

函數(shù)重載應(yīng)該牢記一條首要規(guī)則:函數(shù)的所有重載版本的聲明都應(yīng)該位于該函數(shù)被調(diào)用的位置之前。

責(zé)任編輯:趙寧寧 來源: 思想覺悟
相關(guān)推薦

2023-12-24 12:56:14

C++函數(shù)語言

2010-02-05 17:34:37

C++函數(shù)模板

2024-01-17 23:10:59

C++函數(shù)模板開發(fā)

2010-02-04 14:22:25

C++函數(shù)模板非類型參

2023-11-28 11:51:01

C++函數(shù)

2010-02-02 09:49:02

C++模板

2010-02-04 09:26:23

C++模板函數(shù)重載

2023-12-18 11:15:03

2011-07-15 01:29:39

C++析構(gòu)函數(shù)

2011-07-15 00:47:13

C++多態(tài)

2011-07-14 17:45:06

CC++

2010-01-26 10:42:26

C++函數(shù)

2010-01-27 17:16:52

C++構(gòu)造函數(shù)

2011-07-10 15:26:54

C++

2011-07-13 18:24:18

C++

2010-01-26 13:55:07

C++標(biāo)準(zhǔn)模板庫

2010-02-03 17:42:33

C++模板參數(shù)

2023-12-06 13:48:00

C++代碼

2010-02-06 16:59:19

C++ kmp算法模板

2010-01-28 13:35:41

調(diào)用C++函數(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 奇米四色在线观看 | 久久久久久久久99精品 | 欧美日韩国产一区二区三区 | 一级黄片一级毛片 | 在线小视频 | 日韩中文字幕高清 | 天天影视网天天综合色在线播放 | 91久久精品日日躁夜夜躁欧美 | 不卡欧美| 草久久久| 国产精品a久久久久 | 精品二区| a在线视频 | 亚洲精品电影网在线观看 | 亚洲成人自拍 | 国产一区二区三区在线免费观看 | 波多野结衣先锋影音 | 精品亚洲视频在线 | 五月天天丁香婷婷在线中 | 国产欧美在线 | 亚洲性视频在线 | 成人在线观看欧美 | 97色在线视频 | 国产精品美女久久久久aⅴ国产馆 | 精品亚洲一区二区三区 | 欧美精品在线免费观看 | 在线成人免费视频 | 一区二区在线 | 69av片| 欧美a免费 | 久久久久国产精品 | 日本在线免费视频 | 一级做a毛片| 国产精品久久久久久中文字 | 伊人婷婷| 欧美日韩一区二区三区视频 | 免费国产视频 | 亚洲精品一区二区三区在线观看 | 九九热精品在线视频 | 永久精品 | 欧美极品少妇xxxxⅹ免费视频 |