在同一构造函数中使用该 const int 初始化 const int 和对象
Initialise const int and object with that const int in the same constructor
我有一个在 .h 文件中创建的对象,它应该在构造函数中初始化。在我们当前的应用程序中,这个对象被传递了一个 COM 端口号 5。为此,我在 .h 文件中创建了一个 const int。
编辑:我添加了一个更完整的例子
class ClassB
{
public:
ClassB(int comPort);
private:
int m_comPort;
};
ClassB::ClassB(int comPort) :
m_comPort(comPort)
{
}
class ClassA
{
public:
ClassA();
private:
const int comPort;
ClassB B;
};
ClassA::ClassA() :
comPort(5),
B(comPort)
{
}
int main()
{
ClassA A;
return 0;
}
因为对象是在comPort完全初始化之前初始化的,所以comPort的值是垃圾。
规避此问题的正确方法是什么?我能想到以下几点:
- 初始化头文件中的const int
- 在构造函数体中创建并初始化对象
- 使用#define
如果在 ClassA
的定义中交换 comPort
和 B
的声明,您可以重现错误。请参阅有关 Constructor initialization-list evaluation order.
的评论
因此,请确保如果初始化列表依赖于特定的求值顺序,则要初始化的成员的声明必须遵守此顺序。
您的成员初始化顺序似乎有问题。 Class 成员按照声明的顺序 初始化。它们在构造函数中初始化的顺序不会覆盖它。在下一个示例中,bar::my_foo
在 bar::my_const
之前被初始化,这将导致问题。 my_foo
将使用未初始化的 my_const
成员进行初始化;
struct foo {
foo(int p_x) : x(p_x) {}
int x;
}
struct bar {
bar() : my_const(5), my_foo(my_const) {}
foo my_foo;
const int my_const;
}
可以通过更改成员的声明顺序来解决此问题。
struct bar {
bar() : my_const(5), my_foo(my_const) {}
const int my_const; // my_const before my_foo
foo my_foo;
}
我有一个在 .h 文件中创建的对象,它应该在构造函数中初始化。在我们当前的应用程序中,这个对象被传递了一个 COM 端口号 5。为此,我在 .h 文件中创建了一个 const int。
编辑:我添加了一个更完整的例子
class ClassB
{
public:
ClassB(int comPort);
private:
int m_comPort;
};
ClassB::ClassB(int comPort) :
m_comPort(comPort)
{
}
class ClassA
{
public:
ClassA();
private:
const int comPort;
ClassB B;
};
ClassA::ClassA() :
comPort(5),
B(comPort)
{
}
int main()
{
ClassA A;
return 0;
}
因为对象是在comPort完全初始化之前初始化的,所以comPort的值是垃圾。
规避此问题的正确方法是什么?我能想到以下几点:
- 初始化头文件中的const int
- 在构造函数体中创建并初始化对象
- 使用#define
如果在 ClassA
的定义中交换 comPort
和 B
的声明,您可以重现错误。请参阅有关 Constructor initialization-list evaluation order.
因此,请确保如果初始化列表依赖于特定的求值顺序,则要初始化的成员的声明必须遵守此顺序。
您的成员初始化顺序似乎有问题。 Class 成员按照声明的顺序 初始化。它们在构造函数中初始化的顺序不会覆盖它。在下一个示例中,bar::my_foo
在 bar::my_const
之前被初始化,这将导致问题。 my_foo
将使用未初始化的 my_const
成员进行初始化;
struct foo {
foo(int p_x) : x(p_x) {}
int x;
}
struct bar {
bar() : my_const(5), my_foo(my_const) {}
foo my_foo;
const int my_const;
}
可以通过更改成员的声明顺序来解决此问题。
struct bar {
bar() : my_const(5), my_foo(my_const) {}
const int my_const; // my_const before my_foo
foo my_foo;
}