02.02_111期_C++_模板笔记

使用函数模板 实现一个函数就可以起到上面三个函数才能起到的作用
当数据类型是int时,编译器生成一个函数,其形参类型都是int
当数据类型时double时,编译器生成一个函数,其形参类型都是double
在写入template<typename T>这句代码时可以生成多个参数
其函数模板的格式是template<typename T1, typename T2>
编译通过实参的类型,推出函数中的数据类型,生成对应的函数,这个过程叫模板实例化

下面两个函数模板中的函数名称可以相同
自定义类型的函数名也可以和函数模板的名称相同

template<class T>
T Add(const T& left, const T& right)
{
	return left + right;
}

template<class T1, class T2>
T1 Add(T1 left, T2 right)
{
	return left + right;
}

int Add(const int& left, const int& right)
{
	return left + right;
}
//类模板
template<class T>
class Stack
{
public:
	void Push(const T& x)
	{}
private:
	T* _a;
	int _top;
	int _capacity;
};
int main()
{
	int a1 = 10, a2 = 20;
	double d1 = 10.111, d2 = 20.111;
	//1. 如果调用的是具有模板的函数,编译器将会根据传入的数据去推演形参的类型
	//2. 如果像下面这种方式进行函数调用,可以称之为显示实例化
	//	 那么编译器会直接将形参理解为<>中的数据类型
	cout << Add<double>(a1, a2) << endl;
	cout << Add<int>(d1, d2) << endl;
	
	//	下面第一行代码会调用模板T1 Add(T1 left, T2 right)
	//		第二行代码会调用int Add(const int& left, const int& right)
	//			  (如果模板和int Add(const int& left, const int& right)同时存在,
	//			   由于调用int Add(const int& left, const int& right)需要类型转换
	//			   所以会实例化模板
	//		第三行会直接通过显示实例化调用模板
	// 总结:显示实例化 > 参数类型匹配的自定义函数 > 模板 > 参数不匹配需要强转的自定义函数
	cout << Add(a1, a2) << endl;
	cout << Add(d1, d2) << endl;
	cout << Add<double>(a1, a2) << endl;

	//使用类模板,生成两个不同的栈类,不同之处在于存放的数据类型不同
	Stack<int> st1;
	Stack<double> st2;

	return 0;
}

10 C++中使用模板类的原因

        10.1 模板可以具有非类型参数,用于指定大小,可以根据指定的大小创建动态结构

        10.2 模板最重要的一点就是类型无关,提高了代码复用性

        10.3 只要支持模板语法,模板的代码就是可移植的

注意:模板运行时不检查数据类型,也不保证类型安全,相当于类型的宏替换

13 模板声明的几种方式

        13.1 template<class T1,class T2>

        13.2template<typename T1,typename T2>

        13.3template<class T1,typename T2>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值