C++ 11 新特性

  • C++11的新特性

C++ 2.0新特性

  • 语言+标准库

1.演进、环境与资源

  • Variadic template
  • move semantics
  • auto
  • ininializer list
  • lambdas
  • type_traits
  • forward_list
  • array
  • tuple

2.Variadic Templates

1
2
3
4
5
6
7
8
9
10
11
void printx()
{

}
template <typename T,typename... Types>
void printx(const T& first,const Types&... args)
{
cout<<first<<endl;
printx(args...);
}
sizeof...(args) //元素个数
  • sizeof…(args) //元素个数

3. space in Template Expression,nullptr,std–nullptr_t,auto

  • vector<list > —–> vector<list>
  • typedef decltype(nullptr) nullptr_t;
  • 自动类型推断只能用于单值初始化,不能用于初始化列表
  • 统一初始化,变量名后加大括号
    • int values[]{1,2,3};
    • vector v{2,3,4};

  • 所有容器都有initializer_list 为参数的构造函数
  • complex 类没有Initializer_list为参数的构造函数,因此initializer_list逐个分解

4. initializer_list

  • int i;
  • int j{}; //j=0
  • int *p;
  • int* q{}; q=nullptr;
  • 不允许缩窄变换
    • int x3{5.0}; // error
  • initializer_list元素类型一致

  • 编译器看到{},准备array,调用initializer_list的 private的构造函数
  • initializer_list 没有内涵array,,copy initializer_list时,另一个Initializer_List中array只是array浅拷贝

5.explicit for ctors taking more than one argument

  • explicit for ctors taking one argument
    • 禁止隐式自动类型转换
  • 多个参数也可以禁止自动类型转换

6 range-based for statement

  • 编译器对其解释

  • 对于有for loop 中类型不一样就要做转换,有explict则转换失败。

7 =default =delete

  • 默认构造函数 在其继承自父类时,调用父类的构造函数
  • 多用在big five上

  • 一个类只要有指针成员,需要写拷贝构造,拷贝复制 BIG_THREE

8 Alias Template (template typedef)

  • alias template 无法特化,全特化,偏特化

  • 容器->迭代器->经过萃取机->value_type

9 template template parameter

  • 1
    2
    template<typename T,template <class> class Container>
    //Container 是一个模板,且这个模板以T为参数。
    1
     
  • vector 模板有两个参数。

10 Type Alias,noexcept,override,final

  • func 一个函数指针 typedef void(*func)(int,int);

  • 1
    2
    3
    template <class CharT> using mystring=std::basic_string<CharT,std::char_traits<CharT>>;
    //两个一致
    using mystring= template <class CharT> std::basic_string<CharT,std::char_traits<CharT>>;
  • using 使用总结:

  • nonexcept

    • 保证该函数不会丢出异常, 在()内的条件为真的情况下。
    • 异常最终默认处理程序std::terminate
  • override

    • 子类重载父类函数,帮助编译器,这个函数是override版本
  • final

    • 修饰class,final 禁止子类继承
    • 修饰virtual function,虚函数不可以被override。

11 decltype

  • 声明返回类型

    • 1
      2
      3
      template <typename T1,typename T2>
      decltype(x+y) add(T1 x,T2 y);
      //auto add(T1 x,T2 y) ->decltype(x+y)
      1
       
    • 1
       
  • metaprogramming 元编程

    • typename 帮助编译器确定是一个数据类型
  • 传递到一个lamdba 表达式

12 lambda

  • lambda 属于 inline 函数

  • 在lambda后加小括号,直接调用

  • [=,&y] 允许通过值传递使用所有的object

  • mutable throwSpec ->retTyppe 可选,但是只要有一个,就要写小括号

  • []内 lambda中要用到的外部的数据

  • 没有mutable id不能++

  • 说明lambda []内参数类型为const

  • lambda 没有默认构造函数,没有赋值运算符

  • 对排序准则来讲,一个仿函数,要比lambda更直观一点

  • functor 不是inline函数

13 variadic template

  • sizeof…(args) 获得参数个数

  • example1

  • example2

  • example3

    • 同一个类型 比大小 用initializer_list
    • _iter_less_iter为一个函数
  • example4

  • example5

    • 采用类模板,对头和尾的操作方式不同
    • 第2步,递归停止时!!!
  • example6

    • 奇葩的继承

    • private继承

    • protect成员

    • initializer_list中inherited(vtail…)调用基类的构造函数

    • Head::type 不能获得数据类型

    • auto decltype

  • example7

    • composited& tail() 返回 引用
    • 否则,可以读,不可以写

1.标准库源代码分布

  • VC++
    • \include
    • \cliext
  • GNUC C++
    • \include
    • \include\c++
    • \include\c++\bits
    • \include\c++\ext

2.Rvalue reference

  • 当复制的右手边是一个右值,左边可以偷右手边的东西
  • 左值 变量,可以出现在op=左边
  • 右值 变量,只能出现在op=右边,临时对象
  • 函数返回的是右值,不能取地址
  • insert 调用move ctor,拷贝构造函数,
  • noexcept确保不会发生异常
  • 被move之后,原来的指针就不能用了。
  • 临时对象,编译器自动调用move版本
  • 用std::move(c1),强制调用move版本,相当于拿到了c1的Rvalue reference
  • 调用Move条件
    • inset 有move版本
    • Mystring move constructor,且noexcept
    • 临时对象/或者move(c1)

3.Perfect Forwarding

  • MyString move ctor 需要自己写
  • forward 中间站怎么设计???
  • 借forward达到完美的转接

4.move-aware class

  • str.data=NULL 不应delete str.data,应该交给str的析构函数

  • str.data=NLL没有这句话时,析构函数调用,将delete指针所指的内容

  • 析构函数判断是否是NULL

  • 关联式容器,检测元素大小,需要写operator< operator==

4.对容器的效能测试

  • 由于vector会成长,所以调用Mctor次数7194303

  • vector copy consructor 需要一个一个copy数据

  • 300000 放在尾巴,所有不会有扩充操作

  • move版本对于vector 影响最大,其次deque
  • 只要容器以节点形式存在,Move版本影响不大

5.容器结构与分类

6.array

  • 数组声明时 in a[100];
  • 以下typedef int T[100];
  • T c;

7.hashtable

  • bucket实现vector,可以增长,每个bucket是一个list
  • 元素个数>bucket个数,则rehashing,之后,元素位置重新计算
  • 108 为元素的hashcode

8.hashfunction

  • hash() 函数对象functor

9.tuple

  • meta programming

  • 对类型做操作

文章目录
  1. 1. C++ 2.0新特性
    1. 1.1. 1.演进、环境与资源
    2. 1.2. 2.Variadic Templates
    3. 1.3. 3. space in Template Expression,nullptr,std–nullptr_t,auto
    4. 1.4. 4. initializer_list
    5. 1.5. 5.explicit for ctors taking more than one argument
    6. 1.6. 6 range-based for statement
    7. 1.7. 7 =default =delete
    8. 1.8. 8 Alias Template (template typedef)
    9. 1.9. 9 template template parameter
    10. 1.10. 10 Type Alias,noexcept,override,final
    11. 1.11. 11 decltype
    12. 1.12. 12 lambda
    13. 1.13. 13 variadic template
    14. 1.14. 1.标准库源代码分布
    15. 1.15. 2.Rvalue reference
    16. 1.16. 3.Perfect Forwarding
    17. 1.17. 4.move-aware class
    18. 1.18. 4.对容器的效能测试
    19. 1.19. 5.容器结构与分类
    20. 1.20. 6.array
    21. 1.21. 7.hashtable
    22. 1.22. 8.hashfunction
    23. 1.23. 9.tuple