1,函式模板深入理解:
1,編譯器從函式模板通過具體型別產生不同的函式;
1,模板就是模子,通過這個模子可以產生很多的實物;
2,函式模板就是編譯器用來產生具體函式的模子;
2,編譯器會對函式模板進行兩次編譯:
1,對模板**本身進行編譯;
1,檢查函式模板本身有無語法錯誤等;
2,對引數替換後的**進行編譯;
1,呼叫函式模板的時候,編譯器要根據實際的引數型別得到真正的函式,這個時候編譯器會對這個函式進行第二次編譯;
2,注意事項:
1,函式模板本身不允許隱式型別轉換:
1,自動推導型別時,必須嚴格匹配;
1,函式模板本身不是函式,它只是產生函式的模子,因此函式模板本身不允許隱式型別轉換;
2,顯示型別指定時,能夠進行隱式型別轉換;
1,顯示指定型別,就會得到真實的函式,這個時候有可能進行隱式型別轉換;
3,函式模板的本質程式設計實驗:
1 #include 2 #include 344,多引數函式模板:using
namespace
std;56
class
test713
};14
15 template < typename t >
16void swap(t& a, t& b) //
這裡編譯器顯示為: in function 'void swap(t&, t&)';說明這也是函式,是模板函式;
1723
24 typedef void(funci)(int&, int&); //
定義函式型別,型別名為 funci;
25 typedef void(funcd)(double&, double&);
26 typedef void(funct)(test&, test&);
2728
intmain()
29
1,函式模板可以定義任意多個不同的型別引數:
1,**示例:
1 template < typename t1, typename t2, typename t3 >2,僅僅是呼叫的時候多了幾個泛指型別而已;2t1 add(t2 a, t3 b)36
7int r = add(0.5, 0.8);
2,對於多引數函式模板:
1,無法自動推導返回值型別;
1,只有返回值型別必須手工的指定;
2,一般的工程中指定第乙個模板引數為返回值型別;
2,可以從左向右部分指定函式型別引數:
1,剩下的引數型別編譯器可以自動推導;
3,工程中,將返回值引數作為第乙個型別引數;
1,返回值是泛指型別,則將第乙個型別引數作為返回值型別;
2,這是工程中手動設定的,並不是編譯器自己的行為;
5,多引數函式模板程式設計實驗:
1 #include 2 #include 346,當函式過載遇見函式模板會發生什麼?using
namespace
std;56
template
7< typename t1, typename t2, typename t3 >
8t1 add(t2 a, t3 b)912
1314
intmain()
15
1,見下本文7 中的分析;
7,過載函式模板:
1,函式模板可以像普通函式一樣被過載:
1,c++ 編譯器優先考慮普通函式;
2,如果函式模板可以產生乙個更好的匹配,那麼選擇模板;
3,可以通過空模板實參列表限定編譯器只匹配模板:
8,過載函式模板例項分析:
1 #include 2 #include 349,小結:using
namespace
std;
56 template < typename t >
7t max(t a, t b)813
14int max(int a, int b) //
c++ 中這個函式可以過載上面的模板;
1520
21 template < typename t >
22t max(t a, t b, t c)
2328
29int
main()
30
1,函式模板通過具體型別產生不同的函式;
2,函式模板可以定義任意多個不同的型別引數;
3,函式模板中的返回值型別必須顯示指定;
4,函式模板可以像普通函式一樣被過載;
深入理解函式模板
函式模板深入理解 編譯器從函式模板通過具體型別產生不同的函式 編譯器會對函式模板進行兩次編譯 對模板 本身進行編譯 對引數替換後的 進行編譯 注意事項 函式模板本身不允許隱式型別轉換 自動推導型別時,必須嚴格匹配 顯示型別指定時,能夠進行隱式型別轉換 程式設計實驗 函式模板本質分析 include ...
57 深入理解函式模板
深入理解 編譯器從函式模板通過具體型別產生不同的函式。編譯器會對函式模板進行兩次編譯 對模板 本身進行編譯,對引數替換後的 進行編譯。注意事項 函式模板本身不是函式,是產生函式模子,因此模板本身不允許隱式型別轉換,自動推導型別時,必須嚴格匹配。顯示型別指定時,能夠進行隱式型別轉換。include i...
57 深入理解函式模板
1 函式模板深入理解 編譯器從函式模板通過具體型別產生不同的函式 編譯器會對函式模板進行兩次編譯 1 對模板 本身進行編譯 2 對引數替換後的 進行編譯 程式1 證明編譯器會對函式模板進行兩次編譯 include include using namespace std class test temp...