c++ 11 知识点总结
1,constexpr 作用于函数声明,编译期推导返回常量
2,std::initializer_list
1 | class SequenceClass |
3,统一初始化
1 | NewClass var{"aaa?", 3...}; |
4,类型推导:auto,为了简化表示 如:
1 | auto someStrangeCallableType = boost::bind(&SomeFunction, _2, _1, someObject) |
5,decltype类型推导,双层括号表引用
1 | int *ptrTempA = &tempA; |
decltype和auto都可以用来推断类型,但是二者有几处明显的差异:
1.auto忽略顶层const,decltype保留顶层const;
2.对引用操作,auto推断出原有类型,decltype推断出引用;
3.对解引用操作,auto推断出原有类型,decltype推断出引用;
4.auto推断时会实际执行,decltype不会执行,只做分析。总之在使用中过程中和const、引用和指针结合时需要特别小心。
6,仿函数就是写个类,然后重载operator(),通过重载()运算符模拟函数形式的类
7,lambda函数是为了简化表示临时的谓词函数,语法:
1 | [capture list] (params list) mutable exception-> return type { function body } |
捕捉列表参数意义
[] // 沒有定义任何变量。使用未定义变量会导致错误。
[x, &y] // x 以传值方式传入(前提),y 以传引用方式传入。
[&] // 任何被使用到的外部变量皆隐式地以引用方式加以引用。
[=] // 任何被使用到的外部变量皆隐式地以传值方式加以引用。
[&, x] // x 显示地以传值方式加以引用。其余变量以引用方式加以引用。
[=, &z] // z 显示地以引用方式加以引用。其余变量以传值方式加以引用
8,explicit 单个参数的构造函数不能进行隐式转换 A a = 5;
9,overload override overwrite区别
1.overlode 重载:
同一类中同名不同参
2.override 覆盖:
多态,virtual 同名同参
3.overwrite 隐藏,重写:
父子类, 1)基类virtual ,子类同名不同参
2)基类不virtual, 同名同参
调用哪个函数依赖指针类型
10,空指针类型nullptr取代NULL
11,enum class:不能与整数比较,类型显式指定,可以前置声明(因为可以确定大小)
12,>> 模板函数中可连写(必须带()以示区分,否则报错)
13,类模板是用来产生模板类的 class template -> template , template class -> class
14,using 当作 typedef 来处理一般类型和类模板的别名
15,变长参数模板
16,新的字符串
17,用户自定义的字面值
18,多任务的支持:
1.多个线程在一个进程中共存的内存模型;
2.为线程之间的交互提供支持
19,default delete
default:显式让系统为默认构造函数、析构函数、拷贝构造函数以及拷贝赋值运算符提供函数体
delete:禁止编译器自动产生某些函数,并不限于构造和析构函数,
示例:
1 | void f(int i); |
除了参数为int之外的函数外,都不允许
20,long long int,表示至少64bit的数
21,允许sizeof操作符作用在类型的数据成员上,无须明确对象
22,线程相关:
1 | std::thread std::thread::join std::mutex std::recursive_mutex std::condition_variable std::condtion_variable_any std::async std::future |
23,tuple和erlang中的tuple类似
24,share_ptr weak_ptr
25,随机数生成:三种算法,n种分布
26,std::ref和std::cref
1. std::cref是包装const引用的值
2.针对std::bind,std::bind本质是一个函数模板,生成一个函数。而bind采用的是值传递,为了改成引用传递,需要std::returnf,面
3.thread也是,即使函数被声明成引用,也会以值传递的形式生成拷贝,默认将对象拷贝到线程空间。如果希望原始对象改变,则使用std::ref
关于std::bind等,参考C++ 参考手册