【问题标题】:Why do I need another set of braces after brace-initializing a member variable?为什么在大括号初始化成员变量后需要另一组大括号?
【发布时间】:2013-07-24 13:18:46
【问题描述】:

我尝试使用大括号初始化(谢天谢地,Visual Studio 2013 实际支持),但由于某种原因,当我在课堂上这样做时,它需要两组大括号。例如:

class NumberGrabber {
    int number;
public:
    NumberGrabber() : number{ 5 }{}

    int getNumber() { return number; }
};

为什么需要我说number { 5 }{}?这对我来说并没有真正的视觉意义。

【问题讨论】:

  • {} 是一个空代码块。

标签: c++ c++11 default-constructor in-class-initialization


【解决方案1】:

前一组大括号是number 的初始化器,后者是定义构造函数主体的复合语句。通过适当的格式,这可能会变得更清晰。

NumberGrabber()
    : number{5}
{
}

这样更有意义吗?

【讨论】:

【解决方案2】:

在 C++11 中你也可以这样做

#include <iostream>

// look ma, no {}
class NumberGrabber {
    int number = 5;
public:
    int getNumber() { return number; }
};

int main()
{
    std::cout << NumberGrabber().getNumber() << "\n";    
}

Live example(适用于 clang 和 g++),打印 5。

【讨论】:

  • 2013 实际上确实允许这样做。感谢您的提醒。
  • @sircodesalot 如果你有许多类数据成员和许多单参数构造函数,它真的开始付出代价,因为你只需要初始化相应的数据成员,其他的将从in-类初始化器。
  • 是的,从 C#/Java 开始,令我惊讶的是,您在以前的 C++ 迭代中无法做到这一点。
  • @sircodesalot 你确定 Visual Studio 2013 预览版可以吗?我刚刚尝试过,它对此并不满意。它说只有静态 const 整数成员可以这样初始化(即非 c++11 行为)。
  • @sircodesalot 我发现它将成为 2013 RTM 的一个功能,请参阅 blogs.msdn.com/b/vcblog/archive/2013/06/28/…
【解决方案3】:

构造函数是一个函数,函数定义需要一个主体。 {} 是一个空函数体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 2021-12-31
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    相关资源
    最近更新 更多