C 泛型程式設計(模板)

2021-10-19 13:38:37 字數 2239 閱讀 4876

2. 類模板

我們先來看乙個概念

泛型程式設計:使用模板,編寫和型別無關的**。

沒有模板之前,一些函式或者類,針對不同的型別需要寫很多重複的**。

函式:比如交換函式swap,假如傳入的資料型別不同,int,char,double。我們要實現不同的型別物件函式。

類:比如我們像實現乙個資料結構棧stack,stack的多個物件,st1儲存int,st2儲存double

在沒有模板之前,我們要針對各個型別寫很多個swap函式和stack類,而這些函式和類,邏輯是一樣的,只是處理的物件的型別不同。

編譯器根據呼叫函式模板和類模板的型別,例項化出對應的函式和類

當我們模板內部有個語法錯誤,且外面我們沒有用到這個模板

是可以編譯通過的。但是當我們用到它,他就會根據模板生成對應函式,這是肯定會對內部檢查。

但是我們在模板外層發生錯誤,他還是會直接檢查的。

所以說,需要注意模板不會被編譯成指令放到**段。而是在預處理的時候根據資料型別把模板例項化成對應的函式和類編譯成指令放進**段。反彙編可以檢視。

template

void

swap

(t& a, t& b)

模板也可以有不同的引數。

第二個add報錯,因為t只有乙個所以模板推演錯誤,他不知道該成為int型別還是double型別。

第一種辦法:

傳入的時候改變它的型別,然後讓他推演

凡是推演的過程就叫模板的隱式例項化。

第二種辦法:

直接顯示例項化模板,確定t為int。d會自己隱式型別轉換。

不要你自己推演,我直接確定讓你t為int 型別。

可以看到第乙個add函式呼叫的是已有的函式,沒有讓模板進行推演。

可以看到第二個add函式,由於傳入引數與我們自己定義的函式引數型別不符合,所以他會用模板去推演,然後進行呼叫。

其實沒有模板的話,他也可以呼叫我們自己寫的,因為可以double可以隱式型別轉換為int。但是模板生成的函式更適合他。編譯器很聰明,他只會選擇與自己更匹配的乙個。

template

class stack

;template

stack::

stack

(int capacity):_a

(new t[4]

),_top(0

),_capacity

(capacity)

template

stack::

~stack()

template

void stack::

push

(const t& x)

intmain()

類模板,使用方法與函式模板大同小異,在**中均有表示。

需要注意的是,假如宣告和定義分離,需要在定義時每個函式前面都加上template,同時加上類名表示屬於類的成員函式。

C 泛型程式設計 模板

在學習c c 過程中,我們可能常用幾種函式,由於傳入的引數不同,需要進行不同的函式的編寫,在c語言中需要根據引數和功能的不同重新編寫新的函式,而在c 中有函式過載這樣的機制,一定程度上解決了問題,但是 過載的函式僅僅只是型別不同,的復用率比較低,只要有新型別出現時,就需要增加對應的函式 的可維護性比...

C 泛型程式設計 模板

0.所謂泛型程式設計就是獨立於任何特定型別的方式編寫 使用泛型程式時,需要提供具體程式例項所操作的型別或者值。我們經常用到stl容器 迭代器 和演算法都是泛型程式設計的例子 模板是c 支援引數化多型的工具,使用模板可以使使用者為類或者函式宣告一種一般模式,使得類中的某些資料成員或者成員函式的引數 返...

模板 泛型程式設計

我們從乙個很簡單的問題來進入泛型程式設計 question 如何寫乙個通用的加法函式 使用函式過載。針對每乙個所需相同行為的不同型別重新實現 函式過載的缺點 1 只要有 型別出現,就要重新新增對應函式 2 除型別外,所有函式的函式體都相同,的復用率不高 3 如果函式知識返回值型別不同,函式過載不能解...