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

C++ 11

C++ 11

8002c84eb4c18170632f8fb7efb09288?s=128

Minqi Pan

March 26, 2015
Tweet

Transcript

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

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

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

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

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

    Java * 很多⼈人是被逼的才⽤用C++的,例如做GUI
  6. 如果 C++ 的开发效率也能得到提⾼高 选择 C++,你将获得很多额外的好处 • 编译成原⽣生代码 • ⽆无运⾏行时虚拟机 •

    亲 C 性,易整合 C 库 • 亲内存⽆无 GC,省内存 • 快!
  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⺫⽬目前不⾏行,同上
  8. 推荐使⽤用clang与libc++

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

  10. auto

  11. decltype - ⽐比auto更通⽤用

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

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

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

  15. 类似于Ruby的tap的写法

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

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

  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.)"
  19. 参数⻓长度可变的模板

  20. 参数⻓长度可变的函数 • 像是 printf ,以前就⼀一直在⽤用;但以前要⽤用 stdarg.h,va_start va_arg va_end • 现在可以⽤用...操作符来做这件事

    template<typename... Params> void printf(const std::string &str_format, Params... parameters);
  21. 通过⻓长度可变的参数实现模板递归

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

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

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

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

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

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

  28. 新增⼤大括号构造法

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

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

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

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

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

  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);
  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了?!
  36. 新增关键字static_assert! ⽤用于编译时排错 static_assert((GREEKPI > 3.14) && (GREEKPI < 3.15), "GREEKPI

    is inaccurate!”); ! //类级: template<class T> struct Check { static_assert(sizeof(int) <= sizeof(T), "T is not big enough!"); }; ! //⽅方法级: template<class Integral> Integral foo(Integral x, Integral y) { static_assert(std::is_integral<Integral>::value, "foo() parameter must be an integral type."); }
  37. ⾃自定义字⾯面值后缀 OutputType operator "" _suffix(const char * literal_string); ! OutputType

    some_variable = 1234_suffix; ! template<char...> OutputType operator "" _tuffix(); ! OutputType some_variable = 1234_tuffix; // operator "" _tuffix<'1', '2', '3', '4'>() OutputType another_variable = 2.17_tuffix;
  38. 新增thread_local类似于ruby的Thread.current[]

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