翁恺C++学习记录(一)模板

模板

为什么使用模板(Why templates?)

代码重用

  1. 泛型编程
  2. 将数据类型作为函数或类的参数

函数模板(Function Templates)

函数模板为可视为函数声明

template <class T>
void swap( T& x, T& y)
{
	T temp = x;
	x = y;
	y = temp;
}

template 模板的关键字
将T作象征数据类型

使用函数模板

//相当于函数重载,编译器会重新制造不同的同名函数
int i = 3;
int j = 4;
swap(i , j)

float k = 4.5;
float m = 3,7;
sawp(k, m);

std::string s("Hello");
std::string t("World");
swap(s, t);

模板的作用是告诉编译器如何制造新的函数

正确使用swap()

swap(int, int); //ok

sawp(double, double);//ok

swap(int, double);//error!

使用函数模板时数据之间没有隐式转换

函数重载规则

  1. 编译器查找唯一的匹配函数
  2. 编译器查找唯一的匹配函数模板
  3. 编译器查找匹配的重载函数

类模板

template <class T>
class Vector
{
public:
	Vector(int);
	~Vector();
	Vector(const Vector&);
	Vector& operator=(const Vector&);
	T& operator[] (int);
private:
	T* m_elements;
	int m_size;
};

类模板成员函数
每一个函数都是函数模板,都要加上

template <class T>
Vector<T>::Vector(int size) : m_size(size)
{
m_elements = new T[m_size];
}

template <class T>
T& Vector<T>::operator[] (int index)
{
	if (index < m_size && index > 0)
	{
		return m_elements[index];	
	}
	else
	{
	...
	}
}

使用类模板

Vector<int> v1(100);
Vector<Complex> v2(256);

v1[20] = 10;
v2[20] = v1[20]; // ok if int->Complex

其他

多参数类模板

template <class Key, class Value>
class HashTable
{
	const Value& lookup(const Key&) const;
	void install(const Key&, const Value&);
	...
};

Vector< vector< double *> > 
Vector< int (*)vector< double>&, int> 
template <class T, int bounds = 100>
class FixedVector
{
	public:
			FixedVector();
			//...
			T& operator[] (int);
	private:
			T elements[bounds];
};

usage

FixedVector<int, 50> v1;
FixedVector<int, 10*5> v2;
FixedVector<int> v3;

类模板的继承


 1. Templates can inherit from non-template class
 2. Templates can inherit from temlate class
 3. Non-tempalte class can inherit from tempaltes

类模板的实现原理

两次编译
相当于先制造一个模子,在根据模子制造函数
.cpp文件----》 .i文件(无脑预编译)----》 .obj文件(汇编)----》.exe(链接形成)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值