C ++这个很少使用的构造函数语法是什么?

时间:2016-10-28 19:00:24

标签: c++ syntax constructor

编辑:我不认为这是this other question的副本,因为另一个问题只是在构造函数中将()转换为{}。我注意到在struct中定义构造函数但在class中没有定义构造函数时的不同行为。 (并且,正如评论中所指出的,这是关于使用构造函数而不是编写它们。)但我以前错了。

我在辅导时遇到了构造函数的这种奇怪的(对我而言)语法:

Foo obj {i, j};

起初我认为它不起作用,并告诉学生重写它 - 但是他们坚持认为它有效,并告诉我他们从cplusplus.com,to which I've not been able to find a reference中提取示例,所以我试了一下无论如何......它奏效了。所以我试验了它。

我自己也研究了一下,发现在cplusplus.com上没有提到constructor syntax那种。 (也许它有一个特定的名字?)

以下是我尝试使用它的方法。

struct Note { //A musical note.
    std::string name;
    double freq;
    //Note(std::string s, double f): name(s), freq(f){}
    //Uncomment the constructor in order to use normal constructor syntax.
};

class Journal {
public:
    std::string title;
    std::string message;
    int idNum;
};

int main() {
    Note a { "A", 440.0}; //Works with or without a constructor.
    //Note a("A",440.0); //Works ***only*** with a defined constructor.

    //Journal journal("hello, world", "just me, a class", 002); //Works regardless of constructor definition.
    Journal journal {"hello, world", "just me, a class", 003}; //Works regardless of constructor definition.

    std::cout << a.name << " " << a.freq << std::endl;
    std::cout << journal.title << " " << journal.message << " " << journal.idNum << std::endl;

    return 0;

}

我发现它适用于结构和类,无论它们是否有定义的构造函数。

显然默认的构造函数正在运行,但由于一些原因,这让我很困惑:

  • 我以前从未见过这种语法(这并不奇怪,C ++很大)
  • 实际上有效
  • 无论是否定义了构造函数,都可以工作,因此可能默认行为

我的问题是:

  • 此语法是否有名称和特定目的,使其与常规构造函数行为区别开来,如果是,为什么要使用它(或不使用)?

2 个答案:

答案 0 :(得分:3)

自从引入C ++ 11以来,情况发生了变化,您应该阅读list initialization

int x (0);  // Constructor initialization
int x {0};  // Uniform initialization

在介绍之前,您有各种初始化案例:

  • 通过调用normal()构造函数来对象(如果没有参数,则注意most vexing parse
  • 使用{}
  • 聚合类或数组
  • 默认构建没有大括号

现在你可以在所有这些中使用统一初始化。

必须注意的是,由于

,这两者并不是真正可以互换的
std::vector<int> v (100); // 100 elements
std::vector<int> v {100}; // one element of value 100

并且你必须注意这样一个事实:如果类型有initializer list constructor,它将优先于重载解析。

也就是说,统一初始化可以是quite handy并且是安全的(防止缩小转换)。

答案 1 :(得分:2)

该语法称为“列表初始化”。您可以在C++14的第8.5.4节中详细了解它。

我猜这个语法主要是为了向后兼容C,它有初始化结构和数组看起来非常相似的语法。