Upgrade to Pro — share decks privately, control downloads, hide ads and more …

C++ 11

C++ 11

Minqi Pan

March 26, 2015
Tweet

More Decks by Minqi Pan

Other Decks in Technology

Transcript

  1. C++ 11
    潘旻琦·孝达

    View Slide

  2. 学习C/C++的意义
    • TIOBE 稳定全球排名第⼀一、第四的编程语⾔言
    • 接触底层,获得更⼤大的技术提升空间
    • 业余时间向⼀一些⽜牛逼的项⺫⽬目提交补丁获得成就感
    • ⽤用于⼚厂内开发,例如hsfcpp、酷盘服务器

    View Slide

  3. 四年过去了
    再不学点 C++11 你就不认得 C++ 了

    View Slide

  4. C++ 的进化是近⼏几年的事
    1998年到2011年⼗十三年都没什么变化

    View Slide

  5. * 这⼏几年导致 C++ 的进步速度远远落后于 Java
    * C++ 的诸多语⾔言设计上的落后导致开发效率低下
    * 进⽽而导致很多⼈人选择更易学易开发的 Java
    * 很多⼈人是被逼的才⽤用C++的,例如做GUI

    View Slide

  6. 如果 C++ 的开发效率也能得到提⾼高
    选择 C++,你将获得很多额外的好处
    • 编译成原⽣生代码
    • ⽆无运⾏行时虚拟机
    • 亲 C 性,易整合 C 库
    • 亲内存⽆无 GC,省内存
    • 快!

    View Slide

  7. 放⼼心使⽤用
    • gcc 4.8 以后已经完全⽀支持C++11,最新4.9.2
    • clang 3.x 已经完全⽀支持C++11,最新3.6.0
    • VC 2015 Preview ⼏几乎已经完全⽀支持C++11
    • kanbox-web-pub.cm3 ⺫⽬目前不⾏行,gcc才4.1
    • 10.101.86.86⺫⽬目前不⾏行,同上

    View Slide

  8. 推荐使⽤用clang与libc++

    View Slide

  9. 推荐使⽤用clang与libc++

    View Slide

  10. auto

    View Slide

  11. decltype - ⽐比auto更通⽤用

    View Slide

  12. 返回类型后置
    以前根本没法实现的⼀一种范型

    View Slide

  13. 有了decltype还是不⾏行,编译时parser去哪找x和y?

    View Slide

  14. ⽤用lambda写类似于Ruby的block式调⽤用

    View Slide

  15. 类似于Ruby的tap的写法

    View Slide

  16. 类似于Ruby的proc { }存储匿名函数
    可是要把lambda传⼊入其他函数怎么办?!
    不能⽤用auto,因为不能通过未知的未来调⽤用推断类型!
    可以⽤用std::function模板去声明

    View Slide

  17. 没有GC,闭包肿么办?

    View Slide

  18. 总算添加了Unicode⽀支持!
    u8"I'm a UTF-8 string."
    u"This is a UTF-16 string."
    U"This is a UTF-32 string."
    u8"This is a Unicode Character: \u2018."
    u"This is a bigger Unicode Character: \u2018."
    U"This is a Unicode Character: \U00002018."
    u8R"XXX(I'm a"raw UTF-8" string.)XXX"
    uR"*(This is a "raw UTF-16" string.)*"
    UR"(This is a "raw UTF-32"string.)"

    View Slide

  19. 参数⻓长度可变的模板

    View Slide

  20. 参数⻓长度可变的函数
    • 像是 printf ,以前就⼀一直在⽤用;但以前要⽤用
    stdarg.h,va_start va_arg va_end
    • 现在可以⽤用...操作符来做这件事
    template void
    printf(const std::string &str_format,
    Params... parameters);

    View Slide

  21. 通过⻓长度可变的参数实现模板递归

    View Slide

  22. 新增using⽤用法 - 继承构造函数!

    View Slide

  23. using继承构造函数+多继承!

    View Slide

  24. 让编译器编译默认⽅方法!
    新增=default⽤用法

    View Slide

  25. 让编译器不编译默认⽅方法!
    新增=delete⽤用法

    View Slide

  26. 防⽌止覆写退化为创建新⽅方法!
    新增override关键词

    View Slide

  27. 防⽌止继承 / 覆写!
    新增final关键词

    View Slide

  28. 新增⼤大括号构造法

    View Slide

  29. 新增移动构造函数
    新增的右
    值引⽤用
    来优化这
    种代码
    导致标准库的⼤大⾯面积重写

    View Slide

  30. 右值引⽤用
    另:右值引⽤用修饰符后置
    Vector⼤大⼩小变化后
    以前的对象
    直接移动⽽而不复制了
    x2 因为重置vector⼤大⼩小

    View Slide

  31. std::move⽤用于让编译器选择右值的重构版本
    ⼏几乎等价于static_cast

    View Slide

  32. 新增关键词constexpr
    解决⽆无法确定是不是常量表达式⽽而编译不了的问题
    程序员必须保证constexpr的函数
    或对象必须为编译时常量

    View Slide

  33. 新增for的另外⼀一种形式

    View Slide

  34. 新增nullptr!
    可区分0和(void *)0进⾏行函数重载
    导致标准库的⼀一些重写
    某些⽅方法返回nullptr⽽而不再返回NULL
    void foo(char *);
    void foo(int);
    !
    char *pc = nullptr; // OK
    int *pi = nullptr; // OK
    bool b = nullptr; // OK. b is false.
    int i = nullptr; // error
    !
    foo(nullptr); // calls foo(nullptr_t), not foo(int);

    View Slide

  35. 新增强类型枚举(enum class)
    enum class Enumeration {
    Val1,
    Val2,
    Val3 = 100,
    Val4 // = 101
    };
    enum Enum1;
    // 上⾯面的不合法,没类型
    enum Enum2 : unsigned int;
    // 合法,明确表⽰示是unsigned int类型
    enum class Enum3;
    // 合法,没说,但是默认是int
    enum class Enum4 : unsigned int;
    // 合法
    enum Enum2 : unsigned short;
    // 不合法,已经声明过是int怎么⼜又变成short了?!

    View Slide

  36. 新增关键字static_assert!
    ⽤用于编译时排错
    static_assert((GREEKPI > 3.14) && (GREEKPI < 3.15), "GREEKPI is
    inaccurate!”);
    !
    //类级:
    template
    struct Check {
    static_assert(sizeof(int) <= sizeof(T), "T is not big enough!");
    };
    !
    //⽅方法级:
    template
    Integral foo(Integral x, Integral y) {
    static_assert(std::is_integral::value, "foo() parameter must
    be an integral type.");
    }

    View Slide

  37. ⾃自定义字⾯面值后缀
    OutputType operator "" _suffix(const char * literal_string);
    !
    OutputType some_variable = 1234_suffix;
    !
    template OutputType operator "" _tuffix();
    !
    OutputType some_variable = 1234_tuffix;
    // operator "" _tuffix()
    OutputType another_variable = 2.17_tuffix;

    View Slide

  38. 新增thread_local类似于ruby的Thread.current[]

    View Slide

  39. 下⼀一步:C++ 14
    • clang 3.4 已经全部⽀支持

    View Slide