今天工作中突然用到map的初始化,顺便复习一下c++11中的变量初始化。
统一的初始化方法,c++11中所有数据类型都可以使用初始化列表,但是对于结构体 或者类,需要满足一定的条件:
(1)无用户自定义构造函数。
(2)无私有或者受保护的非静态数据成员
(3)无基类
(4)无虚函数
(5)无{}和=直接初始化的非静态数据成员。
class Foo
{
public:
Foo(int) {}
private:
Foo(const Foo &);
};
int main()
{
Foo a1(123); //调用Foo(int)构造函数初始化
Foo a2 = 123; //error Foo的拷贝构造函数声明为私有的,该处的初始化方式是隐式调用Foo(int)构造函数生成一个临时的匿名对象,再调用拷贝构造函数完成初始化
Foo a3 = { 123 }; //列表初始化
Foo a4 { 123 }; //列表初始化
int a5 = { 3 };
int a6 { 3 };
return 0;
}
stl初始化列表:
int arr[] = { 1, 2, 3, 4, 5 };
std::map < int, int > map_t { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };
std::liststd::string list_str{ “hello”, “world”, “china” };
std::vector vec_d { 0.0,0.1,0.2,0.3,0.4,0.5};
此外,列表初始化防止类型收窄