模板之类模板

来源:互联网 发布:VPN连接用哪个端口 编辑:程序博客网 时间:2024/05/01 16:56
为什么要定义模板:
例如:在比较两个值的大小的时候,我们可能会想比较int 和 int ,double 和 double 又或者是各种类类型的的。
这时候,可能会想着去重载函数来实现目的。当需要比较很多类型的时候,这些重载的工作就会显得重复和多余。
这时候,我们就可以定义一个函数模板来实现目的。

”一个C++的参数化模型被称为一个类模板。类模板可以描述如何构造出一些个别类,其方式很像在类里如何构造出个别对象。“
例如:
#include <iostream>

using namespace std;

template <class T>
class vector
{
private :
 T * v;
 int sz;
public :
 vector(int);
 T &operator [] (int);
 T elem(int i) { return v[i]; }
};

类模板的使用:
vector<int> v1(30);
typedef vector<int> ivec;

ivec v2(40);

void f()
{
    v2[2] = 100;
}

类模板的使用并不困难,有人甚至认为类模板比内置的数组更加易读,如果觉得类模板名字过长,可以通过typedef去缩短名字。
值得注意的是,模板使用的是尖括号,不是圆括号,这是为了强调模板参数具有不同的性质(他们将在编译期间求值)。

与其他类相同,我们既可以在类模板的内部也可以在类模板的外部定义成员函数,且定义在类模板内的成员函数被隐式的声明成内联函数。
类模板的成员函数本身是一个普通函数。但是,类模板的每个实例都有其自己版本的成员函数。因此,类模板的成员函数和模板具有相同的模板参数。所以,在定义类模板之外的成员函数就必须以关键字template开头,厚街模板参数列表(参数列表必须和所属类的模板参数列表相同):
#include <iostream>using namespace std;template <class T>class vector{private : T * v; int sz;public : vector(int); T &operator [] (int); T elem(int i) { return v[i]; }};template <class T>vector<T>::vector(int i){ v = new int[i];}template <class T>T &vector<T>::operator [] (int i){ cout << "operator [] is running" << endl; return *(v + i);}int main(){ vector<int> v(10); cout << v.elem(2) << endl; system("PAUSE"); return 0;}


需要注意的是,这里的模板类是vector<T>不是vector。而在默认情况下,一个类模板的成员函数只有当程序用到它的时候才会实例化。

0 0
原创粉丝点击