您的位置:首页 > 编程语言 > C语言/C++

C++ 泛型程序设计 模板

2018-01-09 22:38 197 查看

泛型程序设计之模版 :

C++提高代码可重用性一般体现在两个地方,一个是继承,一个是泛型程序设计中的模版。泛型程序设计就是指一种算法在实现时不指定特定的数据类型的程序设计方法。所谓泛型,就是指算法只需要实现一遍,并且能够适应多种数据类型,可以减少重复代码的编写。也可以说泛型程序设计就是编写大量的模版,模版就是编写一遍算法适用于不同的数据类型,模版可以分为函数模版和类模版两种。

函数模版

函数模版提高了代码的可重用性和可扩充性,就是相当于自己制造了一个模具所有的东西都可以通过这个模具批量生成,由模板生成的函数叫做模板函数,函数模版的语法说明。

template <class T1,class T2,......> // class 代表参数的类型,类型可以用在声明参数,也可以用在声明返回值类型。
返回值 模板名 (也可以叫函数名) 形参表 {
函数体
}

比如 :
template <class T> /
void Swap (T & a,T & b) {
T temp = a;
a = b;
b = temp;
}


拿上面的 swap 函数来说,有了这个模版以后,编译器会根据参数类型需要生成多了 swap 函数,这样就增大了代码的可重用性和可扩充性。

模板生成函数的原理 :

编译器由模板生成模板函数的时候,会使用具体的类型对模板中所有的类型进行替换,其它部分则原封不动的保留。编译器编译该语句的时候,会根据实参的类型判断如何替换模板中的数据类型。

函数调用中调用语句的匹配顺序

先找类型完全相同的普通函数

再找类型完全匹配的模版函数

最后找可以进行自动类型转化后可以匹配的模板函数

找不到 报错 !

函数模板实例

#include <iostream>

using namespace std;

const int maxn = 1005;

template <class T,class Pred>
void Map (T a,T b,T c,Pred op) {
for (;a != b; ++ a, ++ c) {
*c = op (*a);
}
}

double cube (double x) {
return x * x * x;
}

double square (double x) {
return x * x;
}
double b[5];

void print () {
for (int i = 0;i < 5; ++ i) {
cout << b[i] << endl;
}
}

double a[5] = {1,2,3,4,5};
int main () {
Map (a,a + 5,b,cube);
print();
Map (a,a + 5,b,square);
print();
return 0;
}


2.类模版

人们为了减少编写相似的函数,便出现了函数模版,人们为了减少编写相似的类于是也就出现了类模板,编译器可以从类模版中生成多个类,减少程序员的劳动。由模板产生的类叫做模板类

C++ 中类模板的语法如下 :

template <class T1,...>  //类型参数表
class 类模版名 (也可以叫类名) {
成员变量 和 成员函数;
}

类模板的实例化需要在实例化的时候就指明参数类型
类模版名 <真实类型参数表> 对象名 (构造函数实参表)
这样实例化类模版

类模版的成员函数在定义的时候还是需要这样写 (就是模板部分要写出来)

template <class T1,class T2>
bool Pair <T1,T2>:: operator < (const Pair <T1,T2> & p) const {
return key < p.key;
}

像这样才可以定义成员函数


类模板的实例

#include <iostream>
#include <cstring>
#include <string>
using namespace std;

template <class T1,class T2>
class Pair {
public :
T1 key;
T2 value;
Pair (T1 k,T2 v) : key (k),value (v) {};
bool operator < (const Pair <T1,T2> & p) const;
};

template <class T1,class T2>
bool Pair <T1,T2>:: operator < (const Pair <T1,T2> & p) const {
return key < p.key;
}

int main () {
ios_base :: sync_with_stdio(false);
Pair <string,int> student ("Tom",19); //实例化一个类
cout << student.key <<' ' << student.value << endl;
return 0;
}


不明白的地方看代码体会一下就好了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: