第八章、模板

第八章、模板

1.1、函数模板

一、定义
template<class 类型名1,class 类型名2,…>
返回类型 函数名(形参表){
	函数体;
}
【例】
用一个函数表示逻辑功能相同但参数类型不同的函数
#include <iostream>
using namespace std;
template<class T>
void Swap(T & x, T & y){
    T tmp = x;
    x = y;
    y = tmp;
}
int main(){
    int n = 1, m = 2;
    Swap(n, m);  //编译器自动生成 void Swap (int &, int &)函数
    double f = 1.2, g = 2.3;
    Swap(f, g);  //编译器自动生成 void Swap (double &, double &)函数
    return 0;
}

二、模板合法写法
#include <iostream>
using namespace std;
template <class T>
T Inc(int n){
    return 1 + n;
}
int main(){
    cout << Inc<double>(4) / 2;
    return 0;
}
Inc(4)指明了此处实例化的模板函数原型应为:double Inc(double);
编译器不会因为实参 4 是 int 类型,就生成原型为 int Inc(int) 的函数。因此,上面程序输出的结果是 2.5 而非 2。
函数模板中可以有不止一个类型参数。例如,下面这个函数模板的写法是合法的:
template <class Tl, class T2>
T2 print(T1 argl, T2 arg2)
{
    cout << arg1 << " " << arg2 << endl;
    return arg2;
}

1.2、类模板

一、定义
(1)template <class 参数化类型1,class 参数化类型2,……,普通类型1,普通类型2,……>
class 类模板名{
    成员函数和成员变量
};
利用类模板可以建立支持各种数据类型的类。
例子:
template<class T>
class Point{
	public:
		Point():x(0),y(0){}
		Point(const T a,const T b);
		void Set(const T a,const T b);
		void Display(){
        	cout<<"Display:"<<"x="<<x<<",y="<<y<<endl;
    	}
	private:
    T x,y;
};
(2)如果在类模板外部定义成员函数,形式为:
template<模板形参表>
返回类型 类名<类型参数表>::函数名(形式参数列表){
	函数体
};
例如:
template<class T>
void Point<T>::Set(const T a,const T b){
	x=a,y=b;
};
(3)用类模板定义对象时,必须为模板形式参数显式指定类型实参,将类模板实例化,一般形式为:
类模板名<类型实参表>对象名列表;
例如:
  Point<int >a,b;
  Point<double>m(1,2),n(3,4);
(4)模板形参表可以是非类型形参,其形式与函数形参表相似:
  template<class T ,int N>
  class Se{
  ...
  };
  template<class T,int N>
  void Se<T,N>::Set(int i, T value)
  {...}
二、优点
  • 通过数据类型参数化实现代码重用
  • STL的基础
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值