C++ 模板详解(函数模板、类模板)

C++模板详解

模板概念

模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。

模版可以分为两类,一个是函数模版,另外一个是类模版。
函数模板针对仅参数类型不同的函数
类模板针对仅数据成员和成员函数类型不同的类。

说明: template是一个声明模板的关键字,表示声明一个模板关键字class不能省略,如果类型形参多余一个 ,每个形参前都要加class <类型 形参表>可以包含基本数据类型可以包含类类型

注意:模板的声明或定义只能在全局,命名空间或类范围内进行。即不能在局部范围,函数内进行,比如不能在main函数中声明或定义一个模板

函数模板

格式:Template <class/typename 形参名, class/typename 形参名>
返回类型 函数名(形参表){//函数定义体 }

函数模板示例:

#include <iostream>
using namespace std;
template <typename T>
T Add(T left, T right)
{
       return left + right;
}
int main()
{
       Add(1, 2);
       Add(1.0, 2.0);
       Add('1', '1');
       Add(1, 1.0);//error:模板参数“T”不明确
       //模板函数不会进行类型转换
       Add<int>(1, '1');//显式实例化
       Add<double>(1, 1.0);
       Add(1, (int) 1.0);//隐式实例化
       return 0;
}

类模板

一个类模板(也称为类属类或类生成类)同意用户为类定义一种模式。使得类中的某些数据成员、默写成员函数的參数、某些成员函数的返回值,能够取随意类型(包含系统提前定义的和用户自己定义的)
假设一个类中数据成员的数据类型不能确定。或者是某个成员函数的參数或返回值的类型不能确定。就必须将此类声明为模板,它的存在不是代表一个详细的、实际的类,而是代表着一类类。
类模板的使用实际上是将类模板实例化成一个详细的类。它的格式为:类名<实际的类型>。 模板类是类模板实例化后的一个产物

类模板与模板类的区别:
类模板是模板的定义,不是一个实实在在的类,定义中用到通用类型参数。
模板类是实实在在的类定义,是类模板的实例化。类定义中参数被实际类型所代替

格式:Template < class/typename T >
class 类名{
//类定义......
};

在类模板外部定义成员函数的方法为:template<模板形参列表> 函数返回类型 类名<模板形参名>::函数名(参数列表){函数体}

类模板示例:

#include <iostream>
using namespace std;
template<typename T1, typename T2>
class myClass
{
private:
       T1 I;
       T2 J;
public:
       myClass(T1 a, T2 b);
       void show();
};
template<typename T1, typename T2>
myClass<T1, T2>::myClass(T1 a, T2 b) :I(a), J(b)
{
}
template<typename T1, typename T2>
void myClass<T1, T2>::show()
{
       std::cout << "I=" << I << ", J=" << J << std::endl;
}
int main(void)
{
       myClass<int, int>c1(3, 5);
       c1.show();
       myClass<int, char> class2(1, 'a');
       class2.show();
       myClass<double, int> class3(2.9, 10);
       class3.show();
       return 0;
}

模板形参

有二种类型的模板形参:类型形参,非类型形参
1、类型形参由关键字class或typename后接说明符构成
2、 模板的非类型形参也就是内置类型形参, 只能是整型,指针和引用
3、调用非类型模板形参的实参必须是一个常量表达式

默认模板类型形参:
1、可以为类模板的类型形参提供默认值,但不能为函数模板的类型形参提供默认值。函数模板和类模板都可以为模板的非类型形参提供默认值
2. 类模板的类型形参默认值形式为:template<class T1, class T2=int> class A{};为第二个模板类型形参T2提供int型的默认值。

非类型模板参数举例:

#include <iostream>
using namespace std;
template<typename T, int MAXSIZE>
class Stack {
Private:
       T elems[MAXSIZE];};
int main()
{
       Stack<int, 20> int20Stack;
       Stack<int, 40> int40Stack;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值