extern 静态变量类
时间: 2024-03-29 11:32:28 浏览: 74
extern 静态变量类是指在一个类中定义了一个静态成员变量,并且使用 extern 关键字进行声明。这样做的目的是为了在其他文件中能够访问该静态成员变量。
在C++中,静态成员变量是属于类的,而不是属于类的对象的。它在内存中只有一份拷贝,被所有该类的对象所共享。而且,静态成员变量在程序运行期间始终存在,直到程序结束才会被销毁。
当我们在一个类中定义了一个静态成员变量时,需要在类的定义外部进行初始化。这样的初始化通常发生在类的实现文件中。然而,如果我们想在其他文件中使用这个静态成员变量,就需要使用 extern 关键字进行声明。
下面是一个示例代码:
```cpp
// MyClass.h
class MyClass {
public:
static int myStaticVar;
};
// MyClass.cpp
#include "MyClass.h"
int MyClass::myStaticVar = 0;
// OtherFile.cpp
#include "MyClass.h"
extern int MyClass::myStaticVar;
int main() {
// 使用静态成员变量
MyClass::myStaticVar = 10;
return 0;
}
```
在上面的示例中,MyClass 类定义了一个静态成员变量 myStaticVar。在 MyClass.cpp 文件中进行了初始化,并在 OtherFile.cpp 文件中使用 extern 进行声明,以便在 main 函数中使用。
相关问题
extern声明静态变量
### 使用 `extern` 声明静态变量的作用与用法
在 C/C++ 中,`static` 关键字用于控制变量的存储方式和可见性[^2]。对于全局变量而言,加上 `static` 后会使该变量仅限于当前文件中使用;而对于局部变量,则会使其拥有整个程序运行期间的存在时间。
然而,在某些情况下可能希望某个静态变量能够在其他文件中也被访问到。这时就可以利用 `extern` 来实现跨文件级别的共享。需要注意的是,由于 `static` 已经限制了变量的作用范围至单个编译单元(即 .c 或者 .cpp 文件),所以如果想要让另一个文件也能操作这个静态变量的话,就需要通过特定的方式来绕过这种限制。
具体做法如下:
#### 实现方法
假设有一个名为 file1.cpp 的文件中有这样一个静态整型数:
```cpp
// file1.cpp
#include <iostream>
using namespace std;
static int secretNumber = 42;
```
现在要在另外一个叫作 file2.cpp 的地方也能够读取并修改这个数值。那么可以在 file2.cpp 中这样写:
```cpp
// file2.cpp
extern int& getSecretNumber();
void printAndModify() {
cout << "Original Secret Number: " << getSecretNumber() << endl;
// 修改secretNumber
getSecretNumber() += 10;
}
```
同时还需要创建一个新的头文件比如说是 helper.hpp ,里面定义了一个返回引用类型的函数来间接获取那个静态变量:
```cpp
// helper.hpp
#ifndef HELPER_HPP_
#define HELPER_HPP_
int& getSecretNumber();
#endif //HELPER_HPP_
```
最后回到最初含有静态变量的那个 cpp 文件里去实现上面提到过的接口:
```cpp
// file1.cpp (continued from above)
#include "helper.hpp"
int& getSecretNumber(){
return secretNumber;
}
...
```
这样做之后就实现了即使原本是私有的静态成员也可以安全地暴露给其它模块进行交互的目的。不过值得注意的一点就是这种方式实际上破坏了一定程度上的封装原则,所以在实际项目开发过程中应当谨慎评估是否真的有必要这么做。
extern使用静态局部变量
使用关键字可以在一个文件中引用另一个文件中声明的静态局部变量。静态局部变量的作用域仅限于声明它的函数内部,无法直接从其他文件中访问。但是,如果在另一个文件中使用extern关键字声明同样名称的变量,就可以访问到原先声明的静态局部变量的值。这样做的好处是可以在不改变变量作用域的前提下,实现跨文件共享变量的值。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *3* [关键字static、extern+全局变量与局部变量详解](https://blog.csdn.net/qq_51050614/article/details/124068531)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
- *2* [C++中静态成员函数与静态成员变量(static )](https://download.csdn.net/download/weixin_38591011/14868586)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
阅读全文
相关推荐
















