模板:模板是对一种对类型进行参数化的工具。
模板的声明或者定义只能在全局,命名空间或者类范围内进行。即不能在局部范围,函数内进行。
函数模板 参数类型不一样的但是功能及函数名一样的函数
函数模板的声明定义语法上差异不大,就像普通函数一样使用
template
T add(T x, T y);
template
C add(C x, C y)
{
return x+y;
}
类模板 成员属性的类型和成员函数的类不一样但是成员属性及函数一样的类
template
class Demo{
public:
Demo(T1 a, T2 b);
void setx(T1 a);
static void sety(Demo &, T2 val);
T1 getx() const;
T2 gety() const;
private:
static T1 x;
T2 y;
};
友元函数模板
如果一个类是模板类,又要实现运算符重载,就是一个友元函数模板;
实质是类模板和函数模板的综合运用
template
class Demo{
public:
Demo(const int val);
public:
T getval() const;
void setval(const int val);
template
friend Demo
private:
T ival;
};
非类型模板参数
template
class Array{
public:
Array();
Array(const Array &);
~Array();
public:
T& at(const int id=0) const;
T& operator[](const int id)const;
private:
T* const buffer;
};
T:模板类型参数;len:模板非类型参数;T、len都可以有默认值