C++核心编程-01模板

C++核心编程-01模板

1.1 函数模板

1.1.1函数模板的基本语法

(1)语法

template<typename T>
函数声明或定义
  • template — 声明创建模板
  • typename — 表面其后面的符号是一种数据类型,可以用class代替(两者效果一样)
  • T — 通用的数据类型,名称可以替换,通常为大写字母

(2)使用函数模板的两种方式

  • 1)自动类型推导
	mySwap(a, b);
  • 2)显示指定类型
	mySwap<int>(a, b);

1.1.2 函数模板注意事项

  • 自动类型推导,必须推导出一致的数据类型T,才可以使用;
  • 模板必须要确定出T的数据类型,才可以使用。

1.1.3 普通函数与函数模板的区别

  • (1)普通函数可以发生隐式类型转换
  • (2)函数模板 用自动类型推导,不可以发生隐式类型转换
  • (3)函数模板 用显示指定类型,可以发生隐式类型转换

1.1.4 普通函数和函数模板的调用规则

  • (1)如果函数模板和普通函数都可以调用,优先调用普通函数
  • (2)可以通过空模板参数列表强制调用函数模板
myPrint<>(a, b);
  • (3)函数模板可以发生函数重载
  • (4)如果函数模板可以产生更好的匹配,优先调用函数模板

1.1.5 模板的局限性

模板并不是万能的,有些特定的数据类型,需要用具体化方式做特殊实现

//对比两个数据是否相等函数
template<typename T>
bool myCompare(T& a, T& b)
{
	if (a==b)
	{
		return true;
	}
	else
	{
		return false;
	}
}

//利用具体化Person的版本实现代码,具体化优先调用
//具体化,显示具体化的原型和定意思以template<>开头,并通过名称来指出类型
template<> bool myCompare(Person& a, Person& b)
{
	if (a.m_Name==b.m_Name && a.m_Age==b.m_Age)
	{
		return true;
	}
	else
	{
		return false;
	}
}

1.2 类模板

1.2.1 类模板的语法

语法:

template<typename T>
  • template — 声明创建模板
  • typename — 表面其后面的符号是一种数据类型,可以用class代替(两者效果一样)
  • T — 通用的数据类型,名称可以替换,通常为大写字母

例如:这里创建了一个Person类

//类模板
template<class NameType, class AgeType> 
class Person
{
public:
	Person(NameType name, AgeType age)
	{
		this->mName = name;
		this->mAge = age;
	}
	void showPerson()
	{
		cout << "name: " << this->mName << " age: " << this->mAge << endl;
	}
public:
	NameType mName;
	AgeType mAge;
};

注意:在使用类模板的时候,要使用”显示指定类型“的方式,指出用的是什么类型

void test01()
{
	// 指定NameType 为string类型,AgeType 为 int类型
	Person<string, int>P1("孙悟空", 999);
	P1.showPerson();
}

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

  • (1)类模板没有自动类型推导的使用方式,必须使用显示指定类型的方式,使用类模板
  • (2)类模板在模板参数列表中可以有默认参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值