c++课件笔记:模板;函数模板;类模板;
模板:
在编译器编译阶段,对于模板函数的使用,编译器需要按照传入的形参类型来推测生成对应类别的变量以供
调用。比如:当用double类型使用变量模板时,编译器通过对赋值类型的推测,将T确定为double类型,然
后产生一份专门处理double类型的代码,对于字符类别只是那么。
函数模板的实例化:
用不同类型的参数使用函数模板时模板函数课件,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例化。
隐式实例化就是编译器进行计算,然后显式实例化就是用户在调用函数的之后自己就选定类型,如果类别不匹配编译器会进行种类转化,不能转化则报错返回。
template<class T> T Add(const T& left, const T& right)
{
return left + right; }
int main()
{
int a1 = 10, a2 = 20;
double d1 = 10.0, d2 = 20.0;
Add(a1, a2);
Add(d1, d2);
/*
该语句不能通过编译,因为在编译期间,当编译器看到该实例化时,需要推演其实参类型
通过实参a1将T推演为int,通过实参d1将T推演为double类型,但模板参数列表中只有一个T,
编译器无法确定此处到底该将T确定为int 或者 double类型而报错
注意:在模板中,编译器一般不会进行类型转换操作,因为一旦转化出问题,编译器就需要背黑锅
Add(a1, d1);
*/
// 此时有两种处理方式:1. 用户自己来强制转化 2. 使用显式实例化
Add(a, (int)d);
return 0; }
2. 显式实例化:在函数名后的<>中指定模板参数的实际类型
int main(void) {
int a = 10;
double b = 20.0;
// 显式实例化
Add<int>(a, b);
return 0; }
如果类型不匹配,编译器会尝试进行隐式类型转化,如果能够转换成功编译器将会报错。
模板参数的匹配方法
一个非模板函数可以跟一个同名的函数模板同时存在,而且该变量模板还可以被实例化为这个非模板函数
对于非模板函数和同名变量模板,如果其它条件都同样,在激发时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以形成一个具有更好匹配的函数, 那么将选择模板
模板函数不允许自动类型转换,但普通变量可以进行自动类型转换
类模板:
注意事项:
类模板中函数放在类外进行定义时,在定义的开头必须添加模板参数列表
在使用模板类的之后,所构造出来的模板类,其实并不是一个具体的类,而并非编译器根据被实例化的类别生成准确类的模板。
类模板的实例化:
类模板实例化与变量模板实例化不同,类模板实例化需要在类模板名字后跟,然后将实例化的类别放在中就能,类模板名字不是真正的类,而实例化的结果才是真正的类。
类模板只能程序员通过显式实例化,而方程模板可以显式实例化模板函数课件,也可以隐式实例化(通过参数让编译器进行类别计算)。
http://www.jiaoanw.com/%E6%95%99%E6%A1%88%E6%A8%A1%E6%9D%BF/article-85205-1.html
http://www.jiaoanw.com/
true
教案网
http://www.jiaoanw.com/%E6%95%99%E6%A1%88%E6%A8%A1%E6%9D%BF/article-85205-1.html
report
5626
比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然函数模板的实例化:类模板中函数放在类外进行定义时,在定义的开头需要添加模板参数列表
愚者图虚名