static全局变量V static global类变量

时间:2012-08-30 04:52:10

标签: c++ static global-variables

更推荐哪种方法来声明字符串const?

  1. 是在文件范围内声明全局变量。
  2. 将其声明为全局的。
  3. 该变量仅在类成员函数中使用。我倾向于认为2更好,因为它仅适用于类成员函数。

    A.cpp
    ---------------------
    static const std::string hello_str = "Hello";
    
    void A::print()
    {
        std::cout << hello_str;
    }
    

    (OR)

    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)保持全局,那么其他开发人员可以“识别”&amp;修改此字符串。

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

2 个答案:

答案 0 :(得分:4)

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

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();
}

在这种情况下,您也可以简单地按值返回,并完全避免静态/全局。你的std c ++库实现可能会使用什么叫做“小字符串优化” - 如果是这样,那么创建或移动字符串就不需要堆分配了。

还要注意你的两个例子不一样;一个是有效的,另一个是公开可见的。

最终,你应该使用你提出的 方法。在函数中考虑一个用于延迟初始化的静态,或者(在许多情况下更好)按值返回。

回答你原来的问题:我赞成在课堂上宣讲,但私有。我发现在事件实现转变时更容易维护。当然,如果外部实现以某种方式访问​​cpp中的静态,那么您可能还希望在类中将其声明为私有,以便其他人无法访问它。

答案 1 :(得分:2)

简单规则:

  • string逻辑上属于类,因此它应该是类成员。
  • 该类的所有实例共享相同的字符串,因此它属于该类,而不是类的特定实例(所有实例共享相同的字符串),因此请将其设为static成员。

这为您提供了以下优势:

  • 只有需要访问该字符串的类成员才有权访问,这与将其声明为全局字符串不同。