首先我们知道,在类中,static关键字修饰的成员属于整个类,即类定义的所有关键字共享同一个static成员,如果不了解可以查看这篇博文:
那么在模板类中的静态成员是否是属于该模板所能代表的所有类型的类呢?下面通过一个程序测试一下:
1. #include <iostream> 2. using namespace std; 3. 4. template<typename user_t> 5. class MyClass 6. { 7. public: 8. static user_t a; 9. }; 10. 11. template<typename user_t> 12. user_t MyClass<user_t>::a = 0; 13. 14. int main() 15. { 16. MyClass<int> m1, m2; 17. m1.a++; 18. m2.a++; 19. cout << "m1.a: " << m1.a << endl; 20. cout << "m2.a: " << m2.a << endl; 21. 22. MyClass<char> m3, m4; 23. m3.a = 'a'; 24. m4.a++; 25. cout << "m1.a: " << m1.a << endl; 26. cout << "m2.a: " << m2.a << endl; 27. cout << "m3.a: " << m3.a << endl; 28. cout << "m4.a: " << m4.a << endl; 29. 30. system("pause"); 31. return 0; 32. }
通过程序运行结果可以看到
这说明并不是所有类型的类都共享同一个静态成员。实际上模板类中的静态成员,同一个类型的类共享一个静态成员的副本。也就是说 MyClass<int> 定义的对象共享一个静态成员,MyClass<char> 也有自己的一个静态成员,以此类推,每个类型定义的对象都共享自己的静态成员。