c++中有幾種變數交換的方法?
定義巨集**塊和定義函式
#include
#include
using
namespace
std;
#define swap(t, a, b) \
do \
while(0)
void swap(int& a, int& b)
void swap(double& a, double& b)
void swap(string& a, string& b)
int main()
上述函式是分別用巨集定義與幾個函式實現的變數的交換的方法!!!
下面我們來分析一下他們兩個的優缺點:
定義巨集**塊:
優點:
**復用,適合所有的型別
缺點:
巨集定義是在預處理階段替換的,編譯器不知道巨集的存在,無法做型別安全檢查
定義函式:
優點:
真正的函式呼叫,編譯器會對型別檢查
缺點:
根據型別重複定義函式,無法實現**復用
解決上述兩種方案的缺點:泛型程式設計
泛型程式設計:不考慮具體資料型別的程式設計方式!
對於上述swap函式,可以寫成下面這樣:
void swap(t& a,t& b)
上述的t不是指某乙個資料型別,而是泛指任意的資料型別
在c++中,泛型程式設計,指的就是:函式模板!!!
函式模板:
一種特殊函式,可用不同型別進行呼叫
看起來和普通函式類似,區別是型別可被引數化
template t>
void swap(t& a, t& b)
函式模板的語法規則:
函式模板的使用有兩種呼叫方法:
自動型別推導呼叫
具體型別顯示呼叫
下面看乙個具體的示例:
#include
#include
using
namespace
std;
template
< typename t >
void swap(t& a, t& b)
template
< typename t >
void sort(t a, int len)}}
}template
< typename t >
void println(t a, int len)
cout
<< endl;
}int main()
; println(a, 5);
sort(a, 5);
println(a, 5);
string s[5] = ;
println(s, 5);
sort(s, 5);
println(s, 5);
return
0;}
執行結果為:
從而可以看出函式模板的強大,我們只需要寫出乙個函式,就可以使用任意的資料型別!!!
函式模板是泛型程式設計在c++中的應用之一
函式模板能夠根據實參對引數型別進行推導
函式模板支援顯示的指定引數型別
函式模板是c++中重要的**復用的方式
C 深度剖析教程36 深入理解函式模板
編譯器從函式模板通過具體型別產生不同的函式 編譯器會對函式模板進行兩次編譯 對模板進行編譯 對引數替換後的函式進行編譯 注意事項 函式模板本身不允許隱式型別轉換 include include using namespace std class test template typename t vo...
C 深度剖析教程38 類模板深度剖析
類模板可以定義任意多個不同的型別引數 類模板可以被特化 類模板的特化型別 看 include include using namespace std template typename t1,typename t2 class test template typename t1,typename t...
C 深度剖析教程39 實現C 陣列類模板
模板引數可以是數值型引數。也就是非型別引數。如下圖所示 我們可以像上面定義乙個區域性陣列,但是卻不能這樣定義 int n 10 func double n 上面這種寫法就是錯的!實際上,不光是型別引數不能為數值型模板引數,下面幾種情況也不能作為模板引數 實際上,數值型模板引數是必須在編譯階段被處理的...