目录
在类模板中可以定义静态数据成员,类模板中的每个实例都可以有自己的静态数据成员,而不是所有的类模板实例共享静态数据成员。
1、实现方法
1)、定义一个类模板template <class Type>
并在其模板类class CList中定义静态数据成员;
2)、定义一个模板类class CNode;
3)、定义一个模板类class CNet;
4)、分别定义每个模板的实例;
5)、每个实例中分别调用静态数据成员;
2、一个实现例源码
/*类模板的静态数据成员*/
#include <iostream>
using namespace std;
template <class Type>
//定义CList类
class CList
{
private:
/*Type *m_pHeader;
int m_NodeSum; */
public:
static int m_ListValue; //定义静态数据成员,不可以在类内初始化静态变量,须类外初始化
/*CList()
{
m_pHeader = NULL;
m_NodeSum = 0;
}*/
};
//定义CNode类
class CNode
{
//public:
// CNode *m_pNext=NULL; //指针初始化,否则警告C26495
// int m_Data = {}; //初始化,否则警告C26495
// CNode()
// {
// m_pNext = NULL;
// }
};
//定义CNet类
class CNet
{
//public:
// CNet *m_pNext=NULL; //指针初始化,否则警告C26495
// char m_Data = {}; //初始化,否则警告C26495
// CNet()
// {
// m_pNext = NULL;
// }
};
//定义类模板
template <class Type>
int CList<Type>::m_ListValue = 10; //初始化静态数据成员,因为类型为Type,所以无论以后定义任何类型的实例,其初始值均为10
//main函数
int main(int argc, char* argv[])
{
CList<CNode> nodelist; //定义CList类的实例对象nodelist,数据类型是CNode
cout << nodelist.m_ListValue << endl;//不重新赋值,默认执行初始化数值,只要重新复制后,就执行新值
nodelist.m_ListValue = 2023; //如果不重新赋值,只要是<CNode> 的实例,静态数据成员值不改变
CList<CNet> netlist; //定义CList类的实例对象netlist,数据类型是CNet
netlist.m_ListValue = 520;
cout<<"今年是:";
cout<<nodelist.m_ListValue<< endl;
cout<<"代表“我爱你”的数字是:";
cout<<netlist.m_ListValue<<endl;
CList<CNode> nodelist1; //再次定义一个CNode类型的实例nodelist1,不重新赋值,测试其静态数据成员值不改变
cout << nodelist1.m_ListValue << endl;
CList<CNode> nodelist2; //再次定义一个CNode类型的实例nodelist2,重新赋值,测试其静态数据成员值改变了
nodelist2.m_ListValue = 2022;
cout << nodelist2.m_ListValue << endl;
CList<CNet> netlist1; //同上
cout << netlist1.m_ListValue << endl;
return 0;
}
/*运行结果:
10
今年是:2023
代表“我爱你”的数字是:520
2023
2022
520 */
3、特别注意的事项:
1)、int CList<Type>::m_ListValue = 10; 初始化静态数据成员,因为类型为Type,所以无论以后定义任何类型的实例,其初始值均为10;
2)、CList<CNode> nodelist1; cout << nodelist1.m_ListValue << endl; 再次定义一个CNode类型的实例nodelist1,不重新赋值,测试其静态数据成员值不改变
3)、CList<CNode> nodelist2; nodelist2.m_ListValue = 2022; cout << nodelist2.m_ListValue << endl; 再次定义一个CNode类型的实例nodelist2,重新赋值,测试其静态数据成员值改变了;
4、总结:
静态变量在类中,不属于实例对象,属于类所有;
实例变量是某个对象的属性;