C++避坑---关键字static的使用及注意事项

static
关键字可用于声明变量、函数、类数据成员和类函数。其主要影响着它们的生命周期、作用域和存储位置。
static在普通变量和函数中的使用
static修饰局部变量
默认情况下static修饰后作用域函数内部函数内部存储位置栈静态区生命周期局部(函数调用开始,函数执行完成时结束)全局(函数调用开始,到程序执行完成时结束)
默认情况下,局部变量(定义在函数内部的变量)的作用域仅限于函数内部,只有函数被调用的时候才被初始化(存储于栈空间)和使用,函数执行完毕的时候被释放,而被
static
修饰后,其作用域不变,但是存储位置变为静态区,且生命周期延长(直到程序运行结束后才被释放)。
输出结果为:
static修饰全局变量
默认情况下static修饰后作用域整个程序当前文件存储位置静态区静态区生命周期全局全局
默认情况下,全局变量(在所有块的外部定义变量)的作用域是整个程序,存储位置为静态区,生命周期也与程序的生命周期相同。当其被
static
修饰后,其存储位置和生命周期不会改变,但其作用域变为当前文件。
static修饰函数
static
修饰函数的作用与修饰全局变量的作用类似,即将函数的作用域由整个程序变为当前文件。
static在类中的使用
在类定义中,关键字static
声明不绑定到类的实例对象。static
在类中常用的使用场景主要有:
修饰类的数据成员:即静态成员,该成员不关联到任何对象,即使不定义该类的任何对象它也存在,其生存周期大于该类的对象,其作为类的成员,由该类的所有对象共同访问。静态成员存储于全局数据区,由于要给静态成员分配空间,因此普通的静态成员不能在类的声明中定义。其定义以及使用方法如下:
修饰类的成员函数:即静态成员函数,该函数与静态成员一样,不关联到任何对象。调用时,它们没有
this
指针。静态成员函数不能是virtual
、const
或volatile
的。静态成员函数的地址可以存储在常规的函数指针中,但不能存储在成员函数指针中。其定义及使用方法如下:
介绍完static
的使用方式和方法后,我们通过一个完整的例子,总结一下其使用时的注意事项,例子如下:
输出结果如下:
从上述例子和输出结果可以得出:
静态数据成员不关联到类对象,且只初始化一次,单独存储。
普通的静态成员不能在类的声明中定义,需要在类的外面单独初始化。
静态成员函数能够访问静态成员,但不能访问非静态数据成员和非静态成员函数(因为非静态数据成员和函数是与类的对象绑定的,但静态成员函数不关联任何对象,且调用时,它们没有
this
指针。)。
总 结
在使用关键字static
的时候,我们需要注意一下几个原则:
被
static
修饰的变量的存储位置都在静态区,且生命周期延长至整个程序运行结束。static
具有隔离作用,被static修饰的全局变量和全局函数的作用域由全局变为当前文件。静态变量虽然具有全局变量的生命周期,但只能作用于自己的作用域。
普通静态成员需要在类的外面进行初始化。
静态成员函数不能调用类的非静态成员,包括非静态成员和非静态成员函数。
参考文献
《C++ reference》
文章首发公众号:iDoitnow 如果喜欢话,可以关注一下