静态全局变量V静态全局类变量

哪种方法来声明一个字符串const更值得推荐?

  • 是在文件范围声明全局变量。
  • 向班级宣布它是全球性的。
  • 该变量将仅用于类成员函数中。 我倾向于认为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)中,则其他开发人员可以“识别”并修改该字符串。

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


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

    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中的这个静态对于外部实现来说是可以访问的,那么你可能也想在类中声明它是私有的,这样其他人就不能访问它。


    简单的规则:

  • string逻辑上属于类,所以它应该是一个类成员。
  • 该类的所有实例共享相同的字符串,因此它属于类而不是类的特定实例(所有实例共享相同的字符串),因此使其成为static成员。
  • 这给你的好处是:

  • 只有需要访问字符串的类成员才能访问,与将其声明为全局字符串不同。
  • 链接地址: http://www.djcxy.com/p/35321.html

    上一篇: static global variable V static global Class variable

    下一篇: C++ static variable