【C++语法】模版初阶
9. 模版初阶
- 模板的作用:通过构建一个模子,让编译器依照这个模子构建不同类型但功能相同的代码
- 模板分为函数模板和类模板
函数模版
-
介绍:函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。
-
使用格式:
-
使用举例:
-
函数模板注意:
- typename是关键字,要写,可以用class替代(但不能用struct替代)
- 虽然都是由同一个函数模板创建的函数,但由于类型不同,不同类型创建的函数并不是同一函数
- 编译器并不是用函数模板执行函数代码,而是用函数模板创建相应类型函数后调用该类型函数执行代码
-
函数模板与用函数模板创建的函数之间的关系
编译器在编译阶段,编译器根据传入的实参类型来推演生成所需要创建的函数以供调用
注意:编译器仅能通过实参类型来判断,不能通过返回值类型判断
- 函数模板的实例化
函数模板的实例化可以直接指定形参类型,不需要通过实参类型进行推演,此时如果实参类型与形参类型不一致就会发生隐式类型转换,该过程发生在函数调用中
注意:在模板中,编译器一般不会进行类型转换,只有在实例化(指定形参类型)的时候,实参才会根据形参类型进行隐式类型转换
如下边代码所示:
1>可以存在同函数名的函数模板,在函数调用时会根据形参的类型自动判断该根据哪一种类型的函数模板生成函数
2>函数的返回值类型可以为auto类型,此时返回值类型由编译器判断
我们来看下面一个代码:
在这个代码中,函数模版的参数必须使用const
修饰才能让不同类型的变量使用,其中发生了隐式类型转换
-
函数模版匹配原则
1>同名的非模板函数和函数模板可以同时存在,并且函数模板还可以实例化为这个非模板函数
2>函数调用存在一下优先级顺序
对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数,那么将选择模板
3>模板函数不允许自动类型转换,但普通函数可以进行自动类型转换