静态数据成员的定义
普通类
头文件
class Base{
static const int max_size = 10; // 可以直接在此处定义,也可以在实现文件中定义
static int size; // 不可以直接在此处定义,必须在实现文件中定义
};
实现文件
int Base::size = 0; // 无需带有static关键字
模板类
头文件
class A {
};
template <typename T>
class Base {
static const int max_size = 10; // 可以直接在此处定义,也可以在实现文件中定义
static int size; // 不可以直接在此处定义,必须在实现文件中定义
};
// 方式一:普通
template <typename T>
int Base<T>::size = 10;
// 方式二:特化
template <>
int Base<A>::size = 10;
静态成员的实例可能有多个
- 一个类中的静态数据成员通常只有一个实例,无论有多少这个类的对象,但以下两种情况下会有多个静态数据成员实例:
- 这个类被继承时,继承这个类的派生类会产生一份静态数据成员实例。
- 这个类被内嵌于其他类时,也会再产生一份静态数据成员实例。(嵌套类还是被用作别的类的数据成员?)
- 解决方案:将默认构造函数声明为私有,或者使用C++11的= delete语法,来阻止被继承和被内嵌
静态成员的两种调用方式