c++98可变数量参数
</blockquote>
可变函数模版
变长模版类
在并行编程、多线程编程中,对于共享资源的访问,需要通过添加互斥锁的方法来保证正确性。在posix标准下,pthread库,我们用lock方法来实现,如下:
而在c++11中,我们通过定义的原子类型即可很方便地实现。c++11定义很多原子数据类型,比如:atomic_bool,atomic_char,atomic_int等等。
太复杂,主要是硬件平台下内存读写顺序一致性.在c++11中,实现了很多内存顺序的细节,比如顺序一致、松散、release-require、release-consume四种顺序模型。
本节省略…….
在良好的编程习惯中,声明一个变量时,同时初始化,在以前的习惯里,如果声明指针,一般初始化为0或null。
其中null为宏定义,在stddef.h中可见细节,一般被定义为0或(void*)常量。 在c++11中,定义了一个指针空值类型的常量:nullptr,大小和void*一致。另有nullptr_t常量。
在c++中声明自定义类,编译器会自动生成默认函数:构造函数、拷贝构造函数、拷贝赋值函数、移动构造函数、移动拷贝函数、析构函数。 还会自动生成默认操作符:operator,,operator&,operator&&,operator*,operator->,operaotr->*,operator new,operator delete. 在以前的c++编程规则中,如果我们指定带参数的构造函数,则需要重写不带参数,即默认构造函数。
在c++11中,通过default关键字来实现这个目标。如下:
在实现singleton模式中,我们需要将拷贝构造函数设为私有,在c++11中则更简单,直接利用deleted关键字,指示编译器不生成函数的默认版本。
lambda函数的语法定义如下: [capture](parameters) mutable –>return-type {statement}
使用lambda函数作为stable_sort函数的调用对象。
code…各种各样的lambda函数 捕获列表的常见几种形式: [var] 值传递捕获var [=]值传递方式捕获所有父作用域的变量,包括this [&var]引用传递捕获var [&]引用传递捕获所有父作用域的变量,包括this [this] 值传递方式捕获当前this指针 值传递、引用传递可以混用,比如[=,&a,b]等等。 仿函数,functor,函数对象,就i是重定义了成员函数operator()的一种自定义类型对象。比如在下面的例子中,test不是一样函数,而是一个对象。仿函数广泛地被用在stl中,在c++11中lambda也要被广泛使用。
事实上,仿函数是编译器实现lambda的一种方式,在现阶段,通常编译器会把lambda函数转化为一个仿函数对象。 关于lambda和stl的联系,它使得stl的算法使用更加方便,比如for_each,其原型是: unaryproc for_each(inputiterator beg,inputiterator end,unaryproc op) for_each算法第三个参数是一个单个参数的“函数”,即一个函数指针、仿函数或者lambda函数。 函数指针方法的缺陷是:往往定义在别的地方,阅读代码不方便;如果不进行inline优化,性能就比lambda函数差很多。而且函数指针的应用范围小很多,相比函数指针、仿函数,lambda函数往往是最佳的选择。 注:在c++98中,stl帮助我们定义了很多仿函数可直接使用。</blockquote>