【C++】C++11简介 | 列表初始化 | 声明 | 范围for
创始人
2024-05-16 10:49:29
0

​🌠 作者:@阿亮joy.
🎆专栏:《吃透西嘎嘎》
🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根
在这里插入图片描述

目录

    • 👉C++11简介👈
    • 👉统一的列表初始化👈
    • 👉声明👈
      • auto
      • decltype
      • nullptr
    • 👉范围 for👈
    • 👉智能指针👈
    • 👉STL中一些变化👈
    • 👉总结👈

👉C++11简介👈

在 2003 年 C++ 标准委员会曾经提交了一份技术勘误表(简称TC1),使得 C++03 这个名字已经取代了 C++98,称为 C++11 之前的最新 C++ 标准名称。不过由于C++03(TC1) 主要是对 C++98 标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为 C++98/03 标准。从 C++0x 到 C++11,C++ 标准十年磨一剑,第二个真正意义上的标准珊珊来迟。相比于 C++98/03,C++11 则带来了数量可观的变化,其中包含了约 140 个新特性,以及对 C++03 标准中约 600 个缺陷的修正,这使得 C++11 更像是从 C++98/03 中孕育出的一种新语言。相比较而言,C++11 能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更强大,而且能提升程序员的开发效率,公司实际项目开发中也用得比较多,所以我们要作为一个重点去学习。C++11 增加的语法特性非常篇幅非常多,我们这里没办法一 一学习,所以本篇博客主要讲解实际中比较实用的语法。

小故事:1998 年是 C++ 标准委员会成立的第一年,本来计划以后每 5 年视实际需要更新一次标准,C++ 国际
标准委员会在研究 C++ 03 的下一个版本的时候,一开始计划是 2007 年发布,所以最初这个标准叫 C++ 07。但是到 06 年的时候,官方觉得 2007 年肯定完不成 C++ 07,而且官方觉得 2008 年可能也完不成。最后干脆叫C++ 0x。x 的意思是不知道到底能在07还是08还是09年完成。结果 2010 年的时候也没完成,最后在 2011 年终于完成了 C++ 标准。所以最终定名为 C++11。

👉统一的列表初始化👈

在 C++98 中,标准允许使用花括号 {} 对数组或者结构体元素进行统一的列表初始值设定。比如:

struct Point
{int _x;int _y;
};
int main()
{int array1[] = { 1, 2, 3, 4, 5 };int array2[5] = { 0 };Point p = { 1, 2 };return 0;
}

C++11 扩大了用花括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型。使用初始化列表时,可添加等号(=),也可不添加。

int main()
{int x1 = 1;// 不建议这么使用,但要求能够看懂int x2 = { 2 };int x3{ 3 };	return 0;
}

创建对象时也可以使用列表初始化方式调用构造函数初始化

class Date
{
public:Date(int year = 1, int month = 1, int day = 1):_year(year), _month(month), _day(day){cout << "Date(int year, int month, int day)" << endl;}
private:int _year;int _month;int _day;
};int main()
{// 都是在调用构造函数Date d1(2023, 1, 23);// C++11支持的写法,能看懂,但不建议这么用Date d2 = { 2023, 1, 23 };Date d3{ 2023, 1,23 };return 0;
}

C++11 新增列表初始化其实是方便容器进行初始化,就不需要调用尾插等接口进行初识化了。

int main()
{vector v1 = { 1,2,3,4,5,6 };vector v2{ 1,2,3,4,5,6 };for (auto e : v1){cout << e << " ";}cout << endl;list lt1 = { 1,2,3,4,5,6 };list lt2{ 1,2,3,4,5,6 };auto x = { 1,2,3,4,5,6 };cout << typeid(x).name() << endl;return 0;
}

在这里插入图片描述

这样的玩法是通过std::initializer_list类型来支持的,std::initializer_list是库里定义的一个类。这个类只有构造函数、迭代器begin()end()size()接口。它的初始化的值是通过一个固定大小的数据进行存储的,其内容不支持修改,也不支持插入数据。

在这里插入图片描述

在 C++11 后,STL 中的容器就支持使用std::initializer_list来进行初始化。

在这里插入图片描述
在这里插入图片描述

而我们自己实现的vectorlist只要加上initializer_list的构造函数和赋值运算符重载,就能使用列表进行初始化了。

在这里插入图片描述
有了列表初始化,很多容器的初始化就变得很方便了。

int main()
{// 都是在调用构造函数Date d1(2023, 1, 23);// C++11支持的写法,能看懂,但不建议这么用// 隐式类型转换,本来是用2023 1 23构造临时对象,在调用拷贝构造构造d2// 编译器优化成直接构造Date d2 = { 2023, 1, 23 };Date d3{ 2023, 1,23 };vector v1 = { d1,d2,d3 };// 隐式类型转换vector v2 = { {2023,1,23}, {2023,1,24} };map dict = { {"sort", "排序"}, {"insert", "插入"} };// 因为string的构造函数很多,所以无法使用auto自动推导类型initializer_list> kvi1 = { {"left", "左边"}, {"right", "右边"} };// 注:pair第一个参数要加const修饰,才能调用map的initializer_list赋值运算符重载dict = kvi1;for (auto& kv : dict){cout << kv.first << ":" << kv.second << endl;}return 0;
}

在这里插入图片描述

在这里插入图片描述

总结:C++11 后,一切对象都可以使用列表初始化,但是建议内置类型还是使用以前的方式进行初始化,容器如果有需求可以采用列表初始化。

👉声明👈

C++11 提供了多种简化声明的方式,尤其是在使用模板时。

auto

在 C++98 中 auto 是一个存储类型的说明符,表明变量是局部自动存储类型,但是局部域中定义局部的变量默认就是自动存储类型,所以 auto 就没什么价值了。C++11 中废弃 auto 原来的用法(声明自动类型变量的功能),将其用于实现自动类型推导。这样要求必须进行显示初始化,让编译器将定义对象的类型设置为初始化值的类型。

int main()
{map dict = { {"string","字符串"},{"left","左边"} };//map::const_reverse_iterator rit = dict.rbegin();auto rit = dict.rbegin();
}

decltype

关键字 decltype 将变量的类型声明为表达式指定的类型。

int main()
{int x = 10;decltype(x) y = 20;cout << typeid(y).name() << endl;
}

在这里插入图片描述
注:typeid 拿到的只是类型的字符串,不能用这个再去定义对象。

在这里插入图片描述

// decltype的一些使用使用场景
template
void F(T1 t1, T2 t2)
{decltype(t1 * t2) ret = t1 * t2;cout << typeid(ret).name() << endl;
}
int main()
{const int x = 1;double y = 2.2;decltype(x * y) ret; // ret的类型是doubledecltype(&x) p; // p的类型是int*cout << typeid(ret).name() << endl;cout << typeid(p).name() << endl;F(1, 'a');return 0;
}

在这里插入图片描述

nullptr

由于 C++ 中 NULL 被定义成字面常量 0,这样就可能回带来一些问题。因为 0 既能指针常量,又能表示整形常量。所以出于清晰和安全的角度考虑,C++11 中新增了nullptr,用于表示空指针。

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

👉范围 for👈

范围 for 在前面的博客中已经进行了非常详细的讲解,这里就不进行讲解了。范围 for 的底层就是替换成迭代器。

👉智能指针👈

智能指针主要用于解决内存泄漏问题的,是非常重要的一个话题,将会另写一篇博客来进行讲解,所以智能指针不会在本篇博客里讲解。

👉STL中一些变化👈

新容器
用橘色圈起来是 C++11 中的一些几个新容器,但是实际最有用的是 unordered_map 和 unordered_set。这两个我们前面已经进行了非常详细的讲解,其他的大家了解一下即可。

在这里插入图片描述

C 语言的数组越界读是基本检查不出来的,而越界写是抽查。而 array 只要是越界就会报错,因为它的 [ ] 是调用operator[],在该函数里有越界的断言检查。

容器中的一些新方法

如果我们再细细去看会发现基本每个容器中都增加了一些 C++11 的方法,但是其实很多都是用得比较少的。比如提供了 cbegin 和 cend 方法返回 const 迭代器等等,但是实际意义不大,因为 begin 和 end 也是可以返回 const 迭代器的,这些都是属于锦上添花的操作。

实际上 C++11 更新后,容器的插入数据的接口函数的增加了右值引用的版本,还增加了移动构造和移动赋值,它们都可以提高效率。这个知识点将会在下一篇博客里讲解。

在这里插入图片描述

👉总结👈

本篇博客主要讲解了 C++11 的一些新特性,如:列表初始化、auto、decltype、nullptr 和 范围 for 等等。那么以上就是本篇博客的全部内容了,如果大家觉得有收获的话,可以点个三连支持一下!谢谢大家!💖💝❣️

相关内容

热门资讯

迷你退出安卓系统了吗,转型新篇... 最近有没有发现你的手机上那个可爱的迷你退出图标突然不见了?别急,让我来给你揭秘迷你退出安卓系统了吗的...
华为优先使用安卓系统,打造自主... 你知道吗?最近科技圈里有个大动作,那就是华为宣布优先使用安卓系统。这可不是一个简单的决定,它背后可是...
安卓系统隐藏了设置,隐藏设置功... 你知道吗?安卓系统这个大宝藏里,竟然隐藏着一些不为人知的设置!是不是听起来就有点小激动呢?别急,今天...
反渣恋爱系统安卓,收获真爱 你有没有听说过那个神奇的“反渣恋爱系统安卓”呢?最近,这款应用在网络上可是火得一塌糊涂,不少单身狗都...
安卓出厂系统能升级,探索无限可... 你知道吗?现在这个时代,手机更新换代的速度简直就像坐上了火箭!而说到手机,安卓系统可是占据了半壁江山...
老安卓刷机系统,从入门到精通 你有没有想过,你的老安卓手机其实还有大大的潜力呢?没错,就是那个陪伴你多年的老安卓,它可不是只能用来...
安卓粉ios系统app,兼容性... 你有没有发现,身边的朋友圈里,安卓粉和iOS系统粉总是争论不休?今天,咱们就来聊聊这个话题,看看安卓...
安卓系统语言下载,探索安卓系统... 你有没有想过,你的安卓手机是不是该换换口味了?没错,就是语言!想象如果你能轻松切换到自己喜欢的语言,...
安卓共有多少种系统,究竟有多少... 你有没有想过,安卓这个我们每天不离手的操作系统,竟然有那么多不同的版本呢?没错,安卓系统就像一个大家...
安卓系统怎么播放swf,And... 你有没有遇到过这种情况:手里拿着一部安卓手机,想看一个SWF格式的动画,结果发现怎么也打不开?别急,...
pos机安卓系统跟win系统,... 你有没有想过,那些在我们生活中默默无闻的POS机,竟然也有自己的操作系统呢?没错,就是安卓系统和Wi...
俄罗斯封禁安卓系统,本土化替代... 俄罗斯封禁安卓系统的背后:技术、经济与社会的影响在数字化浪潮席卷全球的今天,智能手机已成为我们生活中...
安卓系统总是弹出权限,安卓系统... 手机里的安卓系统是不是总爱和你玩捉迷藏?每次打开一个应用,它就跳出来问你要不要给它开权限,真是让人又...
安卓系统测血氧,便捷健康生活新... 你知道吗?现在科技的发展真是让人惊叹不已!手机,这个我们日常生活中不可或缺的小玩意儿,竟然也能变身成...
蓝光助手安卓系统的,深度解析与... 你有没有发现,现在手机屏幕越来越大,看视频、刷抖音,简直爽到飞起!但是,你知道吗?长时间盯着屏幕,尤...
安卓系统如何隐藏提示,Andr... 你是不是也和我一样,在使用安卓手机的时候,总是被那些弹出来的提示信息打扰到?别急,今天就来教你怎么巧...
安卓6.0系统如何分区,And... 你有没有想过,你的安卓手机里那些神秘的分区到底是怎么来的?别急,今天就来给你揭秘安卓6.0系统如何分...
安卓系统图片怎么涂鸦,指尖上的... 你有没有想过,在安卓系统的手机上,那些单调的图片也能变得生动有趣呢?没错,就是涂鸦!今天,就让我来带...
安卓系统40g,40GB存储空... 你有没有发现,最近你的安卓手机突然变得有点“胖”了呢?没错,就是那个传说中的40G!别急,别慌,今天...
安卓5.0系统怎么重置,轻松实... 手机用久了是不是感觉卡得要命?别急,今天就来教你怎么给安卓5.0系统来个彻底的重置,让它焕发新生!一...