转载请说明出处:http://blog.youkuaiyun.com/cywosp/article/details/29585227
1. RAII
在进入本文主要内容之前先了解一下C++中常用的RAII(Resource acquisition is initialization)技术,即资源获取即初始化。其利用C++对象生命周期的概念来控制 程序的资源,例如内存、文件句柄、网络连接以及审计追踪(audit trail)等。RAII的基本技术原理很简单,若希望保持对某个重要资源的跟踪,那么创建一个对象,并将资源的生命周期和对象的生命周期相关联,如此一来,就可以利用C++复杂老练的对象管理设施来管理资源。最简单的RAII形式是创建这样一个对象:其构造函数获取一份资源,而析构函数则释放这份资源。在最新的C++标准中有如下数据类型:std::lock_guard、std::unique_lock、std::shared_ptr、std::unique_ptr等等都是RAII技术的很好体现,同时我们也可以自己现实对相关资源的初始化以及释放,例如在多线程编程中我们往往会忘记释放锁而导致线程死锁:
class Mutex{public:Mutex () {pthread_mutex_init (&mu_, NULL);}~Mutex () {pthread_mutex_destroy (&mu_);}void lock () {pthread_mutex_lock (&mu_);}void unlock () {pthread_mutex_unlock (&mu_);}
private:pthread_mutex_t mu_;
// No copyingMutex (const Mutex&);void operator= (const Mutex&);};
Mutex lock;{std::lock_guard<Mutex> guard (lock); // lock is locked by guard……}// lock is not locked by anyone
……
2. Lambda表达式
C++11中的Lambda表达式用于定义并创建匿名的函数对象,以简化编程工作。Lambda的语法形式如下:
[函数对象参数] (操作符重 载函数参数) mutable或exception声明;返回值类型 {函数体};
可以看到,Lambda主要分为五个部分:[函数对象参数]、(操作符重载函数参数)、mutable或exception声明、返回值类型、{函数体}。下面分别进行介绍。
一、[函数对象参数],标识一个Lambda的开始,这部分必须存在,不能省略。函数对象参数是传递给编译器自动生成的函数对象类的构造函数的。函数对象参数只能使用那些到定 义Lambda为止时Lambda所在作用范围内可见的局部变量(包括Lambda所在类的this)。函数对象参数有以下形式:
1、[] 没有使用任何函数对象参数。
2、[=] 函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是值传递方式(相当于编译器自动为我们按值传递了所有局部变量)。
3、[&] 函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是引用传递方式(相当于编译器自动为我们按引用传递了所有局部变量)。
4、[this] 函数体内可以使用Lambda所在类中的成员变量。