文章目录

  • 1. C++11简介
  • 2. 统一的列表初始化
    • 2.1 {}初始化
    • 2.2 std::initializer_list
  • 3. 声明
  • 3.1 auto
  • 3.2 decltype
    • 3.3 nullptr
  • 4 范围for循环

1. 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++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。相比C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。相比较而言C++11能更好地用于系统开发和库开发、语法更加泛华简单化、更加稳定和安全,不仅功能更强大,而且能提升程序员的开发效率,公司实际项目开发中也用得比较多,所以我们要作为一个重点去学习。C++11增加的语法特性非常篇幅非常多,我们这里没办法一 一讲解,所以本节课程主要讲解实际中比较实用的语法。

  • 具体链接:c++11

2. 统一的列表初始化

2.1 {}初始化

  • 在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扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号(=),也可不添加。
struct Point
{int _x;int _y;
};
int main()
{int x1 = 1;int x2{ 2 };int array1[]{ 1, 2, 3, 4, 5 };int array2[5]{ 0 };Point p{ 1, 2 };// C++11中列表初始化也可以适用于new表达式中int* pa = new int[4]{ 0 };return 0;
}
  • 创建对象时也可以使用列表初始化方式调用构造函数初始化
class Date
{public:Date(int year, int month, int day):_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(2022, 1, 1); // old style// C++11支持的列表初始化,这里会调用构造函数初始化Date d2{ 2022, 1, 2 };Date d3 = { 2022, 1, 3 };return 0;
}

2.2 std::initializer_list

链接:std::initializer_list的介绍文档:

  • std::initializer_list是什么类型:
  • std::initializer_list使用场景:

std::initializer_list一般是作为构造函数的参数,C++11对STL中的不少容器就增加 std::initializer_list作为参数的构造函数,这样初始化容器对象就更方便了。也可以作为operator=的参数,这样就可以用大括号赋值。

int main()
{vector<int> v = { 1,2,3,4 };list<int> lt = { 1,2 };// 这里{"sort", "排序"}会先初始化构造一个pair对象map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };// 使用大括号对容器赋值v = { 10, 20, 30 };return 0;
}
  • 让模拟实现的vector也支持{}初始化和赋值
namespace Ding
{template<class T>class vector {public:typedef T* iterator;vector(initializer_list<T> l){_start = new T[l.size()];_finish = _start + l.size();_endofstorage = _start + l.size();iterator vit = _start;typename initializer_list<T>::iterator lit = l.begin();while (lit != l.end()){*vit++ = *lit++;}//for (auto e : l)// *vit++ = e;}vector<T>& operator=(initializer_list<T> l) {vector<T> tmp(l);std::swap(_start, tmp._start);std::swap(_finish, tmp._finish);std::swap(_endofstorage, tmp._endofstorage);return *this;}private:iterator _start;iterator _finish;iterator _endofstorage;};
}

3. 声明

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

3.1 auto

  • 在C++98中auto是一个存储类型的说明符,表明变量是局部自动存储类型,但是局部域中定义局部的变量默认就是自动存储类型,所以auto就没什么价值了。
  • C++11中废弃auto原来的用法,将其用于实现自动类型腿断。这样要求必须进行显示初始化,让编译器将定义对象的类型设置为初始化值的类型。
int main()
{int i = 10;auto p = &i;cout << typeid(p).name() << endl;map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };//map<string, string>::iterator it = dict.begin();auto it = dict.begin();return 0;
}

3.2 decltype

  • 关键字decltype将变量的类型声明为表达式指定的类型。
// decltype的一些使用使用场景
template<class T1, class T2>
void F(T1 t1, T2 t2)
{decltype(t1 * t2) ret;cout << typeid(ret).name() << endl;
}
int main()
{const int x = 1;double y = 2.2;decltype(x * y) ret; // ret的类型是doubledecltype(&x) p; // p的类型是const int*cout << typeid(ret).name() << endl;cout << typeid(p).name() << endl;F(1, 'a');return 0;
}

3.3 nullptr

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

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

4 范围for循环

  • 其实范围for的底层就是迭代器的实现。

C++11初篇(快速了解)相关推荐

  1. Android逆向工程 初篇

    Android逆向工程 初篇 本篇文章建立于有开发环境(jdk,android sdk)基础之上,没有环境的朋友自己去配. 什么是APK? </p> 什么是Dalvik?</p> ...

  2. Android逆向工程 初篇 1

    Android逆向工程 初篇 本篇文章建立于有开发环境(jdk,android sdk)基础之上,没有环境的朋友自己去配. 什么是APK? 什么是Dalvik? 什么是Smali? 什么是APK AP ...

  3. PE格式详细讲解11 - 系统篇11|解密系列

    PE格式详细讲解11 - 系统篇11 让编程改变世界 Change the world by program   今天我们来谈谈资源部分,资源部分可以说是 PE 文件所有结构中,最复杂的一部分,也最让 ...

  4. unity人物旋转移动代码_游戏诞生之日02 - 美术篇 快速制作人物动画

    在上一篇<游戏诞生之日01 - 美术篇 快速搭建和渲染游戏的第一个场景>里,我们得到了一个静态渲染的游戏场景. 接下来我们需要加入人物动画,为游戏注入活力. 第五块拼图 - 动画素材从哪里 ...

  5. 老的消息中间件投递失败的类型值_RabbitMQ消息中间件技术精讲11 高级篇四 confirm 确认消息...

    RabbitMQ消息中间件技术精讲11 高级篇四 confirm 确认消息 理解Confirm消息确认机制: 消息的确认,是指生产者投递消息后,如果broker收到消息,则会给生产者一个应答: 生产者 ...

  6. java 11_JAVA 11初体验

    JAVA 11初体验 随着JAVA没半年发布一次新版本,前几天JAVA 11隆重登场.在JAVA 11中,增加了一些新的特性和api, 同时也删除了一些特性和api,还有一些性能和垃圾回收的改进. 作 ...

  7. 【python小课堂专栏】python小课堂11 - 变量篇

    python小课堂11 - 变量篇 前言 上周偷了点懒,周四到周末断更了,后来思考了下,前一阵儿的更新频率达到了日日更,虽然每章小知识都很详细..但是同学建议进度加快,emmm-然后我决定拉长更新周期 ...

  8. 第四篇 快速、轻量、可扩展、易于使用的EmEditor

    第四篇 快速.轻量.可扩展.易于使用的EmEditor 最近一直在尝试各种文本编辑器.说实话,以前对文本编辑器没啥要求,普通的也就用Windows自带的记事本了.想要高亮或格式好点的,这时候就会使用E ...

  9. 论ORM之EFCore初篇(快速基于本地数据库实现数据操作)

    欢迎大家阅读<朝夕Net社区技术专刊>第6期 我们致力于.NetCore的推广和落地,为更好的帮助大家学习,方便分享干货,特创此刊!很高兴你能成为忠实读者,文末福利不要错过哦! 前言: 今 ...

最新文章

  1. typeof,instanceof 和 isProtoTypeof
  2. python扫描字符串文本时下线_python字符串处理
  3. inner join
  4. linux 命令访问url: curl http://www.baidu.com/index.html
  5. 基于AI的便携式神经假肢让截肢14年患者操作自如,高精度、低延迟
  6. vc调试 main的参数
  7. ABAP程序系统字段中英文详解
  8. TTL_CMOS_RS232区别
  9. 雅诗兰黛天猫超级品牌日:未央唇膏、红装小棕瓶“当红不让”
  10. Card Game Again CodeForces - 818E (双指针)
  11. [Leetcode][第114题][JAVA][二叉树展开为链表][递归][迭代]
  12. mnist tensorrt 运行_TensorRT学习笔记(三)
  13. 软件工程参考文献精品文献汇总
  14. 公司-瑞幸咖啡:瑞幸咖啡
  15. java经纬度曲线简化_JAVA 后台计算 经纬度 最短距离
  16. 我们的地盘,我们做主
  17. 如何用python把Mac录屏转换成GIF
  18. Keil4工程用Keil5继续开发,编译报错问题探究
  19. 有向图加边成强连通图(tarjan缩点)
  20. i致我们终将组件化的Web

热门文章

  1. 在Ubuntu上安装jdk,tomcat8, mysql5.7
  2. 《流浪地球》票房:预测10亿却飚50亿 ,大数据预测为什么这么难...
  3. Error in melt() : could not find function “melt“
  4. javaWeb 中Tomcat 10 jsp文件内置对象不能正常使用的问题(已解决)
  5. python or的用法_详细介绍Python中and和or实际用法
  6. Android 第五章 TextView
  7. 【天光学术】民法学论文:从税收法定主义看我国税收立法之不足【开题报告 硕士研究生毕业论文】
  8. 天大青医堂第十期报告会之二
  9. windows下tomcat集群配置(两种方法)
  10. 2022-08-15