初始化类数据成员的正确位置在哪里? 我在头文件中有类声明,如下所示:
foo.h中:
class Foo {
private:
int myInt;
};
然后我尝试在相应的.cpp文件中为myInt设置一个值:
Foo.cpp中:
int Foo::myInt = 1;
我因重新定义myInt而遇到编译器错误。我做错了什么???
答案 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)
类变量必须标记为“静态”。如果您的变量是实例变量而不是类变量,则必须在构造函数或其他方法中对其进行初始化。