交換兩個變數的方法有巨集定義和函式,他們有各自的優缺點:
(1)巨集定義:
優:**重複,適合所有型別
缺:缺少型別檢查,巨集在預處理階段就被換,編譯器不知道,用巨集不安全。
(2)函式:
優:真正的函式呼叫,編譯器會對型別檢查,相較於巨集安全。
缺:不同型別需要重複定義函式,**無法復用。
針對以上,c++存在泛型程式設計,不用考慮具體資料型別。
函式模板的編譯
1.定義點
模板的頭部
2.呼叫點
模板的例項化後的模板函式
<>模板型別引數列表
t型別 萬能的型別 虛假的型別
template
t sum(t a, t b)
int main()
函式模板
1)模板的例項化:呼叫點用具體的型別去替換虛假型別的過程。
2)模板函式:
a定義點編譯模板頭部
b呼叫編譯模板函式
3)模板的實參推演:
呼叫點沒有給出的情況下,由系統通過實參推演出來我麼需要的型別。
1.函式模板
函式模板是泛型程式設計在c++中的應用方式之一,是根據實參對引數型別進行推導的,可顯示指定引數型別
2.模板函式
3.模板的例項化
4.模板的實參演繹
5.模板的特例化
1)完全特例化,是全特例化,有函式模板和類模板
2)部分特例化,是偏特例化,有類模板
注意模板過載
6.模板的型別引數
7.模板的非型別引數
1)常量
2)浮點型和類型別
8.接收不明確型別的返回值
9.模板的預設值
10.模板的過載
1)普通函式版本
2)模板函式
3)模板特例化版本
我們在編寫程式時,編譯器會優先去呼叫普通函式,但是當函式模板有更好的匹配時或使用限定符<>時,編譯器就會去匹配函式模板。以上編譯器呼叫順序是:
1)>3) >2)
11.模板的顯示例項化
c++中,函式模板的宣告與定義一般寫在標頭檔案中,若分開寫函式類中宣告與定義,如.h 和.cpp中乙個宣告了某個成員函式乙個定義某個函式,互惠導致連線錯誤,故一般寫在.h裡。
模板的顯示例項化
template int sum(int, int);
template double sum(double, double);
/*int sum(int a, int b)
*/模板函式
bool compare(int a, int b)
int main()
template < typename >
t* getdata()
int main()
實參推演的注意事項
1.不能產生二義性
2.有實參推演依據
<> 模板型別引數列表 ,typename來定義,compare是模板名
一趟呼叫過程中,
乙個模板型別引數只能用乙個型別來替換
1.編譯模板頭部
兩個形參需要相同的型別
2.呼叫點
沒有給出用來例項化的型別
實參推演
5.模板型別引數
typename | class定義
<>模板型別引數列表中處理機制一模一樣
早期 我們使用class定義模板型別引數
後期 我們使用typename定義模板型別引數
template < typename>
class node//node不是類,是模板名稱 nude<>
private:
t mdata;
node< t >* pnext;
}編寫乙個程式,實現乙個排序函式 ,要求任意型別的資料都能用來排序 。**如下:
template
void sort(t arr)}}
}int main()
;sort(arr);
return 0;
}template//class t//類名 類型別
void sort(t arr, int len)}}
}template
void show(t arr, int len)
std::cout << std::endl;
}int main()
;int len = sizeof(arr) / sizeof(arr[0]);
sort(arr, len);//int*
show(arr, len);
return 0;
}
類模板 建議
除了構造和析構以外
其他地方都加上模板型別引數
編寫乙個程式:
使用類模板實現乙個棧 ,如下:
const int stack_size = 10;
template
class stack
void push(t val)
arr[mtop++] = val;
}bool empty()
void pop()
mtop–;
}t top()
return arr[mtop - 1];
}private:
bool full()
t arr[stack_size];
int mtop;
};int main()
auto rt = st.top();
st.pop();
std::cout << "rt : " << rt << std::endl;
return 0;
}
函式模板與類模板的簡單例項
模板分類 class 和 typename的意思是一樣一樣的 1 函式模板 template 型別名 函式名 引數1,2 類模板 include using namespace std templateclass list 函式模板 templatetype2 max type1 a,type2 b...
模板 函式模板
c 程式設計 資料結構與程式設計方法 例15.8 利用函式過載技術,求兩個整數 字元 浮點數或字串中的較大值,需要編寫4個函式larger。而c 通過提供函式模板,簡化了過載函式據的過程。include using namespace std template type,模板的形參,用於確定函式的形...
C 函式模板基礎知識
為什麼要引入模板 為了避免 重複,程式設計師可以編寫脫離資料型別通用模板。模板的分類 函式模板 類模板 注意 模板的宣告或定義只能在全域性,命名空間或類範圍內進行。不能在函式內進行,比如不能在main函式中宣告或定義乙個模板。函式模板 定義 模板函式 重點在函式,是對函式模板進行引數例項化後的結果,...