2020.12.c++模板
c++模板
一.概念
1.特点
- 模板不可以直接使用,它只是一个框架
- 模板的通用并不是万能的
二.函数模板
1.函数模板的作用
- 建立一个通用函数,其函数值类型和形参类型可以不具体制定,用一个虚拟的类型来代表 ,将类型参数化
2.函数模板的语法和使用
//template---声明创建模板
//typename---表明其后面是一种数据类型,也可以用class代替
template<typename T>//声明一个模板,<typename T>----模板参数表
//以下是函数的声明或定义
-
实际案例:完成两个相同类型的值的交换
#include <iostream> using namespace std; template<typename T> void mySwap(T& a, T& b) { T temp = a; a = b; b = temp; } //模板函数的使用 void test02() { int a1 = 1; int b1 = 2; cout << a1 << endl; cout << b1 << endl; mySwap(a1, b1);//自动类型推导 //mySwap <int>(a1,b1);显示指定类型 cout << a1 << endl; cout << b1 << endl; } int main() { test02(); } /*1 2 2 1*/
3.函数模板注意事项
- 自动类型推导,必须导出一致的数据类型T,才可以使用
- 模板必须要确认T的数据类型才能使用
4.普通函数和模板函数的区别
- 普通函数调用可以发生隐式类型转换
- 函数模板 用自动类型推导,不可以发生隐式类型转换
- 函数模板 用显示指定类型,可以发生隐式类型转换(比如:两个数字相加得到一个int型,如果其他一个数是char型--->会隐式转换为int型)
5.普通函数和函数模板的调用规则
三.类模板
1.类模板的作用
- 建立一个通用类,类中的成员 数据类型可以不具体制定,用一个虚拟的类型来代表
2.类模板的语法和使用
template<class T>//类模板声明
//底下写类的定义
//<class T>---->模板参数表,不能为空,参数可以有多个,用逗号隔开
- 使用
#include <iostream>
using namespace std;
#include <String>
template<class Nametype,class Agetype>
class Person {
public:
Person(Nametype name,Agetype age) {
p_name = name;
p_age = age;
}
void showPerson() {
cout << p1.p_age << p1.p_name << endl;
}
Nametype p_name;
Agetype p_age;
};
void test03() {
Person<string, int> p1("aaa", 10);
p1.showPerson();
}
int main() {
test03();
}
/*10aaa*/
3.类模板和函数模板的区别
-
类模板没有自动类型推导的使用方式,只能使用显示类型法。
-
类模板在模板参数列表中有默认参数
(比如上面的:template<class Nametype,class Agetype=int>
在之后的构造对象后,可以不显示后面Agetype的类型
Person
p2("bbb,20") )
4.类模板中成员函数创建时间
- 类模板中的成员函数,并不是一开始就创建的,而是在模板类调用时(创建模板类的对象),才生成
5.类模板成员函数类外实现
//类模板成员函数类外实现
#include <iostream>
using namespace std;
#include <String>
template<class Nametype, class Agetype>
class Person {
public:
Person(Nametype name, Agetype age);//只写函数声明
/*{p_name = name;
p_age = age; }*/
void showPerson();//只写函数声明,定义在类外实现
/*{cout << p_age << p_name << endl;}*/
Nametype p_name;
Agetype p_age;
};
//构造函数类外实现
//是类模板的类外实现,要加模板的参数列表----模板参数名表
template<class Nametype, class Agetype>
Person<Nametype, Agetype>::Person(Nametype name,Agetype age) {
p_name = name;
p_age = age;
}
//成员函数在类外实现
//是类模板的类外实现,要加模板的参数列表----模板参数名表
template<class Nametype, class Agetype>
void Person<Nametype, Agetype>::showPerson() {
cout << p_age << p_name << endl;
}
void test04() {
Person<string, int> p1("aaa", 10);
p1.showPerson();
}
int main() {
test04();
}
/*10aaa*/
- 在类模板外部定义的类模板的成员函数 必须是函数模板
- 是类模板的类外实现,要加模板的参数名列表----模板参数名表,它实际上是一个模板实例化的类型实参表,不用带class/typename