当前位置:首页 » 《资源分享》 » 正文

【C++】语法简化和增强,C++11都做了什么?

8 人参与  2024年10月21日 08:01  分类 : 《资源分享》  评论

点击全文阅读


头像 ?个人主页:@小羊 ?所属专栏:C++ 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~

动图描述

目录

前言1、统一的列表初始化1.2 std::initializer_list 2、声明2.1 auto2.2 decltype2.3 nullptr 结语


前言

相比于C++98,C++11在C++98的基础上进行了大量的改进和扩展,包含了很多新特性,也包括对一些缺陷的修正,这些新特性和改进不仅提高了代码的质量和效率,还为开发者提供了更强大的工具和更灵活的编程方式。


1、统一的列表初始化

C++11支持一切皆可列表初始化。

在C++98中我们可以对数组和结构体用{}进行初始化,C++11扩大了{}的使用范围,使其可以对所有内置类型和自定义类型初始化,可是说是统一了列表的初始化方式。其中初始化列表时,=是可以省略的。

struct Point{int _a;int _b;};int main(){int a = 1;int b{ 2 };int arr1[] = { 1,2,3 };int arr2[]{ 4,5,6 };Point{ 7,8 };//c++11中列表初始化也适用new表达式int* p = new int[1] {0};return 0;}

C++11也支持创建对象时使用列表初始化调用构造函数初始化。

class Date{public:Date(int year, int month, int day):_year(year),_month(month),_day(day){}private:int _year;int _month;int _day;};int main(){Date d1(2024, 10, 18);Date d2{ 2024, 10, 18 };Date d3 = { 2024, 10, 18 };return 0;}

上面的初始化方式和容器的初始化方式很像,但两者有本质的区别,要分清楚。

int main(){Date d3 = { 2024, 10, 18 };vector<int> v = { 2024, 10, 18 };return 0;}
自定义类型{}初始化时必须和构造参数个数匹配容器{}初始化可以有任意多个参数

1.2 std::initializer_list

std::initializer_list是C++11引入的一种特殊类型,它提供了一种简洁、直观的方式来初始化容器或数组,以及作为函数(特别是构造函数)的参数来接受多个同类型的值。

在这里插入图片描述

std::initializer_list提供了迭代器,可以通过begin()和end()成员函数获取指向列表首元素和尾元素(不包括尾元素本身)的迭代器。
作为函数参数,特别是当函数需要处理多个同类型参数时,使用std::initializer_list可以使函数接口更加简洁和灵活。

| 列表初始化和initializer_list的区别和联系:

区别: 列表初始化是一种初始化方式,而initializer_list是一种类型列表初始化使用大括号{}来包围初始化器的值,而initializer_list则是一个模板类,用于接收这些值 联系: 当使用列表初始化语法时,编译器会生成一个std::initializer_list对象来存储初始化列表中的元素类的构造函数可以重载以接受一个std::initializer_list类型的参数,从而允许使用列表初始化来创建对象

2、声明

2.1 auto

C++11后,auto关键字用于自动类型推断,这意味着编译器会根据初始化表达式来自动确定变量的类型。这个特性使得对一些长类型更加方便。

int main(){std::map<std::string, std::string> m = { {"front", "前"}, {"behind", "后"} };//std::map<std::string, std::string>::iterator it = m.begin();auto it = m.begin();return 0;}

2.2 decltype

decltype关键字将变量的类型声明为表达式指定的类型。
假如我们想用vector存map的迭代器:

//vector<std::map<std::string, std::string>::iterator> v;vector<decltype(it)> v;

这个时候用decltype就很方便。


2.3 nullptr

NULL实际是一个宏,C++中NULL可能被定义为字面常量0,或者C中被定义为无类型指针(void*)的常量,不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦,本想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成0,调用了f(int x),因此与程序的初衷相悖,f((void*)NULL)调用会报错

在这里插入图片描述

C++11中引入nullptrnullptr是一个特殊的关键字,nullptr是一种特殊类型的字面量,它可以转换成任意其他类型的指针类型,使用nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被隐式地转换为指针类型,而不能被转换为整数类型

结语

本文只介绍了C++11带来的一些语法简化和增强,后面会重点介绍C++11的新特性和功能,Lambda表达式、智能指针、多线程支持、右值引用等等,敬请期待。

本篇文章的分享就到这里了,如果您觉得在本文有所收获,还请留下您的三连支持哦~

头像

点击全文阅读


本文链接:http://zhangshiyu.com/post/174739.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 祖母寿宴,侯府冒牌嫡女被打脸了(沈屿安秦秀婉)阅读 -
  • 《雕花锦年,昭都旧梦》(裴辞鹤昭都)完结版小说全文免费阅读_最新热门小说《雕花锦年,昭都旧梦》(裴辞鹤昭都) -
  • 郊区41号(许洛竹王云云)完整版免费阅读_最新全本小说郊区41号(许洛竹王云云) -
  • 负我情深几许(白诗茵陆司宴)完结版小说阅读_最热门小说排行榜负我情深几许白诗茵陆司宴 -
  • 九胞胎孕妇赖上我萱萱蓉蓉免费阅读全文_免费小说在线看九胞胎孕妇赖上我萱萱蓉蓉 -
  • 为保白月光,侯爷拿我抵了债(谢景安花田)小说完结版_完结版小说全文免费阅读为保白月光,侯爷拿我抵了债谢景安花田 -
  • 陆望程映川上官硕《我的阿爹是带攻略系统的替身》最新章节阅读_(我的阿爹是带攻略系统的替身)全章节免费在线阅读陆望程映川上官硕
  • 郑雅琴魏旭明免费阅读_郑雅琴魏旭明小说全文阅读笔趣阁
  • 头条热门小说《乔书意贺宴临(乔书意贺宴临)》乔书意贺宴临(全集完整小说大结局)全文阅读笔趣阁
  • 完结好看小说跨年夜,老婆初恋送儿子故意出车祸_沈月柔林瀚枫完结的小说免费阅读推荐
  • 热推《郑雅琴魏旭明》郑雅琴魏旭明~小说全文阅读~完本【已完结】笔趣阁
  • 《你的遗憾与我无关》宋怀川冯洛洛无弹窗小说免费阅读_免费小说大全《你的遗憾与我无关》宋怀川冯洛洛 -

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1