编辑:我不认为这是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;
}
我发现它适用于结构和类,无论它们是否有定义的构造函数。
显然默认的构造函数正在运行,但由于一些原因,这让我很困惑:
我的问题是:
答案 0 :(得分:3)
自从引入C ++ 11以来,情况发生了变化,您应该阅读list initialization
int x (0); // Constructor initialization
int x {0}; // Uniform initialization
在介绍之前,您有各种初始化案例:
现在你可以在所有这些中使用统一初始化。
必须注意的是,由于
,这两者并不是真正可以互换的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,它有初始化结构和数组看起来非常相似的语法。