zhouqijie

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被编译器认为是对象