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

时间:2009-04-06 19:32:41

标签: c++

初始化类数据成员的正确位置在哪里? 我在头文件中有类声明,如下所示:

foo.h中:

class Foo {
private:
    int myInt;
};

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

Foo.cpp中:

int Foo::myInt = 1;

我因重新定义myInt而遇到编译器错误。我做错了什么???

5 个答案:

答案 0 :(得分:32)

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

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

类变量是只有一个副本由类的每个实例共享的变量。这些可以在您尝试时初始化。 (参见JaredPar对语法的回答)

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

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

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

答案 1 :(得分:12)

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

答案 2 :(得分:8)

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

int myInt = 1;

请参阅此文" C++11 Tidbits: Non-static Data Member Initializers"

答案 3 :(得分:4)

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

class Foo {
private:
  static int myInt;
};

答案 4 :(得分:1)

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