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高级编程