快速浏览c++11的新特性
c++98/03 c++11/c++0x long long整型类型、静态断言、外部模版、 继承构造函数 委派构造函数 列表初始化 auto类型推导 追踪返回类型 基于范围for 枚举类型安全 指针安全等方面的内容 适应新硬件的发展涉及的新特性 如多核、多线程、并行编程等 lambda表达式 Unicode的深入支持 从设计思维和应用范畴两个纬度对c++11新标准中的所有特性进行了分类、呈现了c++11新特性的原貌 在保证与c语言和旧版本c++标准充分兼容的原则下增加的一些新特性 具有广泛可用性、能与其他已有的或者新增的特性结合起来使用的、具有普适应性的一些新特性 c++11新标准对原有的一些语言特性的改进,这些特性不仅能让c++变得更强大,还能提升程序猿的编码效率 c++11在安全方面所做的改进类型安全 指针安全两个方面 进一步挖掘c++程序性能和让c++能更好的适应各种新硬件的发展而设计的新特性 多核、多线程、并行编程等 lambda表达式
c++11新增的关键字
alignas alignof decltype auto static_asserrt using noexcept export (弃用,不过未来可能留作他用) nullptr constexpr thread_local
学后收获
什么是lambda,以及怎么样使用它更好的 decltype和auto类型推导有什么关系 auto类型推导 展现出语言的亲和力 什么是移动语义,以及(右值引用)是如何解决转发问题的? 右值引用 移动语义 着重于改变一些使用c++程序库时容易发生的性能不佳的状况 default/deleted函数以及override是怎么回事? 异常描述符被什么替代了? noexcept是如何工作的 什么是原子类型及新的内存模型? 大多数的编译器都是通过语言特性的方式来实现原子类型的,但是c++11原子类型是通过库来实现的 如何在c++11中做并行编程?
c++11应用在哪些地方
通过内存模型、线程、原子操作等来支持本地并行编程(Native Concurrency) 通过统一初始化表达式、auto、decltype、移动语义等来统一对泛型编程的支持 通过constexpr、POD等更好的支持系统编程 通过内联命名空间、继承构造函数和右值引用等,以更好地支持库的构建
开发环境
以上特性对编译器的要求 XL C/C++编译器10.1开始 IBM的xlC++ 版本13 GNU 的GCC4.3开始 GNU g++ 版本4.8 英特尔编译器从版本10.1开始 苹果的clang/llvm 2010年的2.8开始 llvm的clang++ 版本3.2
理解c++标准委员会的感受:
更倾向于使用库而不是扩展语言来实现特性 比如下面这些都是库: 算法增强 容器增强 分配算符 std::array 无序容器 unordered containers std::tuple 类型特性 type traits std::function std::bind unique_ptr shared_ptr weak_ptr 线程Threads 互斥mutex 锁Locks 条件变量 conditions variables 时间工具 time utilities std::future std::promises std::async 随机数 random numbers 正则表达式 regex
如c++11的多线程 std::thread 不是一个内置类型而是库 在linux 还需要-lpthread 如c++11没有内置的关联数组(容器) 而是 std::unorder_map库 如c++11的正则std::regex库
c++11具体学习路线
保持语言的稳定性和兼容性
C99特性 C99 函数的默认模版参数 default template parameters for function 扩展的friend语言 extended friend syntax 扩展的整型 extended integer types 外部模版 extended template 类成员初始化 in-class member initializers 局部类型用作模版参数 local classes as template arguments long long 整型 long long integers __cplusplus __cplusplus macro noexcept override/final控制 override/final controls 静态断言 static assertions 类成员的sizeof sizeof class data members
更倾向于通用而不是特殊化
继承构造函数 inherited constructors 移动语义(参见右值引用) move semantics (see rvalue references) 右值引用 rvalue reference 完美转发 perfect forwarding 引用折叠 reference collapse 委托构造函数 delegating constructors 显示转换操作符 explicit conversion operators 统一的初始化语法和语义 Uniform initialization syntax and semantics 初始化列表 initializer lists 防止类型收窄 Preventing narrowing 非受限联合体 unrestricted union 用户定义的字面量 user-defined literals 一般化的SFINAE规则 generalized SFINAE rules 内联名字空间 Inline namespace POD POD(plain old data) 模版别名 template alias
理解c++编委会:
比如: 显示类型转换操作符 explicit关键字来声明构造函数为显示构造 从而防止程序员一不小心将一些特定的类型隐式转换为用户自定义类型
专家新手一概支持
右尖括号 auto初始化类型推导 auto(type deduction from 18nitialize) 基于范围的for语句 range-based for statement decltype decltype 追踪返回类型语法 trailing return type syntax
理解c++编委会 :
比如: vector<list<int>> veclist //c++11有效 比如: vector<list<int> > veclist c++98/03中无效(98觉得>>这个右移操作符 所以空一格) 比如: c++98 集合初始化时数组a[]={0,1} 类A(0,1) 那么模版编写者不知道用户会使用哪种类型来初始化模版 对于泛型编程来说,这种不一致会导致不能总是进行泛型编程 比如: c++11采用统一的{}初始化列表 就等同于拥有了防止收窄和泛型编程的双重好处
增强安全类型
强类型枚举 enum class(scoped and strongly typed enums) unique_ptr shared_ptr 垃圾回收ABI
理解c++编委会:
绝对的安全是做不到的 不过在编译时期捕捉更多的错误则是非常有益的 c++98/03中,枚举类会退化为整型,因此会和其他的枚举类型混淆 不安全的原因是为了兼容c语言 c++11引入了新的强类型枚举 比如 enum class Color {red,blue,green}; int x = Color.red //c++98/03中允许,c++11错误:不存在Color转换为int Color y = 7; //c++98/03和c++11中都是错误的,c++11错误:不存在int转换为Color Color z = red; //c++98/03中允许,c++11错误:red不在作用域内 Color c = Color::red //c++98/03中错误,c++11允许
增强性能和操作硬件
常量表达式 constexpr 原子操作 atomic operation 内存模型 memory model 复制和再抛出异常 copy and rethrow exception 本书未讲解 并行动态初始化和析构 Dynamic Initialization and Destruction with Concurrency 本书未讲解 变长模版 variadic templates 线程本地的存储 thread-local storage 快速退出进程
理解c++编委会
在嵌入式编程 比如:智能手表 常量表达式和原子操作都是可以支持嵌入式编程 这些特性对于提高性能降低存储空间都大有好处 比如ROM c++98的const类型对只读内存ROM支持的不够好 c++11中const类型只是在第一次初始化后,接下来不会改变值,虽然后续不能对变量进行修改但是初始化依旧是动态的,这对ROM设备来说非常不适合 c++11中constexpr它让函数和变量可以在编译时就能固定一个值,从而在效果上,函数和变量在固定内存设备中要求的空间就更少了,就非常适合小型设备 c++11中的原子类型 其本质是直接操作硬件
开发能够改变人们思维方式的特性
指针控制 nullpter 显示默认和删除函数(默认的控制) defaulted and deleted functions (control of default) lambda函数 lambda
理解c++编委会:
lambda 其实还是一个类重载operator()() 捕捉其实是成员变量 c++98类中函数不让人用使用private 有一个不好的地方是程序员阅读起来很费劲 c++11类中的函数阻止或不让人用使用=delete,这样就很明确 直截了当
融入编程现实
对齐支持 alignment support 通用属性 general attribute 原生字符串字面量 raw string literals Unicode Unicode
理解c++编委会:
在web编程中/url 那么/需要转义 而c++11中的原生字符串常量则可免除转义 直接得到/ 在GNU的属性(attribute) 微软的属性 __declspec 这些属性是编译器自己的扩展 说白了就是编译器自己的特色 _Noreturn:函数指定符。表明函数不会执行到函数体结尾和retnurn语句处返回。 __attribute__ 这里提一个__attribute__((aligned(n))).在结构体后面加上后可以按照n字节对齐。默认按最大变量字节对齐 c++11标准选择几个很少的属性 noreturn 和 carrier_dependency 属性意义是它们能够让编译器供应商创建它们自己的语言扩展 同时不会干扰语言或等待c++之后的标准化