ghostbody / 15-cpp-learning

15 c++ learning repository of SDCS SYSU
6 stars 3 forks source link

C++11 features #17

Open CodingMie opened 8 years ago

CodingMie commented 8 years ago

Lambda Function(匿名函数):

语法

[capture](parameters) -> return_type { function_body } 例:[](int x, int y) -> int { return x + y; }

如果 lambda 代码块中包含了 return 语句,则该 lambda 表达式的返回类型由 return 语句的返回类型确定。如果没有 return 语句,则类似 void f(...) 函数。

Lambda表达式可以访问在它被调用的作用域内的局部变量。 capture 指定了在可见域范围内 lambda 表达式的代码内可见得外部变量的列表,具体解释如下:

函数对象能维护状态,但语法开销大,而函数指针语法开销小,却没法保存范围内的状态。 lambda函数结合了两者的优点,让你写出优雅简洁的代码。

何时使用lambda:

你在某处就真的只需要一个能做一件事情的函数而已,连它叫什么名字都无关紧要。 Lambda 表达式就可以用来做这件事。 例: image 输出: image

CodingMie commented 8 years ago

auto

语法:

auto x = expression;

例: const int a = 10; auto b = a; const auto c = a;

例: image

优点:

简化代码 例: image

CodingMie commented 8 years ago

智能指针(unique_ptr)

概念

智能指针是基于RAII机制实现的类(模板),具有指针的行为(重载了operator*与operator->操作符), 即行为类似于指针的类对象,可以“智能”地销毁其所指对象。C++11中有unique_ptr、shared_ptr与weak_ptr等智能指针,可以对动态资源进行管理。 image

特性

1、unique_ptr 是禁止复制赋值的,始终保持一个 unique_ptr 管理一个对象。 unique_pt<int> a(new int (11)); unique_ptr<int> b = a; //会出错 2、 unique_ptr 虽然不能赋值,但具有移动语义,可以通过 move() 函数转移对象的所有权。一旦被 move() 了,原来的 unique_ptr 则不再有效了。 unique_ptr<int> b = std::move(a); 或者,利用unique_ptr返回函数内创建的动态资源 image 3、unique_ptr为动态申请的内存提供异常安全,不需要delete image 4、放在容器中 vector<unique_ptr<string>> a { new string{“c++”}, new string{“python”} };