07模板学习之模板类的static数据成员的归属问题
1 模板类的static数据成员的归属问题分析
从上面的图分析,先看类模板中的static int a,若类模板中声明了static数据,那么该a是属于类模板还是属于具体类呢?假设属于类模板,那么通过继承后,所有的具体类将继承类模板的a,也就是说,该类模板的a在所有继承的具体类对象中共享,这样肯定是不合理的。所以我们猜测类模板的static数据属于具体类下面代码例子将演示这一点。
对比普通类的static数据,该数据也是属于具体类的,即该类的所有对象共享该数据成员,其它类不可能访问得到它。
2 例子解析
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
template<class T>
class Person{
public:
static int a;
};
//类外初始化
template<class T> int Person<T>::a = 0;
int main(void){
Person<int> p1, p2, p3;
Person<char> pp1, pp2, pp3;
p1.a = 10;
pp1.a = 100;
cout << p1.a << " " << p2.a << " " << p3.a << endl;
cout << pp1.a << " " << pp2.a << " " << pp3.a << endl;
return 0;
}
先假设上面的代码结果:
1)若static数据成员归模板所有,那么两个具体类int,char会共享同一个static数据,结果应该是最后一次static的改动,也就是都为100。
2)若static数据成员归具体类所有,那么int具体的所有对象都共享a,char具体类也如此,即输出应该为10 10 10, 100 100 100。
结果如下:
即模板的static数据成员属于具体类。
3 总结
- 模板类中的static数据成员属于具体的类,不属于模板类自己。