函数模板与类模板

C++提供两种模板机制:函数模板,类模板。
函数模板:
建立一个通用函数,其返回值类型和形参类型不具体确定,用一个虚拟的类型来代替。
如:void test(int a);其中的void和int可以先不确定,等执行的时候在确定。
语法:

template<typename T>

template - 声明创建模板
typename - 表明其后面的符号是一种数据类型,可以用class代替
T - 通用的数据类型,名称可以替换,通常为大写字母

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
template<typename T>
void Swap(T &a, T &b) {
	T temp = a;
	a = b;
	b = temp;
}
int main() {
	int a = 5;
	int b = 15;
	Swap(a, b);//自动类型推导
	//Swap<int>(a,b)这种方法也可以
	cout << a << endl;
	cout << b << endl;
	double c = 0.4;
	double d = 4.6;
	Swap(c, d);
	//Swap<double>(c,d);
	cout << c << endl;
	cout << d << endl;
	system("pause");
	return 0;
}

注意事项:
自动类型推导 ,必须推导出一致的数据类型T,才可以使用
模板必须要确定出T的数据类型,才可以使用

template<typename T>
void test() {
	cout << "etjklaj" << endl;
}

这样调用上面这个函数的话就不能用自动类型推导了,要给定类型
如:test< int >();

普通函数与 函数模板的调用规则:
1.如果函数模板 和普通函数都可以实现,优先调用普通函数
2.可以通过空模板参数列表来强制调用函数模板,例:Swap<>(参数,…,)
3.函数模板也可以发生重载(参数个数的不同)
4.如果函数模板可以产生更好的匹配,优先调用函数模板(如果调用普通函数需要强制类型转换,则优先调用模板)

类模板

建立一个通用类,类中的成员数据类型可以不具体制定,用一个虚拟的类型来代表。

template<typename Typename,typename Typeage>
class Person {
public:
	Person(Typename name, Typeage age) {
		this->m_name = name;
		this->m_age = age;
	}
	Typename m_name;
	Typeage m_age;
};
void test() {
	Person<string,int> p1("zhang", 24);
	cout << p1.m_name << endl;
	cout << p1.m_age << endl;

}

类模板与函数模板的区别:
1.类模板没有自动类型推导的使用方式。
2.类模板在模板参数列表中可以有默认参数。

template<typename Typename,typename Typeage=int>

类模板与继承:
当类模板碰到继承时,需要注意以下几点:
1.当子类继承的父类是一个类模板时,子类在声明的时候,需指定出父类中的T的类型。
2.如果不指定,编译器无法给子类分配内存

class Person {
public:
	T m_age;
};
class son :public Person<int> {//要指定出T的类型

};

3.如果想灵活指出父类中T的类型,子类也需变为类模板

template<typename T>
class Person {
public:
	T m_age;
};
template<typename T1, typename T2>
class son :public Person<T2> {
	T1 m_n;
};
void test() {
	son<int ,char> s;//类模板必须指定传入类型

}

类模板成员函数类外实现时,要加上模板参数列表

template<typename T1,typename T2>
class Person {
public:
	Person(T1 mame, T2 age);
	void show();
	T1 m_name;
	T2 m_age;
};
template<typename T1, typename T2>
Person<T1,T2>::Person(T1 name, T2 age)
{
	this->m_age = age;
	this->m_name = name;
}
template<typename T1, typename T2>
void Person<T1, T2>::show() {
	cout << "姓名" << this->m_name << endl;
	cout << "年龄" << this->m_age << endl;
}
void test() {
	Person<string, int> p("zhai", 43);
	p.show();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值