C++11的新特性简单汇总介绍 (二)

2020-01-06 15:34:39丽君

如果引用类型的捕获怎么做呢,看下面的例子,用lambda是这样的:


#include <iostream>
#include <functional>
using namespace std;
using namespace std::placeholders;
void main()
{
 int x = 10;
 ostream &o = cout;
 auto f =[&o](int a){o<<a<<endl;}; // 注意这里的输出对象是用的引用捕获
 f(x);
}

使用bind是这样的:


#include <iostream>
#include <functional>
using namespace std;
using namespace std::placeholders;
void f(ostream &o,int x)
{
 o<<x<<endl;
}
int main()
{
 int x = 10;
 auto f_wrap = bind(f,ref(cout),_1); //将变量的引用传递到bind中是个问题,为此C++11提供了ref()函数用于获得引用
 f_wrap(x);
 return 0 ;
}

6. 智能指针share_ptr,unique_ptr

C++11中引入了几种智能指针,智能指针能够自动释放所指向的对象,其中shared_ptr允许多个指针指向同一个对象,unique_ptr则独占所指向的对象,我们主要说明shared_ptr的使用。通过使用make_shared<type>()函数产生智能指针对象。

 

复制代码
shared_ptr<int> p = make_shared<int>(40); // p指向一个值为40的int对象
shared_ptr<string> p2 = make_shared<string>(10,'c'); //指向值为'cccccccccc'的string对象

 

make_shared<type>()函数中传递的值要与对应的type的构造函数相匹配,实际上应该就是直接调用的对应type的构造函数。

我们可以使用new初始化的指针来初始化智能指针:

 

复制代码
share_ptr<int> p (new int(40));
p.get(); // 使用share_ptr<type>的get()函数来获得其关联的原始指针。

 

shared_ptr对象在离开其作用域(例如一个函数体),会自动释放其关联的指针指向的动态内存,就像局部变量那样。另外多个shared_ptr可以指向一个对象,当最后一个shared_ptr对象销毁的时候才会销毁其关联的那个对象的动态内存。这里使用了引用记数。

7. 右值引用与move调用,移动构造函数

为了支持移动操作,C++11中使用了一种称为右值引用的类型。移动操作是什么呢,一般情况下我们将一个对象赋值给另一个对象的时候会调用对象到拷贝构造函数或者拷贝赋值运算符。而移动构造函数和移动赋值运算符则用来将数据从一个对象移动到另一个对象。在很多情况下对象拷贝之后需要被销毁,此时使用移动操作会大幅提高性能。右值引用被使用之后,其关联的对象会被销毁。右值引用使用两个&&表示,例如 int && 表示右值引用,而int &则是左值。通过C++11标准库提供的函数 std::move()可以得到某一对象的右值引用。