在同一构造函数中初始化const int和具有该const int的对象

问题描述:

我有一个应该在构造函数中初始化的.h文件中创建的对象。该对象通过当前应用程序中5的COM端口号。为此,我在.h文件中创建了一个const int。在同一构造函数中初始化const int和具有该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之前被初始化对象被完全初始化,为相称的值是垃圾。

避免这种情况的正确方法是什么?我能想到以下几点:

  • 初始化的const int的头文件
  • 创建和初始化对象的构造
  • 的身体使用的#define
+3

如果'comPort'是在'B'之前的类中定义的,那么它不会是垃圾。没有足够的信息来回答您的问题或重现问题。 – wally

+0

我会编一个更完整的例子,道歉! – YouKnowNothingJohn

+0

添加了更详细的代码示例。 – YouKnowNothingJohn

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

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

+0

弗朗索瓦在评论中提到,我相信这是罪魁祸首! – YouKnowNothingJohn

这似乎是您的成员初始化的顺序问题。班级成员按的顺序初始化为。它们在构造函数中初始化的顺序不会覆盖它。在下一个示例中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; 
} 
+0

不太脆弱的做法是不依赖订单。 'bar(const int var = 5):my_const(var),my_foo(var){}'摆脱了任何依赖。 – NathanOliver