### 定义类模板的静态数据成员

在类模板中用户也可以定义静态的数据成员，只是类模板中的每个实例都有自己的静态数据成员，而不是所有的类模板实例共享静态数据成员。为了说明这一点，笔者对模板类 CList 进行简化，向其中添加一个静态数据成员，并初始化进行静态数据成员。

在类模板中使用静态数据成员

template <class Type> //定义一个模板类

class CList //定义 CList 类

{

private:

Type *m_pHeader; //定义头节点

int m_nNodeSum; //节点数量

public:

static int m_ListValue; //定义静态数据成员

CList() //定义构造函数

{

m_pHeader = NULL; //将 m_pHeader 置为空

m_nNodeSum = 0; //将 m_nNodeSum 置为 0

}

};

template <class Type>

int CList<Type>::m_ListValue = 100; //初始化静态数据成员

下面定义两个模板实例，分别设置并访问各自的静态数据成员。

int main(int argc, char* argv[])

{

CList<CNode> nodeList; //实例化类模板

nodeList.m_ListValue = 200; //设置静态数据成员

CList<CNet> netList; //实例化类模板

netList.m_ListValue = 300; //设置静态数据成员

cout << "nodeList 实例：" << nodeList.m_ListValue << endl; //输出静态数据成员

cout << "netList 实例: " << netList.m_ListValue << endl; //输出静态数据成员

return 0;

}

运行程序，效果如图 1 所示。

图 1 类模板静态数据成员

从图 1 中可以发现，模板实例 nodeList 和 netList 均有各自的静态数据成员。但是，对于同一类型的模板实例，其静态数据成员是共享的。例如：

同一类型的模板实例共享静态数据成员

int main(int argc, char* argv[])

{

CList<CNode> nodeList; //实例化类模板

nodeList.m_ListValue = 200; //设置静态数据成员

CList<CNode> netList; //实例化类模板

netList.m_ListValue = 300; //设置静态数据成员

cout << "nodeList 实例：" << nodeList.m_ListValue << endl; //输出静态数据成员

cout << "netList 实例: " << netList.m_ListValue << endl; //输出静态数据成员

return 0;

}

运行程序，效果如图 2 所示。

图 2 相同类型的模板实例共享静态数据成员

从图 2 中可以发现，类模板实例 nodeList 和 netList 共享静态数据成员，因为他们的模板类均为 CNode。