您现在的位置:首页 > 教案模板 > 正文

c++课件笔记:模板;函数模板;类模板;

2020-08-30 21:20 网络整理 教案网

模板函数课件_模板函数课件_模板函数和函数模板

模板:

在编译器编译阶段,对于模板函数的使用,编译器需要按照传入的形参类型来推测生成对应类别的变量以供

调用。比如:当用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; }

模板函数课件_模板函数和函数模板_模板函数课件

如果类型不匹配,编译器会尝试进行隐式类型转化,如果能够转换成功编译器将会报错。

模板参数的匹配方法

一个非模板函数可以跟一个同名的函数模板同时存在,而且该变量模板还可以被实例化为这个非模板函数

对于非模板函数和同名变量模板,如果其它条件都同样,在激发时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以形成一个具有更好匹配的函数, 那么将选择模板

模板函数和函数模板_模板函数课件_模板函数课件

模板函数不允许自动类型转换,但普通变量可以进行自动类型转换

类模板:

注意事项:

类模板中函数放在类外进行定义时,在定义的开头必须添加模板参数列表

模板函数课件_模板函数和函数模板_模板函数课件

在使用模板类的之后,所构造出来的模板类,其实并不是一个具体的类,而并非编译器根据被实例化的类别生成准确类的模板。

类模板的实例化:

类模板实例化与变量模板实例化不同,类模板实例化需要在类模板名字后跟,然后将实例化的类别放在中就能,类模板名字不是真正的类,而实例化的结果才是真正的类。

类模板只能程序员通过显式实例化,而方程模板可以显式实例化模板函数课件,也可以隐式实例化(通过参数让编译器进行类别计算)。