模板的使用

模板

模板的概念:模板就是建立一个通用的模具,大大提高复用性
c++中模板机制分为两类

函数模板

建立一个通用函数,其函数返回值类型和形参类型可以不具体定制,用一个虚拟的类型来代表

template<typename T>
//template		声明创建模板
//typename 		表明其后面的符号是一种数据类型,可以用class代替
//T				通用的数据类型,名称可以替换,通常是大写字母
// 定义一个模板,告诉编译器后面这个函数中的T是通用数据类型
template<typename T>
void myswap(T a,T b) {

}

int main() {
	int a = 10, b = 20;
	// 使用模板的两种方式
	//1. 自动类型推导
	myswap(a, b);
	//2. 显示指定类型,指定告诉模板类型
	myswap<int>(a, b);
	//空模板的参数列表强制调用模板
	myswap<>(a, b);
}

普通函数与函数模板的调用规则

  1. 如果函数模板和普通模板都可以调用,优先调用普通模板
  2. 可以通过空模板参数列表,强制调用函数模板
  3. 函数模板可以发生参数重载
  4. 如果函数模板可以产生更好的匹配,优先调用函数模板

类模板

类模板作用:建立一个通用类,类中的成员数据类型可以不具体指定,用一个虚拟的类型来代表


template<typename T1, typename T2=int>
class Person {
public:
	T1 name;
	T2 age;
};

类模板和函数模板的区别:

类模板可以有默认参数,函数模板没有
类模板调用的时候只能使用显示调用,不能使用自动推导方式

类模板的成员函数和普通成员函数:

类模板中的成员函数调用时才会创建
普通类的成员函数一开始就能创建

类模板对象做函数参数

指定传入的类型 直接显示对象的数据类型
参数模板化 将对象中的参数变为模板进行传递
整个类模板化 将这个对象类型模板化进行传递

template<typename T1, typename T2>
class Person {
public:
	Person(T1 m_name, T2 m_age) {
		name = m_name;
		age = m_age;
	}
	T1 name;
	T2 age;
};
// 指定传入类型
void printPerson1(Person<string, int>&p) {

}

// 参数模板化
template<typename T1, typename T2>
void printPerson2(Person<T1, T2>&p) {

}
//整个类模板化
template<typename T1>
void printPerson2(T1 &p) {

}
int main() {
	Person<string, int>p("zhangsan ", 14);
	printPerson1(p);

}

当类模板碰到继承时,需要注意几点

当子类继承的父类是一个类模板时,子类在声明的时候要指出父类中T的数据类型
如果不指定,编译器无法给 子类分配内存
如果想灵活指出父类中T的类型,子类也需要变成类模板

template<typename T1, typename T2>
class Person {
public:
	Person(T1 m_name, T2 m_age) {
		name = m_name;
		age = m_age;
	}
	T1 name;
	T2 age;
};
// 指出父类的模板类型
class Son :public Person<int, int> {

};
// 将子类变成模板
template<typename T1, typename T2>
class gail :public Person<T1, T2> {

};

模板的类外实现

template<typename T1, typename T2>
class Person {
public:
	Person(T1 m_name, T2 m_age);
	T1 name;
	T2 age;
};
//类模板的类外实现
template<typename T1, typename T2>
Person<T1, T2>::Person(T1 m_name, T2 m_age) {

}

类模板分文件编写

类模板在成员函数创建时机是调用阶段,导致分文件编写时连接不到
解决方法1 :直接包含.cpp源文件
解决方法2:将声明和是心啊卸载同一个文件中,并更改后缀名为hpp,hpp是约定的名称,并不是强制

你可能感兴趣的:(c++,c++)