c++ 11特性
1.01 关键字
- auto : 自动存储变量的关键字, 必须要对auto声明的类型进行初始化,否则编译器无法推导出auto的实际类型。
- decltype : 根据表达式的实际类型推演出定义变量时所用的类型。如cout << typeid(i).name() << endl;
- final :
final修饰类的时候,表示该类不能被继承。
final修饰虚函数时,这个虚函数不能被重写。
- override : 检查派生类虚函数是否重写了基类某个虚函数,如果没有重写编译报错
1.02 默认成员函数控制
- default关键词:myclass() = default;//让编译器默认生成无参构造函数显式的指定编译器生成该函数的默认构造函数。(用=default修饰的函数称为显式缺省函数)
- delete关键词:删除默认函数,该语法指示编译器不生成对应函数的默认版本。
A(const A&) = delete;
A& operator=(const A&) = delete;
1.03 左值、右值、引用
- 左值 :=号左边的变量、指针或表达式称为左值。可以重新赋值。
- 左值引用 :对左值取别名。(左值引用只能引用左值,不能引用右值)
- const左值引用既可引用左值,也可引用右值
- 右值 :=号右边的值或表达式,值不能改变。
- 右值引用 :对右值取别名
左值=右值
int* p = new int[10];
左值引用(别名)= 左值(指针p)
int*& pp = p;
const左值引用
int a = 10;
const int& ra1 = 10;
const int& ra2 = a;
变量=右值
int i = 10;
右值引用(别名)
int&& r = 10;
1.04 类的默认函数
创建一个空类, 编译器会创建默认的6个默认成员函数:
构造函数
析构函数
拷贝构造函数
拷贝赋值重载
取地址重载
const取地址重载
C++11新增了两个:
移动构造函数
移动赋值运算符重载
1.05 lambda表达式
捕获列表说明:
[var]: 表示值传递方式捕捉变量var
[&var]:表示引用传递捕捉变量var
[=]: 表示值传递方式捕获所有父作用域中的变量(包括this)
[&]: 表示引用传递捕捉所有父作用域中的变量(包括this)
mutable:默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。使用该修饰符时,参数列表不可省略(即使参数为空)。
{
// 使用 mutable 允许修改按值捕获的变量
int x = 10;
auto lambda = [x]() mutable {
x = 20; // 允许!mutable 取消了 const 限制
cout << "Inside lambda: x = " << x << endl;
}
1.06 可变参数列表
1.通过模板函数定义参数列表
2.定义普通函数,使用模板参数列表
template<class T>
void PrintArgs(T value){
std::cout << value <<endl;
}
template<class ...Args>
void ShowList(T value, Args... args){
cout << sizeof ...(args) << endl;
}
int main(int argc, _TCHAR* argv[])
{
ShowList(1, 2, 3);
ShowList(1, 'a');
return 0;
}
enable_shared_from_this是一个模板类。
使用场景:需要把自己类对象作为参数传给其他函数时,就需要传递一个指向自身的share_ptr。
struct CMyTest : std::enable_shared_from_this<CMyTest> // 继承
{
std::shared_ptr<CMyTest> getMySelf()
{
return shared_from_this();
}
~CMyTest() {}
};