【C++11】初始化列表、decltype操作符、nullptr

文章详细介绍了C++11中的初始化列表,包括花括号初始化和std::initializer_list的使用,以及在标准库容器中的应用。接着讨论了decltype关键字,它能获取表达式的类型,不同于auto。最后提到了nullptr,作为C++11引入的安全的空指针替代NULL。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、初始化列表

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表示空指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Brant_zero2022

素材免费分享不求打赏,只求关注

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值