c++类模板和函数模板

 

模板是一种对类型进行参数化的工具,通常有两种形式:函数模板和类模板。
一、函数模板:
通式:
template<class 形参名,class 形参名,...>
函数返回类型 函数名(形参列表)
{
函数体
}
注意:<>括号中的参数为模板形参(有类型模板形参和非类型模板形参),模板形参不能
为空,class可以用typename替换。
template<class T,class T1>
double add(T a,T b)
{
return a+b;
}
函数模板的调用有两种方式:
1.隐示调用,如:add(1,1.3);
2.显式调用,如:add<int,double>(1,3);

非类型模板形参如:

template<int a>
int add(int b)
{
return a+b;
}

此时需用显式调用,add<56>(4); 结果为60
二、类模板:
通式:
template<class T>
class A{
public:
T a;
T add(T a);
};
template <class T>
T A<T>::add(T a)
{
return a; 
}
注意:类模板里的成员函数均是函数模板,在类模板外定义时template后面的模板形参要
与类模板的模板形参一致,且别忘了作用域(上面例子A表示模板,需实例化成具体的类
A<T>)
类模板的使用:
先将模板实例化为具体的类,然后声明对象,如:A<int> a;


三、模板形参
1.类型模板形参
template<class T> void h(T a){};其中T表示的就是一个类型,也叫做类型形参;
不能为一个模板形参指定两个不同的类型,如函数模板
template<class T>void h(T a, T b){},语句调用h(2, 3.2)将出错。
2.非类型模板形参
如,template<class T,int a>
    class A{};
其中Int a就是非类型模板形参
注意:1.非类型模板形参在模板定义的内部是常量值、
2.非类型模板的形参只能是整形,指针和引用。像double,string,float这样的
类型是不允许的。但是double&,double* 是可以的。
3.调用非类型模板形参的实参必须是一个常量表达式。
4.sizeof的结果是一个常量表达式,也能作为非类型模板形参的实参。

 

    附加说明:可以为类模板的类型形参提供默认的值,但不能为函数模板的类型形参提供默认值。类模板和函数模板都可以为模板的非类型形参提供默认值

带默认值的类型形参的模板,如:

template<class T=int>

class B{

};

虽然模板带有默认值,但是定义对象时,仍然需要实例化,B<>不能少,<>里为空表示使用默认的类型参数

template<class T,class T2=int,class T3=char>

class B{

};

当带多个默认类型参数时,规则和带默认参数函数一样

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值