【发布时间】:2023-03-27 06:35:01
【问题描述】:
初始化类数据成员的正确位置在哪里? 我在这样的头文件中有类声明:
Foo.h:
class Foo {
private:
int myInt;
};
然后我尝试在相应的 .cpp 文件中为 myInt 设置一个值:
Foo.cpp:
int Foo::myInt = 1;
重新定义 myInt 时出现编译器错误。我做错了什么???
【问题讨论】:
标签: c++
初始化类数据成员的正确位置在哪里? 我在这样的头文件中有类声明:
Foo.h:
class Foo {
private:
int myInt;
};
然后我尝试在相应的 .cpp 文件中为 myInt 设置一个值:
Foo.cpp:
int Foo::myInt = 1;
重新定义 myInt 时出现编译器错误。我做错了什么???
【问题讨论】:
标签: c++
你有一个实例变量。类的每个实例都有自己的 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; }一样吗?
为了延续 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;
【讨论】:
您正在尝试通过静态初始化构造来初始化实例成员。如果您希望这是一个类级别的变量(静态),请在变量前面加上 static 关键字。
class Foo {
private:
static int myInt;
};
【讨论】:
类变量必须标记为“静态”。如果您的变量是实例变量而不是类变量,则必须在构造函数或其他方法中对其进行初始化。
【讨论】: