1.C++11的发展历史 C++11 是 C++ 的第⼆个主要版本,并且是从 C++98 起的最重要更新。它引⼊了⼤量更改,标准化了既 有实践,并改进了对 C++ 程序员可⽤的抽象。 C++03 与 C++11 期间花了 8 年时间,故⽽这是迄今为⽌最⻓的版本间隔。从那时起,C++ 有规律地每 3 年更新⼀次。 +98的C++语法中就有引⽤的语法,⽽C++11中新增了的右值引⽤语法特性,C++11之后我们之前用到的引⽤就叫做左值引⽤。 纯右值和将亡值C++11中提出的,C++11中的纯右值概念划分等价于 C++98中的右值。 C++还⽀持更复杂的包扩展,直接将参数包依次展开依次作为实参给⼀个函数去处理。
一、C++11简介 1998年是C++标准委员会成立的第一年,本来计划以后每5年视实际需要更新一次标准,C++国际标准委员会在研究C++ 03的下一个版本的时候,一开始计划是2007年发布,所以最初这个标准叫 结果2010年的时候也没完成,最后在2011年终于完成了C++标准。所以最终定名为C++11。 从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。 相比较而言,C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更强大,而且能提升程序员的开发效率,公司实际项目开发中也用得比较多,是C++的重点内容。 +11提供了initializer_list类,此类型用于访问C++初始化列表中的值,该列表是const T类型的元素列表。 六、右值引用和移动语义 传统的C++语法中就有引用的语法,而C++11中新增了的右值引用语法特性,无论左值引用还是右值引用,都是给对象取别名。 1. 什么是左值?什么是左值引用?
C++程序员经常问的11个问题 这篇文章收了好长时间,但还是觉得贴出来,作为收藏,在网上这样的浮躁环境,很少能认认真真地看这样长的文章,有时间我也要把《Effective C++》的读书笔记作出来 以下是原文: 下面的这些要点是对所有的C++程序员都适用的。我之所以说它们是最重要的,是因为这些要点中提到的是你通常在C++书中或网站上无法找到的。 如:指向成员的指针,这是许多资料中都不愿提到的地方,也是经常出错的地方,甚至是对一些高级的C++程序员也是如此。 这里的要点不仅仅是解释怎样写出更好的代码,更多的是展现出语言规则里面的东西。 很显然,它们对C++程序员来说是永久的好资料。我相信这一篇文章会使你收获不小。 首先,我把一些由不同层次的C++程序员经常问的问题归到一起。 我惊奇的发现有很多是有经验的程序员都还没意识到 .h 符号是否还应该出现在标准头文件中。 要点1: 还是 ? 很多C++程序员还在使用而不是用更新的标准的库。这两者都有什么不同呢?
C++ 封装 我们都知道多核编程常用锁避免多个线程在修改同一个数据时产生race condition。当锁成为性能瓶颈时,我们又总想试着绕开它,而不可避免地接触了原子指令。 C++11正式引入了原子指令,我们就以其语法描述。 顾名思义,原子指令是对软件不可再分的指令,比如x.fetch_add(n)指原子地给x加上n,这个指令对软件要么没做,要么完成,不会观察到中间状态。 为了解决这个问题,CPU和编译器提供了memory fence,让用户可以声明访存指令间的可见性(visibility)关系,boost和C++11对memory fence做了抽象,总结为如下几种memory 理解C++的原子操作 事实上,Sequentially-consistent ordering是目前绝大多数编译器的缺省设置。 C++11所规定的这6种模式,其实并不是限制(或者规定)两个线程该怎样同步执行,而是在规定一个线程内的指令该怎样执行。是的,我知道这部分的文档(规定)以及给出的例子里面,满屏都是多线程。
singleton // T must be: no-throw default constructible and no-throw destructible template <typename T> struct Singleton { private: struct object_creator { // This constructor does nothing more than ensure that instance() // is call
C++ 11 的一些新特性 原始字面量 R("string...") /text.cc 上面换了个行)"; std::cout << str << std::endl; } [Running] cd "/root/code-server/c11 -new/" && g++ 字符串字面量.cc -o 字符串字面量 && "/root/code-server/c11-new/"字符串字面量 ../..
注:作者 Danny Kalev 曾是 C++ 标准委员会成员。 Lambda 表达式 Lambda 表达式的形式是这样的: [cpp] view plaincopyprint? C++11 only. 这有两个好处:一是让程序员轻松了,少敲键盘,二是有更好的性能。 与 defaulted 函数相对的就是 deleted 函数: [cpp] view plaincopyprint? 下面介绍一些 C++11 的标准库新特性: 线程库 从程序员的角度来看,C++11 最重要的特性就是并发了。 如果觉得 C++ 变化太大了,不必惊恐,花点时间来学习就好了。可能在你融会贯通新特性以后,你会同意 Stroustrup 的观点:C++11 是一门新的语言——一个更好的 C++。
p=new int(rhs.p); delete tmp;//释放原先内存 return *this; } int *p; }; 发布者:全栈程序员栈长
nullptr\text{nullptr}nullptr 的出现是为了取代 NULL\text{NULL}NULL,避免 NULL\text{NULL}NULL 的二义性。
如果你的代码工作正常并且表现良好,你可能会想知道为什么还要使用C++ 11。当然了,使用用最新的技术感觉很好,但是事实上它是否值得呢? 在我看来,答案毫无疑问是肯定的。 C++ 11可以让你的代码更短、更清晰、和更易于阅读,这可以让你的效率更高。 C++ 11提供了一种方法来检查先决条件并尽早的在可能的时机捕获错误-编译过程中,在你运行代码前。这就是理由9。 这是通过静态断言(static_assert)和类别属性模版实现的。 现在开始掌握C++ 11 在C++ 11标准中除了上描述的还有更多的改动和新功能,它需要一整本数来描述。不过,我相信它们是值得你花时间去学习的。你将省去以往花在提高效率上的时间。 很多主流的编译器已经开始支持C++ 11的一些标准了。还等什么?开始吧! 推荐: http://www.cnblogs.com/roucheng/p/3456005.html
前言: 继上文介绍了右值概念,本文介绍两个C++11中的重要概念,lambda表达式和模板的可变参数,这两个部分都不算难,重在理解,有了lambda表达式和模板的可变参数的基础才好理解包装器。 ]()mutable { a++, b++, c++, d++; }; auto Fs2 = [&](){ a++, b++, c++, d++; }; auto Fs3 = [&a]() { a+ 2 模板的可变参数 模板的可变参数,在C++11中可以经常看到的: 就比如emplace的参数,就是模板的可变参数,没错,那三个点也算进去了! 因为模板的可变参数,在C语言里面可以一次性打印多个值(只用一次printf),那么我们想用C++实现怎么办呢? () { return new Heap; } // C++98 私有+只声明不实现 // // C++11 Heap(const Heap&) = delete; private: Heap
前言: 在C++11之前,C++98的出现使得C++看起来更像是一门独立的语言,C++委员会成立后,对外宣称的是5年一个版本,但是呢,计划赶不上变化,03年发布了C++03,计划07年发布07版本,变数多了 ,就一直拖啊拖,拖到了C++11,也就是2011年才发布,搁了这么久,C++11也是憋了一个大的,但是挨骂也挨多了,于是呢,后面就想着,有点新东西了就发布新版本,比如之后的C++14 C++17,C++ 20等,目前来说,C++98 C++11 C++20都是大版本,其中20还没有那么大,毕竟是3年更新一次,C++11相对于98来说,更正了许多错误,引入了很多新特性,包含了约140个新特性,600个缺陷修正 提到了列表初始化,就不得不提到initializer_list了,这里以vector为例子: 在C++11的版本,支持initializer_list的构造,这样对于对象的创建就更加简单了。 2.3 nullptr 在C++中,对于NULL定义一直是宏定义为0,这就可能引入部分问题了,因为同时可以表示整型和指针类型,C++11中出于安全考虑加入了nullptr,表示空指针。
前言: 本文介绍的是包装器以及线程库的简单了解,但是呢,线程是基于对Linux有一定的了解,所以本文就是简单介绍一下,介绍完包装器以及线程库的简单理解之后C++11的特性就到此为止,当然C++11远不止于此 但是C++不太喜欢使用。 lambda表达式是吧?但是lambda表达式没有类型概念,所以每次需要auto接受,相对于其他两个来说,lambda表达式算是比较好操作的了。 至此,引入一个让人意想不到的事实: 包装器的底层,同样是仿函数: 00007FF6CB3BF0C1 call std::_Binder<std::_Unforced,int (__cdecl Sub
纯右值和将亡值C++11中提出的,C++11中的纯右值概念划分等价于C++98中的右值。 3. 用图来展示它们之间的关系就如上图所示,C++将其这样分类意义其实不大,所以这个知识点大家了解一下即可,知道有这么个名词即可。 下面我们就来解决这个问题: 首先 C++中不能直接定义引⽤的引⽤如 int& && r = i; ,这样写会直接报错,通过模板或 typedef 中的类型操作可以构成引⽤的引 这是C++规定的,所以说大家也不必纠结为什么这样写。 以上就是C++11(二)的内容。
紧接上文,C++11还有一些知识我们需要了解一下: 5.新的类功能 5.1默认的移动构造和移动赋值 原来C++类中,有6个默认成员函数:构造函数/析构函数/拷⻉构造函数/拷⻉赋值重载/取地址重 5.3default和delete C++11可以让你更好的控制要使⽤的默认函数。假设你要使⽤某个默认的函数,但是因为⼀些原因 这个函数没有默认⽣成。 有人会感觉lambda的格式和我们之前学的传统的格式不太一样,看起来就不像是C++的代码,这种感觉没错。 如果学过python,就会感觉很熟悉,C++这个语法就是抄的python,所以才会显得这么奇怪,而C++11过后,我们称C++11之前的C++是传统C++,C++11及之后我们称为现代C++,也是因为C 以上就是C++11(三)的内容。
1.2 C++11中的{} C++11以后想统⼀初始化⽅式,试图实现⼀切对象皆可⽤{}初始化,{}初始化也叫做列表初始化。 1. 2. {}初始化的过程中,可以省略掉= C++11列表初始化的本意是想实现⼀个⼤统⼀的初始化⽅式,其次他在有些场景下带来的不少便利,如容器push/inset多参数构造的对象时,{}初始化会很⽅便。 右值引用和移动语义 C++98的C++语法中就有引⽤的语法,⽽C++11中新增了的右值引⽤语法特性,C++11之后我们之前学习的引⽤就叫做左值引⽤。⽆论左值引⽤还是右值引⽤,都是给对象取别名。 现代C++中,lvalue 被解释为loactor value的缩写,可意为存储在内 存中、有明确存储地址可以取地址的对象,⽽ rvalue 被解释为 read value,指的是那些可以提供数据值, C++中不能直接定义引⽤的引⽤如 int& &&ret=i,这样写会直接报错,通过模板或 typedef中的类型操作可以构成引⽤的引⽤。 2.
1.C++11的发展历史 C++11 是 C++ 的第⼆个主要版本,并且是从 C++98 起的最重要更新。它引⼊了⼤量更改,标准化了既有实践,并改进了对 C++ 程序员可⽤的抽象。 C++03 与 C++11 期间花了 8 年时间,故⽽这是迄今为⽌最⻓的版本间隔。从那时起,C++ 有规律地每 3 年更新⼀次。 2.2C++11中的{} 1.C++11以后想统⼀初始化⽅式,试图实现⼀切对象皆可⽤{}初始化,{}初始化也叫做列表初始化。 3.右值引用和移动语义 C++98的C++语法中就有引⽤的语法,⽽C++11中新增了右值引⽤语法特性,C++11之后我们之前学习的引⽤就叫做左值引⽤。 以上就是C++11(一)的内容。
include<iostream> 5 #include<vector> 6 #include<numeric> 7 using namespace std; 8 9 int main() 10 { 11
往期《C++初阶》回顾: 《C++初阶》目录导航 往期《C++进阶》回顾: /------------ 继承多态 ------------/ 【普通类/模板类的继承 + 父类&子类的转换 (超详细) C++ 异常处理流程(抛出 → 捕获 → 栈展开) 1. C++98和C++11的异常规范有什么区别? 过于复杂,C++11 改用更简洁的 noexcept: 语法 含义说明 void func() noexcept; 函数不会抛出任何异常(编译期承诺) void func(); 函数可能抛出任意异常 noexcept:是 C++11 引入的异常规范关键字,用于声明函数是否可能抛出异常。
列表在C++中作用于对象时,同样也可以初始化对象。当然,{}列表在初始化对象的时候会调用对象所属类的构造函数。 这里的统一实际上是指使用形式的统一,列表初始化是C++11新增的语法,initializer_list是C++新增的类,这一点我们要分清楚。 二、简化声明的关键字 1.decltype 1. C++11其实还新增了C系列的获取迭代器的接口,其实也没必要,因为原来的迭代器接口已经实现了const和非const两个版本了,但C++委员会可能怕有的人看不懂这样的函数重载,或者const关键字的用法 C++觉得C语言的函数指针太恶心了,C++进而就搞出来仿函数对象,仿函数实际是一个重载了operator()的一个类,比如下面进行排序的场景,调用库的sort时,sort函数模板的第三个参数的缺省值就是 C++此时觉得光有一个仿函数可调用对象有点不太够啊,能不能再搞出一个比仿函数用起来还舒服的对象呢?