C 中模板的應用 上

2021-10-10 13:32:35 字數 3215 閱讀 2002

① c++另一種程式設計思想稱為 泛型程式設計 ,主要利用的技術就是模板;

② c++提供兩種模板機制:函式模板和類模板。

函式模板的意義:建立乙個通用函式,其函式返回值型別和形參型別可以不具體制定,用乙個虛擬的型別來代表。

#includeusing namespace std;  

templatevoid compare(t1 a, t2 b)  

}  int main()  

#includeusing namespace std;  

templatevoid compare(t1 a, t2 b)  

}  int main()  

#includeusing namespace std;  

templatevoid compare(t1 a, t2 b)  

cout <

cout <

}    

int main()  

由於隱式資料型別推導只能根據傳入形參的實際資料型別來例項化相應資料型別的實參,因此無法執行強制型別轉換,即傳入double型別的引數就是double型別的,無法再變為float型別的。

#includeusing namespace std;  

templatevoid showinf()  

int main()  

#include #include using namespace std;  

class person  

};  

void showinf(person a, person b)  

cout <

}    

templatevoid showinf(t1 a, t2 b)  

}  template<> void showinf(person a, person b)  

cout <

}    

int main()  

這裡,我們看到有個函式可以實現「showing(a,b)」,分別為「具體化了的函式模板(相當於為了針對某乙個資料型別而過載的函式模板)」和「普通函式」,但是編譯器認為:呼叫函式模板還得例項化它,怪麻煩的,因此我就是用現成的普通函式吧,因此「在函式模板和普通函式均可以使用的前提下,普通函式優先順序》函式模板優先順序」。

#include using namespace std;  

templatevoid compare(t1 a, t2 b)  

cout <

}    

void compare(int a, float b)  

cout <

}    

int main()  

這裡呼叫的是「函式模板」,這裡有人問:為啥呢?前面那個不是優先呼叫的普通函式嗎?我們要注意,前面的兩個函式沒有發生強制型別轉換,但是我們這裡普通成員函式形參型別是int,float,而我們傳入引數是int,int,因此這裡要發生乙個強制型別轉換的過程,反觀函式模板的呼叫並不需要強制型別轉換,因此編譯器自然而然地呼叫最方便快捷那乙個實現方式了。

#include #include using namespace std;  

class person  

};  

templatevoid showinf(t1 a, t2 b)  

}  int main()  

這裡,函式模板中a,b都是t資料型別,t未知,但是我把a,b作為person類物件來使用也是可以的,我用a,b來呼叫person類物件的資料成員也是可行的,因為函式模板中一切都是乙個模板,就相當於乙個空架子,只有我們給予函式模板乙個確定的資料型別(在呼叫函式時),此時函式模板才會被例項化。

此外,由於是呼叫時才建立,因此模板**現錯誤(資料型別不正確引發的錯誤,比如:函式形參t在呼叫是應該是int,你卻在函式體內出現了object.membervar類成員的呼叫情況),是不會被提示的,只有當你例項化時,才可以動態的檢查出錯誤。

#include using namespace std;  

void compare(int a, int b)  

cout <

}    

templatevoid compare(t1 a, t2 b)  

cout <

}    

int main()  

① 類模板可以有預設模板引數;

② 類模板沒有自動資料型別推導,只能通過顯式資料型別推導來例項化物件;

③ 類模板無法具體化模板,即無法為某一中國特定情況來宣告乙個類模板。

① 函式模板即可以進行自動(隱式)資料型別推導,也可以進行顯式的資料型別推導;

② 函式模板可以是模板具體化,即針對於某一種特定情況來過載函式模板。

#include #include using namespace std;  

template// class與typename作用一樣,不起到宣告類的作用  

class person  

void showinf()  

};  

int main()  

① 指定傳入的型別 --- 直接顯示物件的資料型別;

② 引數模板化 --- 將物件中的引數變為模板進行傳遞;

③ 整個類模板化 --- 將這個物件型別模板化進行傳遞。

#include #include using namespace std;  

template// class與typename作用一樣,不起到宣告類的作用  

class person  

void showinf()  

};  

void showinf1(person&p) // 普通函式  

template// 函式模板巢狀類模板  

void showinf2(person&p)  

template// 函式模板巢狀類模板  

void showinf3(t &p)  

int main()  

(C 模板程式設計) 多型在模板中的應用

多型 人類 class human virtual human 作為父類時一般應該有乙個虛析構函式,在 c 設計模式 中給大家講解 男人 class men public human 女人 class women public human men objmen women objwomen 父類引用...

C 中的類模板應用問題

在c 中,類模板的使用有一些特殊的問題,大家都知道,c 中類的出現是為了實現封裝,達到資訊的隱藏,很多時候,類的宣告和實現細節是分到不同的檔案進行編寫的,但是在模板中,因為一些特殊的原因 對模板引數無法分辨 必須要將兩部分寫道同乙個檔案中,並且,因為模板的複雜性,其默寫特殊形式的宣告也比較特別。下例...

spring容器中的bean工廠和應用上下文

容器 spring容器建立裝配,配置並管理它們整個生命週期 bean工廠 提供基本di支援 應用上下文 基於bean factory構建,提供框架級別的服務,例如從屬性檔案解析 然後通過應用上下文將配置載入到ioc容器,讓spring替我們管理物件,待我們需要使用物件的時候,再從容器中獲取bean就...