深入理解c++11笔记

快速浏览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++之后的标准化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值