C++ static静态变量的作用总结

本文详细介绍了C/C++中static关键字的四大作用:隐藏全局变量和函数、保持变量内容的持久性、默认初始化为0以及在C++中声明类成员。并通过实例解释了这些特性的具体应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.先来介绍它的第一条也是最重要的一条:隐藏。(static函数,static变量均可)

当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。
举例来说明,同时编译两个源文件,一个是a.c,另一个是main.c。

//a.c
char a = 'A'; // global variable
void msg()
{
   
     printf("Hello\n");
}
 
//main.c
 
int main()
{
   
     extern char a; // extern variable must be declared before use
     printf("%c ", a);
     (void)msg();
     return 0;
}

程序运行结果

A Hello

为什么在a.c中定义的全局变量a和函数msg能在main.c中使用?前面说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的。

如果加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏。

2.static的第二个作用是保持变量内容的持久。(static变量中的记忆功能和全局生存期)

存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。虽然这种用法不常见

PS:如果作为static局部变量在函数内定义,它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。

举例来说:

#include <stdio.h>
 
int fun(){
   
    static int count = 10
### C++ 中 `static` 静态变量作用 #### 局部静态变量 当在函数内部声明一个带有 `static` 关键字的局部变量时,该变量会在程序启动时被初始化一次,并且其生命周期持续到程序结束。这意味着即使函数调用结束后,此变量仍然存在并保留上次赋给它的值。 考虑下面的例子来展示这一点: ```cpp #include <iostream> using namespace std; void incrementCounter() { int autoVar = 0; // 自动局部变量,在每次进入函数时重新创建和初始化 static int staticVar = 0; // 静态局部变量,仅第一次进入函数时初始化 ++autoVar; ++staticVar; cout << "Auto variable value: " << autoVar << ", Static variable value: " << staticVar << endl; } int main(){ for(int i=0;i<5;++i){ incrementCounter(); } } ``` 上述代码会输出如下结果[^3]: ``` Auto variable value: 1, Static variable value: 1 Auto variable value: 1, Static variable value: 2 Auto variable value: 1, Static variable value: 3 Auto variable value: 1, Static variable value: 4 Auto variable value: 1, Static variable value: 5 ``` 这表明自动局部变量 (`autoVar`) 的值每次都重置为初始状态;而静态局部变量 (`staticVar`) 则保持之前的值不变直到下一次访问它为止。 #### 文件作用域内的静态对象 如果在一个源文件内定义了一个具有外部链接性的全局变量或函数前加上关键字 `static` ,那么这些实体就变成了拥有内部链接性,即它们只在这个特定编译单元可见。这样做的好处是可以防止其他地方意外覆盖同名符号,从而减少潜在的名字冲突风险[^2]. 例如: ```cpp // fileA.cpp static int counter = 0; // 此counter只能在此文件中使用 // fileB.cpp extern int counter; // 这里尝试引用fileA中的counter将会失败因为它是私有的(static) ``` 这种机制有助于模块化编程实践,使得各个部分更加独立而不互相干扰。 #### 类成员级别的静态属性 对于类来说,可以将某些数据成员标记成 `static`, 表明这类的数据共享同一个实例副本而不是每个对象单独拥有一份拷贝。因此修改任何一个实例对应的静态字段都会影响所有其它实例的状态. 这里有一个简单的例子说明如何操作类里的静态成员变量[^1]: ```cpp class MyClass { public: static int sharedValue; // 声明一个静态整型数作为公共资源供所有MyClass的对象共同维护. }; int MyClass::sharedValue = 0; // 定义并初始化上面所提到的那个静态成员. int main(){ MyClass obj1,obj2; obj1.sharedValue = 10; cout<<obj2.sharedValue<<endl; // 输出应该是10,证明两个不同的对象都指向同一块内存地址上的数值。 } ``` 通过这种方式,程序员能够有效地控制多个对象间的信息交换以及同步更新过程.
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值