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

C++ 静态全局变量V静态全局类变量,c++,static,global-variables,C++,Static,Global Variables,更推荐哪种方法声明字符串常量 是在文件范围内声明全局变量 将其声明为类的全局 该变量将仅在类成员函数中使用。我倾向于认为2更好,因为它只针对类成员函数 A.cpp --------------------- static const std::string hello_str = "Hello"; void A::print() { std::cout << hello_str; } A.cpp --------------------- 静态常量std::string

更推荐哪种方法声明字符串常量

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

    A.cpp
    ---------------------
    static const std::string hello_str = "Hello";
    
    void A::print()
    {
        std::cout << hello_str;
    }
    
    A.cpp
    ---------------------
    静态常量std::string hello\u str=“hello”;
    void A::print()
    {
    标准::cout简单规则:

    • 字符串
      在逻辑上属于类,因此它应该是类成员
    • 该类的所有实例共享同一字符串,因此它属于该类,而不是该类的特定实例(所有实例共享同一字符串),因此将其设置为
      静态
      成员
    这为您提供了以下优势:

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

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

    A.cpp

    名称空间{
    常量std::字符串hello_str(“hello”);
    }
    void A::print(){
    
    std::你能解释一下“一个是有效私有的,另一个是公共可见的。”-我认为1和2都是公共的。“我赞成类内的声明,但私有。”-理解这一部分,只有成员func访问它,而不是从main(其他类的成员func)访问它)“我发现在实现发生变化的情况下,这更容易维护。当然,如果cpp中的静态可以通过某种方式被外部实现访问,那么您可能还希望在类内将其声明为私有,以便其他人无法访问它。“-你能解释一下这一点和/或给我举个例子吗?@KingkongJnr这只是一个明显的例子:在#1中,
    静态
    可以被A.cpp中不在它前面的任何东西访问。如果A.cpp只包含A类的定义,那么它就是我所说的“有效私有”。对静态的可见性和访问受到限制。这是C程序员用于其私有函数/数据的常用方法。例如:
    main()
    无法访问该静态,除非在a.cpp中定义了main。@KingkongJnr
    print
    ,声明了
    private
    ,而foo在这里是公共的:
    class a{\n public:void foo();\n private:\n void print();\n};
    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;
    }
    
    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();
    }