MST
星途 面试题库

面试题:C++中如何安全引用全局变量

在C++程序中,假设有一个全局变量`int globalVar;`,请描述至少两种安全引用这个全局变量的方式,并说明每种方式的优缺点。
35.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

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时才会创建实例,提高了程序的启动性能。
  • 缺点
    • 实现复杂:相比简单的全局变量定义,单例模式的实现较为复杂,需要处理好线程安全、内存管理等问题。
    • 静态生命周期:单例对象在程序结束时才会被销毁,如果单例对象占用大量资源,可能会影响程序的内存释放效率。