c++的函数模板和类模板
2016-07-05 10:58
429 查看
函数模板和普通函数区别结论:
函数模板不允许自动类型转化
普通函数能够进行自动类型转换
函数模板和普通函数在一起,调用规则:
1 函数模板可以像普通函数一样被重载
2 C++编译器优先考虑普通函数
3 如果函数模板可以产生一个更好的匹配,那么选择模板
4 可以通过空模板实参列表的语法限定编译器只通过模板匹配
编译器从函数模板通过具体类型产生不同的函数
编译器会对函数模板进行两次编译
在声明的地方对模板代码本身进行编译;在调用的地方对参数替换后的代码进行编译。
二、类模板
继承中的类模板语法
子类从模板类继承的时候,需要让编译器知道 父类的数据类型具体是什么(数据类型的本质:固定大小内存块的别名)如:
class B : public A<int>
用类模板定义对象时用以下形式:
类模板名<实际类型名> 对象名;
类模板名<实际类型名> 对象名(实参表列);
如:
Compare<int> cmp;
Compare<int> cmp(3,7);
2.和非模板类的static数据成员一样,模板类的static数据成员也应该在文件范围定义和初始化
3.每个模板类有自己的类模板的static数据成员副本
所有容器提供的都是值(value)语意,而非引用(reference)语意。容器执行插入元素的操作时,内部实施拷贝动作。所以STL容器内存储的元素必须能够被拷贝(必须提供拷贝构造函数)。
函数模板不允许自动类型转化
普通函数能够进行自动类型转换
函数模板和普通函数在一起,调用规则:
1 函数模板可以像普通函数一样被重载
2 C++编译器优先考虑普通函数
3 如果函数模板可以产生一个更好的匹配,那么选择模板
4 可以通过空模板实参列表的语法限定编译器只通过模板匹配
template<typename T> void func(T x) { cout << "func的值是:" << x << endl; } template<typename T> T func(T x, T y) { cout << "func2的值是:x " << x << ",y的值是:" << y << endl; return x > y ? x : y; } int func(int x, int y) { cout << "func3的值是:x " << x << ",y的值是:" << y << endl; return x > y ? x : y; } void func(int x) { cout << "func4的值是" << x << endl; } int main() { func(12); //优先使用普通函数 func<>(12); //空模板,限定使用模板函数 func(12.34,100.56); //没有对应的函数,则会使用适合的模板函数 cout << func('a', 10) << endl; //普通函数中可以进行类型转换,模板函数严格匹配 system("pause"); return 0; }
函数模板机制结论
编译器并不是把函数模板处理成能够处理任意类的函数编译器从函数模板通过具体类型产生不同的函数
编译器会对函数模板进行两次编译
在声明的地方对模板代码本身进行编译;在调用的地方对参数替换后的代码进行编译。
二、类模板
继承中的类模板语法
子类从模板类继承的时候,需要让编译器知道 父类的数据类型具体是什么(数据类型的本质:固定大小内存块的别名)如:
class B : public A<int>
用类模板定义对象时用以下形式:
类模板名<实际类型名> 对象名;
类模板名<实际类型名> 对象名(实参表列);
如:
Compare<int> cmp;
Compare<int> cmp(3,7);
类模板中的static关键字
1.从类模板实例化的每个模板类有自己的类模板数据成员,该模板类的所有对象共享一个static数据成员2.和非模板类的static数据成员一样,模板类的static数据成员也应该在文件范围定义和初始化
3.每个模板类有自己的类模板的static数据成员副本
所有容器提供的都是值(value)语意,而非引用(reference)语意。容器执行插入元素的操作时,内部实施拷贝动作。所以STL容器内存储的元素必须能够被拷贝(必须提供拷贝构造函数)。
相关文章推荐
- 一个小巧的C++Log输出到文件类
- C语言结构体对齐存储问题以及给结构体中的数组的赋值问题
- C语言之控制台读取上下左右方向键指令
- 结构体struct和typedef后面接指针的含义
- c/c++错误及解决方法
- 理解C语言递归函数的逐级返回(return)
- C++ builder的文件操作
- C语言函数sscanf()的用法
- 【C/C++】解密杨辉三角
- 【转】关于int范围中负数最小值的绝对值比整数最大值大初学C,问题源自:为什么C中的int类型(16位)的下溢下限为-32768而上溢上限却是32767。 首先说吧,32767很容易理解,32767
- TYVJ3119 RQNOJ105 VIJOS1232 核电站问题 题解
- C++用new创建对象和不用new创建对象的区别解析
- C/C++基本数据类型
- 设计模式——装饰模式(Decorator)
- 匈牙利算法模板
- C#和C/C++编译生成的exe文件的区别
- 给source insight添加.cc的C++文件后缀识别(转载)
- Window 显示鼠标的坐标
- leetcode-226. Invert Binary Tree c++ java
- 学生成绩管理系统