C++模版初阶----函数模版、类模版
C++模版初阶
- 1. 泛型编程
- 2. 函数模板
- 2.1 函数模板概念
- 2.2函数模板格式
- 2.3 函数模板的原理
- 2.4 函数模板的实例化
- 2.5 函数模版的匹配原则
- 3. 类模板
- 3.1 类模板的定义格式
- 3.2 类模板的实例化
- 总结
1. 泛型编程
泛型编程 : 编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础
- template 模版关键字
- template
- template
- 模版参数传递的是类型;函数参数传递的是对象值。
- 模版的定义和声明不支持分别在两个文件里面【会出现链接错误,所有的链接错误都是符号表找不到】因为编译器的模版T是无法确定的,无法生成符号表。
- 模版是不支持声明与定义分别放到.h和.cpp中,一般都是需要放到一个文件中。有些地方就会命名成.hpp【头文件和定义实现内容合并到一起】但是并不是必须是.hpp,.h也是可以的。
2. 函数模板
2.1 函数模板概念
函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。
2.2函数模板格式
template 返回值类型 函数名(参数列表){}
template void Swap( T& left, T& right) { T temp = left; left = right; right = temp; }
注意:注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)
2.3 函数模板的原理
在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供 调用。
比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码, 对于字符类型也是如此
2.4 函数模板的实例化
- 隐式实例化:让编译器根据实参推演模板参数的实际类型
- 显式实例化:在函数名后的中指定模板参数的实际类型
int main(void) { int a = 10; double b = 20.0; // 显式实例化 Add(a, b); return 0; }
2.5 函数模版的匹配原则
1.一个非模板函数【专门的函数】可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数。
2.对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板。
3.模板函数不允许自动类型转换,但普通函数可以进行自动类型转换
3. 类模板
3.1 类模板的定义格式
template class 类模板名 { // 类内成员定义 };
template class Stack { public: Stack(size_t capacity = 4) { _array = new T[capacity]; _capacity = capacity; _size = 0; cout delete[] _array; _capacity = 0; _size = 0; } void push(const T& data); private: T* _array; int _capacity; int _size; }; //声明和定义分离的写法 不建议分离到.h 和.cpp template _array[_size++] = data; }
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理!
部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!
图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!