目 录
1
常数表达式 3
2
空指针 3
3
类型推导 3
4
以范围为基础的 for 循环 3
5
无限制的union 3
6
新的字符串字面值 4
7
long long int类别 4
8
允许sizeof运算符作用在类型的数据成员上,无须明确的对象 4
9
初始化列表 5
10
统一初始化 5
11
对象构造的改良和成员变量初始化 5
12
显示虚拟函数重载 6
13
禁止默认构造函数 6
14
外部模板 7
15
Lambda函数 7
16
右值引用和move 7
17
角括号>> 8
18
多线程支持 8
19
多元组tuple 8
20
散列表 8
1 常数表达式
目前不被VS2013支持
constexpr int test() { return 5; } int main() { int buf[test() + 5]; return 0; } |
2 空指针
int * pi = nullptr; int i = nullptr; int i = NULL; |
3 类型推导
auto i = ‘a‘; decltype(i) a; |
4 以范围为基础的 for 循环
int my_array[5] = { 1, 2, 3, 7, 10 }; for (int &x : my_array){} |
5 无限制的union
vs2013目前不支持
class A { public: A() {} A(int i){ this->i = i; } int i = 10; }; union { int a1; double b; A a; }; |
6 新的字符串字面值
C++11 将支持三种Unicode编码方式:UTF-8,UTF-16,和UTF-32。除了上述char定义的变更, C++11将增加两种新的字符类别:char16_t和char32_t。它们各自被设计用来存储UTF-16 以及UTF-32的字符。
VS2013目前不支持
const char *s1 = u8"UTF-8 string."; const char16_t *s2 = u"UTF-16 string."; const char32_t *s3 = U"UTF-32 string."; |
7 long long int类别
在 32 比特系统上,一个 long long int 是保有至少 64 个有效比特的整数类别。C99 将这个类别引入了标准 C 中,目前大多数的 C++ 编译器也支持这种类别。C++11 将把这种类别添加到标准 C++ 中。
8 允许sizeof运算符作用在类型的数据成员上,无须明确的对象
vs2013目前不支持
class A { public: A() = delete; //显示通知编译器,不生成默认的构造函数 //A() = default; A(int i) { this->i = i; } int i; }; sizeof(A::i) |
9 初始化列表
class A { public: A(std::initializer_list<int> list){} }; A a = { 1, 4, 5, 6 }; |
10 统一初始化
class A { public: string name; int id; }; A a{ "tom", 4 }; |
11 对象构造的改良和成员变量初始化
class A { public: A() :A(20) {} A(int i) { id = i; } int id = 10; }; |
12 显示虚拟函数重载
class A { public: virtual void test(int i){} }; class B : public A { virtual void test(int i) override { } virtual void test1(float i) //override { } }; |
13 禁止默认构造函数
class A { public: A() = delete; //显示通知编译器,不生成默认的构造函数 //A() = default; A(int i) { this->i = i; } int i; }; |
14 外部模板
告诉编译器不要在该编译单元内将该模板实例化。
extern template class std::vector<int>; |
Lambda函数
#include <algorithm> std::vector<int> a; a.push_back(1); a.push_back(2); a.push_back(3); int total = 0; std::for_each(a.begin(), a.end(), [&total](int x) {total += x;}); std::cout << total; |
15 右值引用和move
在C++03之前,右值位于运算符右边,其值无法改变。
左值是指表达式结束之后依然存在的持久对象,右值是表达式结束之后就不存在的临时对象。能否对表达式取地址就是判断左值右值的最简单方法。
class A{}; int main() { int i = 10; int a = 4; int b = 3; i = a + b; A test = A(); return 0; } |
move的功能就是将一个左值强制转化为一个右值引用。如果一个对象明确被其他对象引用后便不再使用,那么可以采用浅拷贝方式实现其拷贝构造函数,浅拷贝完成后将其指针成员赋NULL;
class A {}; int main() { A a; A&& b = move(a); } |
16 角括号>>
set<int, less<int>> a; |
17 多线程支持
18 多元组tuple
#include <map> int i = 10; char c = ‘a‘; const char *s = "hello world"; typedef std::tuple <int, char, const char *> mytuple; mytuple a(i, c, s); int i1 = std::get<0>(a); const char *s1 = std::get<2>(a); |
19 散列表
std::unordered_set
std::unordered_multiset
std::unordered_map
std::unordered_multimap
#include <unordered_set> unordered_multiset<int> myset; myset.insert(10); myset.insert(20); unordered_multiset<int>::iterator it; for (it = myset.begin(); it != myset.end(); ++it) { cout << *it << endl; } |
word 下载 http://www.sundaboke.com/C++11.doc