08 - 静态成员变量和静态函数
有时候让类的所有对象都包含某个变量的副本是没必要的,例如计数器,每个对象都能通过这个计数器获得自己的ID,但没必要让每个对象都有计数器的副本。
静态成员变量便派上用场。
静态成员变量
静态成员变量,在编译期就已经在静态变量区明确了地址,所以生命周期为程序从开始运行到结束,作用范围为与普通的成员变量相同。这些对于类的静态成员变量同样适用。
类的静态成员变量因为创建在静态变量区,所以直接属于类,也就是可以直接通过类名来调用,当然通过对象调用也可以。
class Test
{
public:
static unsigned i;
};
unsigned Test::i = 233;
需要注意的是,静态成员变量必须在类外进行初始化,否则会报未定义的错误,不能用构造函数进行初始化。因为静态成员变量在静态变量区,只有一份,而且静态成员变量在编译期就要被创建,成员函数那都是运行期的事情了 。
内联变量
从C++17开始,可将静态数据成员声明为inline
。这样做的好处是不必在源文件中为它们分配空间:
class Test
{
public:
static inline unsigned i = 233;
}
静态成员函数
静态成员函数就是为静态成员变量设计的,就是为了维持封装性。
class Test
{
public:
static unsigned getI() { return i; }
private:
static inline unsigned i = 233;
};
int main()
{
std::cout << Test::getI() << std::endl;
return 0;
}
参考资料
- 飘零的落花 - 现代C++详解
- C++20高级编程