初探C++函数模版学习笔记
来源:互联网 发布:java资源下载网 编辑:程序博客网 时间:2024/04/30 04:29
泛型程序设计
特点:算法实现时不指定具体要操作的数据的类型。算法实现一遍但可适用于多种数据结构。
优势:减少重复代码的编写。
实现:大量编写模板, 使用模板的程序设计。
函数模版
为了交换两个int变量的值, 需要编写如下Swap函数:
void Swap(int & x, int & y) { int tmp = x; x = y; y = tmp;}
为了交换两个double型变量的值, 还需要编写如下Swap函数:
void Swap(double & x, double & y) { double tmp = x; x = y; y = tmp;}
能否只写一个Swap, 就能交换各种类型的变量?
用函数模版解决。
形式
template<class 类型参数1, class 类型参数2, … > //class也可以用typename返回值类型 模板名 (形参表){ 函数体}
举例1
template <class T>void Swap(T & x, T & y) { T tmp = x; x = y; y = tmp;}
int main(){ int n = 1, m = 2; Swap(n, m); //编译器自动生成 void Swap(int &, int &)函数 double f = 1.2, g = 2.3; Swap(f, g); //编译器自动生成 void Swap(double &, double &)函数 return 0;}
另外,函数模板中可以有不止一个类型参数
多个参数的模版
template<class T1, class T2>T2 print(T1 arg1, T2 arg2){ cout<< arg1 << " "<< arg2<<endl; return arg2; }
此外,函数模板可以重载, 只要它们的形参表不同即可。下面两个模板可以同时存在:
模版重载
template<class T1, class T2>void print(T1 arg1, T2 arg2){ cout<< arg1 << " "<< arg2<<endl;}template<class T>void print(T arg1, T arg2){cout<< arg1 << " "<< arg2<<endl;}
编译器查找优先顺序
C++编译器遵循以下优先顺序:
Step 1: 先找参数完全匹配的普通函数(非由模板实例化而得的函数)
Step 2: 再找参数完全匹配的模板函数
Step 3: 再找实参经过自动类型转换后能够匹配的普通函数
Step 4: 上面的都找不到, 则报错
举例2:
template <class T> T Max(T a, T b){ cout << "Template Max 1" <<endl; return 0;}template <class T, class T2> T Max(T a, T2 b){ cout << "Template Max 2" <<endl; return 0;}double Max(double a, double b){ cout << "MyMax" << endl; return 0;}int main() { int i=4, j=5; Max(1.2,3.4); //调用Max(double, double)函数 Max(i, j); //调用第一个T Max(T a, T b)模板生成的函数 Max(1.2, 3); //调用第二个T Max(T a, T2 b)模板生成的函数 return 0;}
赋值兼容原则引起函数模板中类型参数的二义性
template<class T>T myFunction(T arg1, T arg2){cout<<arg1<<“ ”<<arg2<<“\n”;return arg1;}…myFunction(5, 7); //ok: replace T with intmyFunction(5.8, 8.4); //ok: replace T with doublemyFunction(5, 8.4); //error: replace T with int or double? 二义性
可以在函数模板中使用多个类型参数, 可以避免二义性
避免二义性
template<class T1, class T2>T1 myFunction( T1 arg1, T2 arg2){ cout<<arg1<<“ ”<<arg2<<“\n”; return arg1;}…myFunction(5, 7); //ok:replace T1 and T2 with intmyFunction(5.8, 8.4); //ok: replace T1 and T2 with doublemyFunction(5, 8.4); //ok: replace T1 with int, T2 with double
3 1
- 初探C++函数模版学习笔记
- 初探C++类模版学习笔记
- C++学习笔记:函数模版
- Lua学习笔记--函数初探
- C++模版初探之模版函数
- 函数模版与类模版简单实例--学习笔记
- 变长参数模版函数初探
- 模版笔记001 - 函数模版
- Lua学习笔记--Lua调用C初探
- C++template--函数模版
- 【c++】函数模版
- 【C++】认识模版函数
- C++:函数<学习笔记>
- C++——模版:函数模版
- 初探swift语言的学习笔记四(类对象,函数)
- ThinkPHP学习笔记(3) 数据库操作以及M函数初探
- 初探swift语言的学习笔记四(类对象,函数)
- C语言学习笔记(3)指针初探
- C# 动态编译代码
- OFBiz entity engine中的设计模式总结
- 37、实例 使用jQuery操作DOM之插入元素
- MFC单文档静态划分窗口时出现宽高度参数无效的改正方法
- Jsp页面渲染
- 初探C++函数模版学习笔记
- 商软专卖店收银系统(总部):基本资料——人事资料,职位信息怎么没有选择项也不能填写?
- Unity3D使用SVN进行版本控制(unity3d3.5 or later)
- 浅谈OFBiz之权限设计
- 38、实例 使用jQuery操作DOM之删除元素
- 扩展用户体验-ActionBar
- fork与vfork的区别
- Protocol 协议 与 delegate 代理
- UVa 213 Message Decoding (信息编码)