目录
一、初始化列表
1.1 花括号初始化
1.2 initializer_list
二、decltype
三、nullptr
一、初始化列表
1.1 花括号初始化
在C++98中,标准允许使用花括号{ }对数组或结构体元素进行统一的列表初始值设定。
而在C++11推出后,使用初始化列表时,可添加等号(=),也可不添加。
创建对象时也可以直接使用初始化列表的方式调用构造函数进行初始化:
我们还可以在标准容器中使用初始化列表,这也是初始化列表的主要使用场景:
当然, initializer_list也支持可以被隐式类型转换的:
回顾一下string s1="1111" 这句代码的本质:string类调用char*型的构造函数构造出一个匿名string对象;然后将该匿名对象被拷贝构造给s1。然后编译器对该两步操作进行了优化,直接调用char*的构造函数创建出了s1,没有调用拷贝构造。该过程与隐式类型转化非常相似,本质并不是隐式类型转化。
除了初始化,标准库还提供了赋值运算符重载。
使用举例:
总结一下:
C++11以后一切对象都可以使用列表进行初始化。普通对象建议使用默认的初始化,常用容器有需求可以灵活使用初始化列表。
1.2 initializer_list
std::initializer_list的介绍文档:
std::initializer_list
初始化列表initializer_list其实是C++标准库中的一个默认容器。
C++将花括号包围的内容当作initializer_list类型:
initializer_list还提供了迭代器进行使用
现在已知initializer_list是一个类,那C++标准库中的容器是如何支持initializer_list初始化的呢?
其实就是提供了initializer_list作为参数的构造函数,这样就可以使vector支持initializer_list初始化了。接下来我们也可以模拟实现vector中的initializer_list作为参数的构造函数。
测试:
二、decltype
首先我们要了解一下 typeid类,我们常用typeid中的name函数得到类型的字符串。
而关键字decltype是将变量的类型声明为表达式指定的类型。即我们可以通过decltype拿到一个变量的类型,然后使用该表达式创建新的变量。
并且decltype和auto的功能还不一样 例如y2是int,而y3是double。
三、nullptr
我们来看看在C++中 NULL 的定义:
上面的代码的意思是如果没有没有定义NULL,并且为C++版本,则NULL被定义为字面量0,这样就可能会导致一系列问题,以为0既能表示指针常量,又能表示整形常量。所以出于清晰和安全的考虑,C++11中增加了nullptr表示空指针。