CRE:区分各种对象构造语法
// 默认初始化(Default Initalization)
Foo obj1;
// 值初始化(Value Initalization)
Foo obj2 = MyClass(); // 值初始化(初始化为零)
Foo obj2{};//也是值初始化
// 直接初始化(Direct Initalization)
Foo obj(10); // (调用带参数的构造函数)
// 复制初始化(Copy Initialization)
Foo obj1 = 10; // 复制初始化,调用带参数的构造函数
Foo obj2 = obj1; // 复制初始化,调用复制构造函数
// 列表初始化(List Initialization)
Foo obj{10, 20}; // 列表初始化,调用带两个参数的构造函数
// 聚合初始化 (Aggregate Initialization)
Point p = {10, 20}; //Point的定义为:struct Point{int x; int y;}
//补充:“最令人讨厌的解析”
//(在C++中,如果一个声明的语法可以被解释为一个函数声明,编译器将优先将其解释为函数声明。这是为了与C风格的函数声明保持一致。)
MyClass obj1();//obj1被编译器认为是函数
MyClass obj2(....);//obj2被编译器认为是对象