static关键字总结

hide, share and long live

静态变量及函数

全局静态变量

在cpp文件中声明并初始化的全局变量,生命周期为整个对象的周期,在定义的cpp文件中可见

局部静态变量

在某个程序块中声明并初始化的全局变量,只初始化一次,在定义的程序块中可见,生命周期为整个对象周期。

静态函数

静态函数只能在本文件中使用。

类的静态成员变量(一处变处处变)

类的静态成员为类的所有对象共有,因此具有对象间通信、统计对象个数的作用。可以通过classname.variable直接引用,不需创造对象实例。

1
2
3
4
5
6
7
8
9
10
class Something{
private:
static int s_value; // 一个私有的静态成员变量,这个是声明而非定义
};

int Something::s_value{ 1 }; // 初始化,只能进行一次,实际上是对变量的定义,所以可以访问,但是不能再次定义,否则出现重定义错误

int main(){
// how do we access Something::s_value since it is private?
}

那么我们应当如何访问静态成员变量呢?可以声明一个普通成员函数进行访问,但是这样需要构造具体对象,因此更好的方法是提供一个静态成员函数接口,专门用于访问静态成员变量。

类的静态成员函数(没有this指针)

有一些函数为类层面的方法,不属于任何一个对象,此时定义为静态成员函数,可以通过类名::方法名直接使用,而不需要创建类实例。

  • 非静态成员函数可以调用静态成员函数,反之不行。
  • 静态成员函数能访问静态成员变量,不能访问非静态的成员变量。
1
2
3
4
5
6
7
8
9
10
11
12
class Something{
private:
static int s_value;
public:
static int getValue() { return s_value; } // static member function 专门用于访问静态成员变量,但是不能访问非静态的
};

int Something::s_value{ 1 }; // initializer

int main(){
std::cout << Something::getValue() << '\n';
}

声明为静态的作用

隐藏对象或函数

一个对象如果被声明为静态,那么只对本文件中的对象可见,因此如果另一个文件中声明了同样的对象和函数,那么不会造成命名冲突。不要在header中定义静态全局对象,因为每一个包含该header的文件都会创建一个对象实例,会导致奇怪的现象发生。我们一般在cpp文件中定义全局变量。同时,定义为全局变量时,优先考虑static。

延长对象的生命周期

0%