c++ - 静态全局变量 V 静态全局类变量

标签 c++ static global-variables

哪种声明字符串常量的方式更推荐?

  1. 是在文件范围内声明全局变量。
  2. 将其声明为全局类。

该变量将仅在类成员函数中使用。我倾向于认为 2 更好,因为它仅特定于类成员函数。

A.cpp
---------------------
static const std::string hello_str = "Hello";

void A::print()
{
    std::cout << hello_str;
}

(或)

A.h
---------------------
class A{
public:
    static const std::string hello_str;
    void print();
}

A.cpp
---------------------
const std::string A::hello_str = "Hello";

void A::print()
{
    std::cout << A::hello_str;
}

编辑-1:

假设 hello_str 的内容可以改变。例如。每当开发人员对文件进行更改时,该字符串都会由开发人员手动更新。

在这种情况下,将变量初始化保留在函数中是否有意义? 用户更新字符串可能不清楚/明显。如果它对文件 (1) 或类 (2) 保持全局,则其他开发人员可以“识别”和修改此字符串。

鉴于上述用例,您是否仍然建议使用返回字符串的函数?或者我可以使用类级别的静态变量(带有私有(private)访问说明符)吗?

最佳答案

匿名命名空间是另一种选择:

A.cpp

namespace {
  const std::string hello_str("Hello");
}

void A::print() {
    std::cout << hello_str;
}

但是您真的应该将其包装在一个函数中以进行延迟初始化。

将采用以下形式:

A.h
---------------------
class A{
public:
    static const std::string& hello_str();
    void print();
}

A.cpp
---------------------
const std::string& A::hello_str() {
  static const std::string str("Hello"); // << constructed on first call of A::hello_str()
  return str;
}

void A::print() {
    std::cout << A::hello_str();
}

在这种情况下,您也可以简单地按值返回,并完全避免静态/全局。您的标准 C++ 库实现可能会使用所谓的“小字符串优化”——如果是这样,则不需要分配堆来创建或移动这么短的字符串。

另请注意,您的两个示例并不相同;一个实际上是私有(private)的,另一个是公开可见的。

最终,您应该使用您建议的方法。考虑在函数中使用 static 进行延迟初始化,或者(在许多情况下甚至更好)按值返回。

回答你原来的问题:我赞成类内的声明,但私有(private)的。我发现这在事件实现发生变化时更容易维护。当然,如果外部实现可以以某种方式访问​​ cpp 中的静态,那么您可能还想在类中将其声明为私有(private),这样其他人就无法访问它。

关于c++ - 静态全局变量 V 静态全局类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12190100/

相关文章:

java - 在 C++ 中的模板参数上调用静态函数

php - 如何将全局变量传递给 PHP 中的类?

c - 在计算中使用全局变量

c++ - 在成员函数尾随返回类型中使用 this 和属性?

c++ - 如何在 C++ 中同时读写 `fstream` 的文件?

c++ - 如何只用STL算法实现这个功能

c++ - 制作 uint128 库但不能,找出什么功能搞砸了

groovy - 如何使用 groovy mixin 添加静态方法

Java如何在 map 中存储 setter/getter

javascript - 无法更改函数内的全局变量(Javascript)