C++ 初始化类变量的正确位置?

C++ 初始化类变量的正确位置?,c++,C++,初始化类数据成员的正确位置在哪里? 我在头文件中有这样的类声明: Foo.h: class Foo { private: int myInt; }; 然后我尝试在相应的.cpp文件中将值设置为myInt: Foo.cpp: int Foo::myInt = 1; 我在重新定义myInt时遇到一个编译器错误。我做错了什么?类变量必须标记为“静态”。如果变量是实例变量而不是类变量,则必须在构造函数或其他方法中对其进行初始化。您试图通过静态初始化构造初始化实例成员。如果希望它是类级变量(s

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

Foo.h:

class Foo {
private:
    int myInt;
};
然后我尝试在相应的.cpp文件中将值设置为myInt:

Foo.cpp:

int Foo::myInt = 1;

我在重新定义myInt时遇到一个编译器错误。我做错了什么?

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

您试图通过静态初始化构造初始化实例成员。如果希望它是类级变量(static),则在变量前面加上static关键字

class Foo {
private:
  static int myInt;
};

这里有一个实例变量。类的每个实例都有自己的myInt副本。初始化它们的位置在构造函数中:

class Foo {
private:
    int myInt;
public:
    Foo() : myInt(1) {}
};
类变量是指只有一个副本由类的每个实例共享的变量。这些可以在您尝试时初始化。(有关语法,请参见JaredPar的回答)

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

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

这是一个由类的所有实例共享的不能更改的值。

要扩展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;
};

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

int myInt = 1;

请参阅本文“”

谢谢!我假设“类级别变量”只能在类中使用,而不能在其他任何地方使用?@draftomatic,我所说的类级别变量是指与类实例无关的变量。只有在Foo(以及它的朋友)中,您可以简单地说Foo::myInt。不需要Foo的实例。嗨,你能告诉我
Foo():myInt(1){}
语法的名称吗,这样我就可以用谷歌搜索它并阅读更多细节了?它与
public:Foo(){myInt=1;}
相同吗?@Cupidvogel:它们是“成员初始值设定项列表”(Member initializer list),用于解释+1方法,描述优点/缺点,以及描述“初始值设定项列表”(与构造函数中公认答案的描述非常不同)的术语对于来自其他语言的程序员,“在构造函数中”位于构造函数的花括号之间。这个答案对我来说是全部的总结。