C++进阶(三)static 关键字
在作用域上,限定其作用范围
对于全局变量和函数来说,使用 static
修饰,使得其仅在当前文件中可见,在其他的文件中不可见。
// static.c
static int g_c_staVal;
int g_c_Val;
// use_static.c
#include <iostream>
using namespace std;
extern int g_c_val;
int main(){
// cout << g_c_staVal << endl; // 编译失败
cout << g_c_val << endl;
func();
return 0;
}
在其他文件定义的静态变量,对其他文件不可见,所以编译失败。在其他文件定义的非static
变量,可以使用extern
声明,可以在文件中使用。
在内存方面,存储在静态存储区
静态变量存储在静态存储区(全局变量区),全局变量区会被初始化为0。
#include <iostream>
using namespace std;
void func(){
static int i = 10; // 在第一次执行时初始化
i--;
}
int main(){
func();
return 0;
}
对于局部静态变量i
,会在第一次执行时初始化,在下一次执行func
函数时,不会初始化静态变量i
,因为i
在全局变量区,但是i
的作用域仍是 func
内部局部变量的作用域。
类中的静态成员函数和成员变量
- 对于静态成员函数和静态成员变量,其属于类的属性,直接通过类进行调用
- 必须在使用前进行初始化,初始化时不需带
static
关键字,如int ClassName::staticVar = 10
。
static const 使用
static const
修饰的变量与 const
修饰的相比,前者只能在当前的文件范围中使用,而后者可以再其他文件中使用。具体来说,有两种用法:
用法一:预编译声明
在类中定义 static const 变量并初始化变量,不可取值。
class Test{
const static int var = 1;
// ...
};
该用法作为预编译声明使用,相当于C的 #define
,但是需要编译器进行类型检查,保证程序的健壮性,此时只能用于基本数据类型。const存在于动态区(stack、heap),static存在于静态区(全局区),static const
声明的变量存在于常量区,在编译时,编译器会将该变量直接替换。
用法二:类的静态常量
在类中声明 static const
变量,在类外定义static const
变量。在程序运行时加载至内存的常量区,所以可以进行取地址操作,但无法修改变量的值。
class Test{
public:
const static int val;
// ...
};
const int Test::val = 1;
巨人的肩膀
- static 关键字作用总结
- C++中static、const、static const修饰变量作用详解
- const 与 static const 不同
- C++ 常量区 栈区 堆区
- C++局部变量、全局变量、静态变量(堆、栈、静态存储区)
一键三连是对我的鼓励与支持!欢迎关注编程小镇,每天涨一点新姿势😄。