C++ 用类a中的常量值初始化类B?
如何使用类a中的常量值构造类B,如下所示:C++ 用类a中的常量值初始化类B?,c++,initializer-list,C++,Initializer List,如何使用类a中的常量值构造类B,如下所示: class A { public: A( ); private: B b_; const float PARAM_ = 7.7; } class B { B(float param); } A::A() : b_( PARAM_ ) { } 当创建b_而不是预期的7.7时,我在上面的参数中得到了垃圾值。正确的方法是什么?如果适合您的使用,您可以将常量设置为静态。 出现此问题的原因是,在您尝试在b的构造函数中使用参数时,
class A
{
public:
A( );
private:
B b_;
const float PARAM_ = 7.7;
}
class B
{
B(float param);
}
A::A() : b_( PARAM_ )
{
}
当创建b_而不是预期的7.7时,我在上面的参数中得到了垃圾值。正确的方法是什么?如果适合您的使用,您可以将常量设置为静态。 出现此问题的原因是,在您尝试在b的构造函数中使用参数时,参数的非常量版本尚未初始化
作为静态,它将被更早初始化。
< P>问题是C++中非静态成员按声明顺序初始化。code>b_在PARAM_
之前声明,因此当您在成员初始化列表中写入b_(PARAM_)
时,b_
用垃圾值初始化,然后将PARAM_
初始化为7.7。为了避免这种情况,请将PARAM_
的声明移动到b_
之前,这是正确的,但您永远不应该(除非没有其他选项)编写依赖于声明顺序的代码。这是非常错误的编程实践。至少这是他们教给我的:)。有效,但我真的不喜欢那个解决方案-(@Danijel如果另一个构造函数不打算将PARAM
的值设置为不同的值,那么它可能应该是static
,正如另一个答案所说。将b
的定义放在PARAM
的定义之后?