c++2.0新特性(c++11/14)

语言部分

1. Variadic Templates可变参数模板

可以设计不同个数,不同类型的参数模板。
详见Variadic Templates介绍

2. nullptr

nullptr 出现的目的是为了替代 NULL。

在某种意义上来说,传统 C++ 会把 NULL、0 视为同一种东西,这取决于编译器如何定义 NULL,有些编译器会将 NULL 定义为 ((void*)0),有些则会直接将其定义为 0。
nullptr 的类型为 nullptr_t,能够隐式的转换为任何指针或成员指针的类型,也能和他们进行相等或者不等的比较。

3. 类型推导

C++11 引入了autodecltype这两个关键字实现了类型推导,让编译器来操心变量的类型。

auto

使用 auto 进行类型推导的一个最为常见而且显著的例子就是迭代器。在以前我们需要这样来书写一个迭代器:

     for(vector<int>::const_iterator itr = vec.cbegin(); itr != vec.cend(); ++itr)

而有了 auto 之后可以:

       for(auto itr = vec.cbegin(); itr != vec.cend(); ++itr);

decltype

decltype 关键字是为了解决 auto 关键字只能对变量进行类型推导的缺陷而出现的。它的用法和 sizeof 很相似:
decltype(表达式)
在此过程中,编译器分析表达式并得到它的类型,却不实际计算表达式的值。

4. 基于范围的 for 循环

C++11 引入了基于范围的迭代写法,我们拥有了能够写出像 Python 一样简洁的循环语句。
最常用的 std::vector 遍历将从原来的样子:

	std::vector<int> arr(5, 100);
	for(std::vector<int>::iterator i = arr.begin(); i != arr.end(); ++i)
	 {
	    std::cout << *i << std::endl;
	}

变得非常简单:

	// & 启用了引用可以方便直接改值
	for(auto &i : arr) {    
	    std::cout << i << std::endl;
	}

5.构造函数

委托构造,默认构造
C++11 引入了委托构造的概念,这使得构造函数可以在同一个类中一个构造函数调用另一个构造函数,从而达到简化代码的目的:

		class Base
		 {
			public:
			    int value1;
			    int value2;
			    Base ()=default;  
			    Base(int a) 
			    {
			        value1 = a;
			    }
			    Base(int b) : Base(int a)    // 委托 Base(int a) 构造函数
			    {  
			        value2 = b;
			    }
          }

//一般自己 定义了构造函数编译器就不再生成默认的构造函数,=default;可以使编译器继续生成默认构造函数(基本造函数,拷贝构造函数,赋值函数=,析构函数)
//使用=delete;可以禁止编译器自动生成默认构造函数

6.Lambda 表达式

Lambda 表达式,实际上就是提供了一个类似匿名函数的特性,而匿名函数则是在需要一个函数,但是又不想费力去命名一个函数的情况下去使用的。类似于inline函数
Lambda 表达式的基本语法如下:
[ caputrue ] ( params ) mutable_opt -> retType { body; }
详见lambda表达式

7.类的继承中 虚函数重写关键词override,关键词final

class A
{ virtual void func(int){ } };
class B : A
{ void func(float) override{ } };

如果不加override,编译器认为A和B中的两个func是独立的两个函数(因为参数类型不同),如果B中func是想重写父类A中的func,加上override关键词告诉编译器是重写函数,编译器会报错,因为重写函数参数类型要一致,所以如果主观上是要重写函数,最好加上override关键词,有助于编译器纠错。
在类的声明后面加final,表示该类不能被其他类再继承。在虚函数后面加final表示该虚函数在子类中不能再被重写。

class C final : A
{  void func(int) final override { } };

8. 常量表达式constexpr

constexpr详解

9.Uniform Initialization 一致性初始化

可以统一的在变量后面用{}进行初始化。不需要‘=’。
vector v{1,2,4};

标准库部分

10.右值引用和move语义。

解决非必要的拷贝。
右值引用和move语义详解

11.新增容器

std::array

std::array 保存在栈内存中,相比堆内存中的 std::vector,我们能够灵活的访问这里面的元素,从而获得更高的性能。
std::array 会在编译时创建一个固定大小的数组,std::array 不能够被隐式的转换成指针,使用 std::array只需指定其类型和大小即可

std::forward_list

std::forward_list 是一个列表容器,使用方法和 std::list 基本类似。
和 std::list 的双向链表的实现不同,std::forward_list 使用单向链表进行实现,提供了 O(1) 复杂度的元素插入,不支持快速随机访问(这也是链表的特点),也是标准库容器中唯一一个不提供 size() 方法的容器。当不需要双向迭代时,具有比 std::list 更高的空间利用率。

unordered container:

unordered_set, unordered_multiset, unordered_map, unordered_multimap.
其底部均由Hashtable类实现

12.tuple(利用Variadic Templates可变参数模板实现)

tuple属于标准库里stl以外的部分。
存放任意个不同类型的数据

	tuple<int, float, string> t1{3, 4.4, "abc"};
	或者:auto t1=make_tuple(3, 4.4, "abc");

取出第i个元素: get<i>(t1); i从0开始。 其返回的是引用,可以用来改变t1内的元素值(类似于索引)
将tuple内元素分解:

	int a;
	float b;
	string c;
	tie(a, b, c)=t1
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学习并掌握C++2.0(11+14+17+20)的特性,学习线程及线程池的应用 ---------------------------------------------------给小白学员的3年学习路径及计划技术方面分三块:1.纯开发技术方向2.音视频流媒体专业方向3.项目实战---------------------------------------------------1.纯开发技术方向(1) C++必须要过硬(至少学会10本经典好书)(2) 系统级编程(Windows、Linux),必须特别熟练系统API,灵活运用(3) 框架与工具(Qt、MFC):必须精通其中一种。(4) 架构与设计模式:需要提升一个高度,不再是简单的编码,而是思维模式。(5) 驱动级别(如果有兴趣,可以深入到驱动级:包括Windows、Linux)(6) 最好学习点Java+Html+javascript等WEB技术。2.音视频流媒体专业方向(1) 音视频流媒体基础理论:   必须认真学会,否则看代码就是看天书(2) 编解码方向:精通h.264,h.265(hevc), 包括理论和各个开源库(ffmpeg,libx264,libx265,...)。(3) 直播方向:  精通各种直播协议(rtsp,rtmp,hls,http-flv,...), 钻研各个开源库(live555,darwin,srs,zlmediakit,crtmpserver,...)(4) 视频监控:  理论+开源库(onvif+281818)(EasyMonitor、iSpy、ZoneMinder(web)、...) 3.项目实战(1) Qt项目:  至少要亲手练习10个实战项目(网络服务器、多线程、数据库、图像处理、多人聊天、等等)(2)音视频项目:包括编解码、视频监控、直播等各个方向,都需要亲手实战项目,包括视频服务器、后台管理系统、前端播放器(多端)---------------------------------------------------  第1章 C++11特性 41). nullptr关键字与语法 42). auto和decltype类型推导 6 auto讲解 6 auto示例 7 decltype 83). for区间迭代 94). 初始化列表 105). 模板增强 11外部模板 11类型别名模板 12默认模板参数 126). 构造函数 13委托构造 13继承构造 147). Lambda 表达式 158). 增容器 20std::array 20std::forward_list 21无序容器 22元组 std::tuple 239). 正则表达式 2610). 语言级线程支持 28多线程库简介 2811). 右值引用和move语义 31右值引用和move语义 32转移左值 3412). constexpr 35第2章 C++14特性 36Lambda 函数 36类型推导 37返回值类型推导(Return type deduction) 37泛型lambda 39[[弃用的]]  [[deprecated]]属性 40二进制数字和数字分隔符 41第3章 C++17特性 42安装GCC10.2 42安装msys2-x86_64-20200720 42更镜像 42更软件库 43安装 MinGW64 等必要的软件 43环境变量Path 43编译命令 43constexpr 44typename 45折叠表达式 47结构化绑定 48条件分支语句初始化 49聚合初始化 50嵌套命名空间 52lambda表达式捕获*this的值 53改写/继承构造函数 54用auto作为非类型模板参数 55__has_include 56fallthrough 57nodiscard 57maybe_unused 58第4章 C++20特性 59编译命令 59concept 59typename 60explicit 61constinit 62位域变量的默认成员初始化 62指定初始化 63基于范围的for循环初始化 64放宽基于范围的for循环,增自定义范围方法 65嵌套内联命名空间 66允许用圆括弧的值进行聚合初始化 67unicode字符串字面量 68允许转换成未知边界的数组 68likely和unlikely 69第5章 C++2.0(11/14/17/20)总结与分析 705.1 C语言与C++ 715.2 语言可用性的强化 725.2.1 常量 725.2.2 变量及其初始化 735.2.3 类型推导 745.2.4 控制流 765.2.5 模板 775.2.6 面向对象 815.3 语言运行期的强化 835.3.1 Lambda 表达式 835.3.2 右值引用 865.4 容器 885.4.1 线性容器 885.4.2 无序容器 895.4.3 元组 895.5 智能指针与内存管理 905.5.1 RAII 与引用计数 905.5.2 std::shared_ptr 905.5.3 std::unique_ptr 915.5.4 std::weak_ptr 91第6章 C++2.0多线程原理与实战 93什么是并发 93并发的方式 93为什么使用并发 95线程简介 96创建线程的三种方式 971. 通过函数 972.通过类对象创建线程 993.通过lambda表达式创建线程 101thread线程的使用 101互斥量与临界区 105期物Future 111条件变量 112原子操作 114内存模型 118第7章 C++2.0线程池原理与实战 120线程与线程池的基本原理 1201)、线程 1202)、线程的生命周期 1213)、什么是单线程和多线程 1214)、线程池 1225)、四种常见的线程池 123线程池的架构与流程 123线程池代码实战 125    

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值