【问题标题】:Correct place to initialize class variables?初始化类变量的正确位置?
【发布时间】:2023-03-27 06:35:01
【问题描述】:

初始化类数据成员的正确位置在哪里? 我在这样的头文件中有类声明:

Foo.h:

class Foo {
private:
    int myInt;
};

然后我尝试在相应的 .cpp 文件中为 myInt 设置一个值:

Foo.cpp:

int Foo::myInt = 1;

重新定义 myInt 时出现编译器错误。我做错了什么???

【问题讨论】:

    标签: c++


    【解决方案1】:

    你有一个实例变量。类的每个实例都有自己的 myInt 副本。初始化它们的地方是在构造函数中:

    class Foo {
    private:
        int myInt;
    public:
        Foo() : myInt(1) {}
    };
    

    类变量是一个类变量,其中只有一个副本由类的每个实例共享。这些可以在您尝试时进行初始化。 (有关语法,请参阅 JaredPar 的答案)

    对于整数值,您还可以选择在类定义中初始化静态常量:

    class Foo {
    private:
        static const int myInt = 1;
    };
    

    这是一个无法更改的类的所有实例共享的单个值。

    【讨论】:

    • 嗨,您能告诉我Foo() : myInt(1) {} 语法的名称是什么,以便我可以谷歌并阅读更多详细信息吗?和public: Foo() { myInt = 1; }一样吗?
    • @Cupidvogel:它们是“成员初始化列表”(en.cppreference.com/w/cpp/language/initializer_list)
    【解决方案2】:

    为了延续 Jared 的回答,如果你想像现在这样初始化它,你需要把它放在构造函数中。

    class Foo
    {
    public:
        Foo(void) :
        myInt(1) // directly construct myInt with 1.
        {
        }
    
        // works but not preferred:
        /*
        Foo(void)
        {
            myInt = 1; // not preferred because myInt is default constructed then assigned
                       // but with POD types this makes little difference. for consistency
                       // however, it's best to put it in the initializer list, as above
                       // Edit, from comment: Also, for const variables and references,
                       // they must be directly constructed with a valid value, so they
                       // must be put in the initializer list.
        }
        */
    
    private:
        int myInt;
    };
    

    【讨论】:

    • 适用于解释 +1 方法,描述优点/缺点,以及描述“初始化列表”的术语(这看起来与来自其他程序员的“在构造函数中”接受的答案描述非常不同语言;“在构造函数中”在构造函数的大括号之间。这个答案为我总结了一切。
    【解决方案3】:

    可以直接在头文件中初始化,在c++11或者gnu++11中:

    int myInt = 1;
    

    见这篇文章“C++11 Tidbits: Non-static Data Member Initializers

    【讨论】:

      【解决方案4】:

      您正在尝试通过静态初始化构造来初始化实例成员。如果您希望这是一个类级别的变量(静态),请在变量前面加上 static 关键字。

      class Foo {
      private:
        static int myInt;
      };
      

      【讨论】:

      • 谢谢!我假设“类级变量”只能在一个类中使用而不能在其他任何地方使用?
      • @draftomatic,我所说的类级变量是指与类实例无关的变量。只有在 Foo(和它的朋友)中,您可以简单地说 Foo::myInt。不需要 Foo 的实例。
      【解决方案5】:

      类变量必须标记为“静态”。如果您的变量是实例变量而不是类变量,则必须在构造函数或其他方法中对其进行初始化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-03
        • 1970-01-01
        • 2014-09-24
        • 2019-10-14
        相关资源
        最近更新 更多