C 泛類 函式模板 類模板

2021-10-01 08:12:13 字數 2428 閱讀 8260

**:

1. 函式模板

1.1 函式模板的概念

函式模板代表了乙個函式家族,該函式模板與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本。

1.2 函式模板格式

template

返回值型別 函式名(引數列表){}

template // templatevoid swap(t1& x, t1& y)

tips: typename 只是定義模板引數的關鍵字,也可以使用class,但是不能用struct替代class。

1.3 函式模板的原理

其實函式模板就像是乙個模子。例如做工藝品,他一定會有乙個模子才能做出一模一樣的進行量產。那麼函式模板也是這個原理。很多函式例如上面的交換函式,它的內部邏輯都是一樣的,就是可用需要交換的引數不一樣,那麼如果我們用函式過載,那麼我們要寫多少個呀?有了函式模板,我們就寫乙個,需要改變的引數,編譯器會自動匹配,這樣就輕鬆了很多。

模板是乙個藍圖,它本身並不是函式,是編譯器用使用方式產生特定具體型別函式的模具。所以模板就是將本來應該我們做的重複的事情交給了編譯器。

在編譯器編譯階段,對於模板函式的使用,編譯器需要根據傳入的實參型別來推演生成對應型別的函式以供呼叫。比如:當用double型別使用函式模板時,編譯器通過對實參型別的推演,將t確定為double型別,然後產生乙份專門處理double型別的**,對於字元型別也是如此。

1.4 函式模板的例項化

用不同的引數使用函式模板時,稱為函式模板的例項化。 模板引數的例項化分為:顯示例項化和隱式例項化 。

隱式例項化

template t1 add(const t1& left, const t1& right)

void test(void)

這樣調函式都是可以的,因為引數型別一致。那麼下面那種情況就不一樣了

template t1 add(const t1& left, const t1& right)

void test(void)

編譯器會報錯,因為引數型別不一致。如果編譯器自動幫你轉了,結果錯了,那是誰的鍋呀?所以這裡需要程式猿進行隱式例項化。

add(a, (int)d);//把其中乙個變數強轉成你想要的型別
顯示例項化

template t1 add(const t1& left, const t1& right)

void test(void)

顯示例項化就是在你要調的函式後面+《型別名》(實參)。如果型別不匹配,編譯器會嘗試進行隱式型別轉換。如果沒法轉換,則會報錯

1.5 模板引數的匹配原則

1、乙個非模板函式可以和乙個同名的函式模板同時存在,而且該函式模板還可以被例項化為這個非模板函式。

2、對於非模板函式和同名函式模板,如果其他條件都相同,在調動時會優先呼叫非模板函式而不會從該模板產生出乙個例項。如果模板可以產生乙個具有更好匹配的函式, 那麼將選擇模板。

int add(const int& left, const int&right)

template t1 add(const t1& left, const t1& right)

void test(void)

3、模板函式不允許自動型別轉換,但普通函式可以進行自動型別轉換。

int add(const int& left, const int&right)

template t1 add(const t1& left, const t1& right)

void test(void)

2. 類模板

2.1 類模板的定義格式

template class 類模板名

;

template class vector

~vector();//在類裡面宣告,在類外面進行定義

//順序表的一些基本操作

private:

t *_array;

size_t _size;

size_t _capacity;

};template vector::~vector()

}

在這裡vector不是具體的類,而是乙個模具

2.2 類模板的例項化

類模板必須進行顯示例項化!!!

vectorv1;

泛型 模板函式 模板類

函式模板的性質 1 函式模板並不是真正的函式,它只是c 編譯生成具體函式的乙個模子。2 函式模板本身並不生成函式,實際生成的函式是替換函式模板的那個函式,比如上例中的add sum1,sum2 這種替換是編譯期就繫結的。3 函式模板不是只編譯乙份滿足多重需要,而是為每一種替換它的函式編譯乙份。4 函...

C 泛型程式設計 函式模板 類模板

以前我們寫過乙個簡單的交換函式。我們不難發現交換函式是與型別有很大關係的,int,double.那麼如何實現乙個通用的交換函式呢?void swap int left,int right void swap double left,double right void swap char left,c...

C 模板函式,模板類

模板如字面的意思為模具模板,並不是乙個正真的物體。例如,在編寫比較兩個數大小的 中,我們可能要比較兩個整數的大小,也能需要比較浮點數等等大小。在這些 中,基本的邏輯都是相同的,只是比較數的型別不同。此時我們就可以用模板這個概念來完成對於不同型別的引數而相同的邏輯的操作。而模板會根據實際的引數型別推演...