自学C++ day04 模板

// 模板 (template): 泛型编程,类型占位符
// 1. 函数模板
// 2. 类模板

// 函数模板: 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数话根据实参类型产生函数的特定类型版本!
// 函数模板格式:
//		template<typename T1,template T2 template T3 ... template Tn> 
//		返回值类型 函数名 (参数列表) {}	

template <typename T>
void swap(T& left, T& right) {
	T tmp = left;
	left = right;
	right = left;
}
// 注: typename 是用来定义模板参数的关键字,也可以使用class但是不能用struct代替class

// 在编译阶段,对于模板函数的使用,编译器需要根据传入实参类型来推演生成对应类型的函数以供调用;

// 函数模板的实例化
// 1. 隐式实例话
template<class T>
T add(const T& a, const T& b) {
	return a + b;
}

#if 0
int main() {
	int a1 = 10, a2 = 20;
	double d1 = 10.0, d2 = 20.0;
	add(a1, a2);
	add(d1, d2);
	add(a1, (int)d1);
	return 0;
}
#endif 

//2. 显示实例化
#if 0
int main() {
	int a = 10;
	double d = 10.0l;
	add<int>(a, d);
	return 0;
}
#endif
// 一个非模板函数可以和一个同名的模板函数同时存在,而且模板函数还可以被实例化成为这个非模板函数!
// 对于非模板函数和同名的模板函数,如果其他条件都相同,在调用时会优先调用非模板函数而不会从该模板产生一个实例.
// 如果模板可以产生一个具有更好匹配的函数,那么将选择模板!




// 类模板:
// template <class T1,class T2 ... class Tn>
// class 类模板名{};

template<class T>
class Vector {
public:
	Vector(size_t capacity = 10):_pData(nullptr),_size(0),_capacity(capacity){}
	~Vector();
private:
	T* _pData;
	size_t _size;
	size_t _capacity;
};
// 注意: 类模板中函数放在类外进行定义时,需要加模板参数列表!
template<class T> 
Vector<T>::~Vector() {
	if (_pData) delete[] _pData;
	_size = 0;
	_capacity = 0;
}
// 类模板的实例化!
// 类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后面跟<>,将实例化的类型放入<>中,
// 类模板名字不是真正的类,实例话的结果才是真正的类!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值