服务端视角的C++从入门到精通(二十四)

78 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第33天,点击查看活动详情

讲一下static关键字

C++中的static用途其实还是比较广泛的,主要用法主要包括以下几点:

静态局部/全局变量

static可以写在一个局部/全局变量前,用来起修饰作用,表示这个变量的存储位置是在全局数据区而不是在栈段,这就使得变量的生命周期不会被代码段的生命周期所局限。在使用静态局部变量时,还可以保证变量的可见性是在代码段之内,而不会被代码段外的部分所误用或者是造成歧义,同时,保证对变量初始化为0,且仅初始化一次。静态全局变量的作用是保证变量的可见性只会局限在本源文件内,而不会被其他源文件引用,换言之,它在一定程度上做到了命名隔离,避免了变量命名的冲突。

静态函数

静态函数的作用和静态全局变量类似,都是保证隔离。这里区别于变量,函数声明其实本身默认是extern的,而变量本身则不是,它需要显式使用extern来提示编译器到其他文件中去寻找这个变量的定义。

静态成员函数

静态成员变量是可以通过类名使用::运算符直接进行访问的,这是有别于普通成员函数的最大不同。例子如下:

#include <cstdio>
class A{
public:
	static StaticFunc(){
		printf("call StaticFunc()\n");
	}
	NormalFunc(){
		printf("call NormalFunc()\n");
	} 
}; 
int main() {
    A::StaticFunc();
    A a;
    a.NormalFunc();
    
    return 0;
}

很明显可以看出两者调用方式的不同。当然,更重要的是,由于无需对类进行实例化(即创建对象),所以静态成员函数中自然而然地无法包含对普通成员变量的访问,这也很容易理解,因为此时函数中根本就没有this这个指向当前对象的指针,而直接使用普通成员变量则是隐式地借助this指针进行访问。