從零開始學習c 之函式模板與類模板

2021-08-13 02:53:33 字數 1969 閱讀 1929

什麼是模板:

模板是c++中泛型程式設計的基礎,乙個模板就是乙個建立類或函式的藍圖或者說是公式,當使用乙個vector這樣的泛型型別或者find這樣的泛型函式時,我們提供足夠的資訊,將藍圖轉換為特定的類或者函式

函式模板:

定義模板:

假如我們要比較兩個數的大小,我們可能會寫出下面這樣的函式

//比較兩個string類引數大小

int compare(const string &v1, const string &v2)

//比較兩個double型別引數

int compare(const double &v1, const double &v2)

這時我們發現,除了型別不同,函式體基本完全相同,我們便引入了函式模板。

我們可以定義乙個通用的函式模板,而不是為每個型別都定義新函式。**如下:

template //使用效果完全一樣                          

int compare(const t &v1, const t &v2)

<>內表示模板引數列表這是乙個逗號分隔的多個模板引數的列表,在模板定義中引數列表不能為空

模板函式只是乙個宣告,當呼叫模板時,編譯器會根據引數來例項化對應引數的函式來使用

呼叫模板函式:

float m = 1.5, n = 2.5;

double x = 10.5, y = 20.5;

int a = 1, b = 2;

//模板函式的呼叫 模板函式預設不作型別轉換

compare(m,n); //compare(float,float)

compare(x, y); //compare(double,double)

//compare(a, y); //error

模板函式的例項化:

當呼叫乙個函式模板時,編譯器會利用給定的函式實參來推斷模板實參,用此實際實參代替模板引數來建立出模板的乙個新的例項,也就是乙個新函式,這個過程稱為例項化。

其他細節:

模板函式為了防止型別出錯,所以不會作自動型別轉換,比如int轉換為float。

編譯器會根據函式的第乙個引數來例項化對應型別的模板函式,所以當引數的型別不同時,編譯器會報錯。

例題:

編寫乙個print函式模板,它接收乙個陣列的引用,能處理任意大小、任意元素型別的陣列

template void print(const t (&a)[n])

cout << endl;

}int main()

; print(a);

return 0;

}

類模板:

類模板的定義:

template class vector ;

類模板的所有函式也是模板函式

類模板中函式的定義:

template vector::vector(int size) :m_size(size)

template t& vector::operator(int index)

else

}

C 函式模板與類模板

一 函式模板 1 函式模板 建立乙個通用函式,其函式型別和形參型別不具體指定,用乙個虛擬型別來代表這個通用函式來代表。凡是函式體相同的函式都可以用這個模板來代替,不必定義多個函式,只需在模板中定義一次即可。在呼叫函式時系統會根據實參的型別來取代模板中虛擬的型別,從而實現不同函式的功能。作用 功能相同...

C 函式模板與類模板

由菜鳥網整理總結,整理文章 作者做的任務只是將知識點簡化更供人理解以及加了一些自己的認知。模版可以理解成把資料型別做成可以設定的引數化,然後在定義的時候套用,讓資料型別可以隨意變換。使用模板的目的就是能夠讓程式設計師編寫與型別無關的 比如編寫了乙個交換兩個整型int 型別的swap函式,這個函式就只...

C 函式模板與類模板

泛型程式設計 編寫與型別無關的通用 是 復用的一種手段。模板是泛型程式設計的基礎.模板 函式模板 類模板 1.函式模板概念 函式模板代表了乙個函式家族,該函式模板與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本。2.函式模板格式 template typename t1,typena...