在同一个构造函数中用const int初始化const int和object

时间:2017-01-16 15:39:36

标签: c++ c++11 initialization initializer-list

我有一个在.h文件中创建的对象,应该在构造函数中初始化。此对象在我们当前的应用程序中传递一个5的COM端口号。出于这个原因,我在.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

2 个答案:

答案 0 :(得分:1)

您的成员初始化顺序似乎有问题。类成员按照声明的顺序初始化。它们在构造函数中初始化的顺序不会覆盖它。在下一个示例中,bar::my_foobar::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;
}

答案 1 :(得分:0)

如果您在comPort的定义中交换BClassA的声明,则可以重现您的错误。请参阅有关Constructor initialization-list evaluation order的SO的评论。

因此,请确保如果初始化列表依赖于特定的评估顺序,则要初始化的成员的声明必须遵守此顺序。