1. 通过函数封装访问
int globalVar;
int getGlobalVar() {
return globalVar;
}
void setGlobalVar(int value) {
globalVar = value;
}
- 优点:
- 数据隐藏:全局变量被封装在函数内部,对外部代码隐藏了实现细节,增强了数据的安全性。
- 便于维护:如果需要对全局变量的访问逻辑进行修改,例如添加日志记录、权限检查等,只需在函数内部修改,不会影响到调用者。
- 缺点:
- 增加函数调用开销:每次访问全局变量都需要进行函数调用,这会带来一定的性能开销,尤其在频繁访问时比较明显。
2. 使用命名空间
namespace MyNamespace {
int globalVar;
}
// 使用方式
int main() {
MyNamespace::globalVar = 10;
int value = MyNamespace::globalVar;
return 0;
}
- 优点:
- 避免命名冲突:将全局变量放在命名空间内,可以有效避免与其他全局变量或函数的命名冲突,尤其在大型项目中多个模块可能定义相同名称变量时非常有用。
- 逻辑分组:命名空间可以将相关的变量和函数进行逻辑分组,提高代码的可读性和可维护性。
- 缺点:
- 名称冗长:每次访问全局变量都需要加上命名空间前缀,在代码中使用时可能会使代码显得冗长,尤其是在频繁使用时。
3. 使用单例模式
class GlobalVarHolder {
public:
static GlobalVarHolder& getInstance() {
static GlobalVarHolder instance;
return instance;
}
int getGlobalVar() {
return globalVar;
}
void setGlobalVar(int value) {
globalVar = value;
}
private:
int globalVar;
GlobalVarHolder() = default;
GlobalVarHolder(const GlobalVarHolder&) = delete;
GlobalVarHolder& operator=(const GlobalVarHolder&) = delete;
};
// 使用方式
int main() {
GlobalVarHolder::getInstance().setGlobalVar(10);
int value = GlobalVarHolder::getInstance().getGlobalVar();
return 0;
}
- 优点:
- 全局唯一实例:确保在整个程序中只有一个实例,避免了多个全局变量实例可能带来的数据不一致问题。
- 延迟初始化:只有在第一次调用
getInstance
时才会创建实例,提高了程序的启动性能。
- 缺点:
- 实现复杂:相比简单的全局变量定义,单例模式的实现较为复杂,需要处理好线程安全、内存管理等问题。
- 静态生命周期:单例对象在程序结束时才会被销毁,如果单例对象占用大量资源,可能会影响程序的内存释放效率。