在构造函数中初始化字段 \- 初始化列表与构造函数主体

新手上路,请多包涵

我已经在 C++ 中工作了一段时间,但我不确定这两个选项之间的区别:

 public : Thing(int _foo, int _bar): member1(_foo), member2(_bar){}

public : Thing(int _foo, int _bar){
    member1 = _foo;
    member2 = _bar;
}

我有一种感觉,他们做同样的事情,但这两种语法之间是否存在实际差异。其中一个是否比另一个更安全,它们是否以不同的方式处理默认参数。

不完全习惯第一个例子,所以如果我在上面犯了错误,我很抱歉。

原文由 gardian06 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 764
2 个回答

如果 member1 member2 是非 POD(即非 Plain O ld Data )类型,则它们是不同的:

 public : Thing(int _foo, int _bar){
    member1 = _foo;
    member2 = _bar;
}

相当于

public : Thing(int _foo, int _bar) : member1(), member2(){
    member1 = _foo;
    member2 = _bar;
}

因为它们会在构造函数体开始执行之前被初始化,所以基本上完成了两次工作。这也意味着,如果这些成员的类型没有默认构造函数,那么您的代码将 无法 编译。

原文由 Luchian Grigore 发布,翻译遵循 CC BY-SA 3.0 许可协议

除了其他答案,我想提一下构造函数初始化仅用于初始化成员变量。

 class Demo
{
    int a;
    int b;
public:
    Demo(int a,int b):a(a),b(b)
    {

    }

};

如果我们在构造函数中初始化 a 和 b ,那将是自赋值。

原文由 user4016479 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题