c++ 11特性:
Type Inference 类型推导
- auto
- decltype:
1 | int a; |
这个语法可以应用于复用匿名的struct或union
1 | struct { // 匿名 |
需要注意,auto和decltype都是编译时推导变量的类型,而不能在运行时推导变量类型,而且其推导有一定的限制。例如
1 | auto i; // Compile error |
Return Value Tracking(追踪返回类型)
追踪返回类型的函数和普通函数的声明最大区别在于返回类型的后置。如
1 | int func(char* a, int b); |
而追踪返回类型还可以让我们在写返回类型时,不写明作用域
1 | class Foo { |
上面体现的效果并不是特别的明显,那么下面的例子呢?
1 | // 有的时候,你会发现这是面试题 |
上述两个函数的作用是完全一样的,但是可读性却完全不同
这其实是一个返回函数指针的函数,而这个指针指向着返回int*的函数
auto的使用细则:auto*, auto&, const auto, volatile auto…
Rvalue Reference 右值引用
通常,在C++中,我们称可以使用取地址运算符(&)的值为左值,而不是左值的值就是右值
1 |
|
右值引用,就是使右值也拥有一个名字,如果它是一个临时变量(如函数的返回值),右值引用还能给它“续命”。
基本语法 value_type && val = temp_val;
1 | int foo() { |
所谓移动语义,就是从将要销毁的临时变量那里把资源移动过来。这样就节省了分配空间和复制值的开销。这就是移动语义的核心。
Lambda 匿名函数
Lambda Functional Programming
基本语法:
1 | [capture] (parameters) mutable -> return_type { statement } |
1 | // example |
1 | std::list<int> li = { 1,2,3,4,5,6,7,8 }; |
1 | std :: array < int , 10 > s = { 5 , 7 , 4 , 2 , 8 , 6 , 1 , 9 , 0 , 3 } ; |
Closure 函数闭包
1 | fromto = [ ] ( auto start, auto finish ) { |
Initializer List
1 | struct s { |
Smart Pointer 智能指针
auto_ptr(C++98):
auto_ptr以对象的方式管理堆分配的内存,并在适当的时间(比如auto_ptr析构时),释放获得的堆内存。这种管理方式只要程序员将new返回的指针作为auto_ptr的初始值即可,不需要显式调用delete。比如:
auto_ptr(new int);
不过auto_ptr有一些缺点,如拷贝时返回一个左值,不能调用delete[]等,在C++11中被废弃。
unique_ptr
unique_ptr如其命名,表示它管理一个只属于它的内存,它不能被复制,可以被移动。
1 | using namespace std; |
shared_ptr
shared_ptr也如其命名,表示多个智能指针可以拥有同一个堆内存。在实现上使用了引用计数,当一个shared_ptr失效,内存也不会被释放,而是引用计数减小。当引用计数归零的时候,shared_ptr才会真正释放堆内存的空间。
weak_ptr
weak_ptr用于指向一个shared_ptr,但它实际上不拥有这个内存。其lock()方法可返回一个shared_ptr,而当所指对象已经失效时,可以返回nullptr。用这个可以验证shared_ptr的有效性。
1 | using namespace std; |
Range Base Loop
1 |
|