C++11中的11表示2011年的C++标准。
1、右值引用(rvalue reference)和移动(move)语义
1)作用:避免右值拷贝,而只是“移动”,减少拷贝开销。
2)右值:没有名字,不能取地址,不能修改。左值和右值没有严格的定义。
3)移动语义:
2、constexpr(常量表达式)
编译期
3、类型推断,通过auto和decltype两个关键字来实现。
1)auto
1.1)根据变量赋的值,推断变量的数据类型。
auto i = 1; // i被自动推断为int类型
1.2)可以极大地简化长语句。
vector<int> vec(6,10); // (1) vector<int>::iterator iter = vec.iterator(); // (2) 简化写法 auto iterAuto = vec.iterator();
1.3)auto不能修饰函数形参。
2)decltype
4、Lambda表达式(匿名函数)
// Lambda表达式的格式 [capture](params)->ret { body};
1)capture:捕获的参数列表。
[a, &b] // 表达式捕获a的值,以及b的引用。 [this] // 捕获this指针。 [&] // 捕获所有外部自动变量的引用。 [=] // 捕获所有外部自动变量的引用。 [] // 不捕获外部的任何变量。
auto func = [](int i){return i+4;}; func(10); // 14
5、nullptr(空指针),只表示指针(不是0),并且可以隐式转换成其他任何类型的指针。
NULL是一个宏,值由编译器的具体实现决定。通常,C中是0或者(void*)0,C++中是0(因为void*不可以隐式转化成其他类型的指针)。
// 函数重载 void foo(int) {} // #1 void foo(char*) {} // #2 int main() { foo(NULL); // C++中调用#1 }
void foo(int) {} // #1 void foo(char*) {} // #2 int main() { foo(nullptr); // 调用#2 }
6、基于范围(range based)的for循环
int arr[5] = {1, 2, 3, 4, 5}; // 简化for循环的写法。引用是为了修改原值,可以不是引用。 for(int &x : arr) { x *= 2; }
7、初始化列表
// 基本类型 int x = {5}; // 可以不是数组 double y {2.75}; // 可以不加等号 short quar[4] {4, 5, 2, 1}; int *arr = new int[4]{2, 4, 6, 7}; // 可以new
// 自定义类型 class Stump { private: int roots; double weight; public: Stump(int r, double w) : roots(r), weight(w) {} }; Stump s1(3, 15.6); // 圆括号 Stump s2{3, 15.6}; // C++11 Stump s3 = {3, 15.6}; // C++11
8、元组
9、后置返回类型(tailing return type)
10、override和final
11、智能指针(smart pointer)
https://www.cnblogs.com/yangwenhuan/p/10635102.html
12、新增数据类型
1)long long和unsigned long long:支持64位整型。
2)char32_t和char16_t:
3)原始字符串:
13、类内成员初始化
14、default和delete
15、委托构造函数
16、继承构造函数
17、模板function
18、作用域内枚举
19、模板别名
20、可变参数模板
21、POD、alignof()、alignas
22、正则表达式
std::move:让对象可以移动
std::forward
std::array
如果类有将模板std::initializer_list作为参数的构造函数,则只有该构造函数可以使用列表初始化形式。
参考链接:
https://en.wikipedia.org/wiki/C++11