右值引用和移动构造函数

右值引用和移动构造函数

ID:15992163

大小:36.08 KB

页数:9页

时间:2018-08-07

右值引用和移动构造函数_第1页
右值引用和移动构造函数_第2页
右值引用和移动构造函数_第3页
右值引用和移动构造函数_第4页
右值引用和移动构造函数_第5页
资源描述:

《右值引用和移动构造函数》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、问题背景1.#include   2.   3.using namespace std;  4.   5.vector doubleValues (const vector& v)  6.{  7.    vector new_values( v.size() );  8.    for (auto itr = new_values.begin(), end_itr = new_values.end(); itr != end_itr; ++itr )  9.    {  10.        

2、new_values.push_back( 2 * *itr );  11.    }  12.    return new_values;  13.}  14.   15.int main()  16.{  17.    vector v;  18.    for ( int i = 0; i < 100; i++ )  19.    {  20.        v.push_back( i );  21.    }  22.    v = doubleValues( v );  23.}  先来分析一下上述代码的运行过程。1.ve

3、ctor v;  2.for ( int i = 0; i < 100; i++ )  3.{  4.    v.push_back( i );  5.}  以上5行语句在栈上新建了一个vector的实例,并在里面放了100个数。1.v = doubleValues( v )  这条语句调用函数doubleValues,函数的参数类型的constreference,常量引用,那么在实参形参结合的时候并不会将v复制一份,而是直接传递引用。所以在函数体内部使用的v就是刚才创建的那个vector的实例。但是1.vector new

4、_values( v.size() );  这条语句新建了一个vector的实例new_values,并且复制了v的所有内容。但这是合理的,因为我们这是要将一个vector中所有的值翻倍,所以我们不应该改变原有的vector的内容。1.v = doubleValues( v );  函数执行完之后,new_values中放了翻倍之后的数值,作为函数的返回值返回。但是注意,这个时候doubleValue(v)的调用已经结束。开始执行=的语义。赋值的过程实际上是将返回的vector复制一份放入新的内存空间,然后改变v的地址,让v指向这篇内

5、存空间。总的来说,我们刚才新建的那个vector又被复制了一遍。但我们其实希望v能直接得到函数中复制好的那个vector。在C++11之前,我们只能通过传递指针来实现这个目的。但是指针用多了非常不爽。我们希望有更简单的方法。这就是我们为什么要引入右值引用和转移构造函数的原因。左值和右值在说明左值的定义之前,我们可以先看几个左值的例子。1.int a;  2.a = 1; // here, a is an lvalue  上述的a就是一个左值。临时变量可以做左值。同样函数的返回值也可以做左值。1.int x;  2.int& getRef () 

6、  3.{  4.        return x;  5.}  6.   7.getRef() = 4;  以上就是函数返回值做左值的例子。其实左值就是指一个拥有地址的表达式。换句话说,左值指向的是一个稳定的内存空间(即可以是在堆上由用户管理的内存空间,也可以是在栈上,离开了一个block就被销毁的内存空间)。上面第二个例子,getRef返回的就是一个全局变量(建立在堆上),所以可以当做左值使用。与此相反,右值指向的不是一个稳定的内存空间,而是一个临时的空间。比如说下面的例子:1.int x;  2.int getVal ()  3.{  4

7、.    return x;  5.}  6.getVal();  这里getVal()得到的就是临时的一个值,没法对它进行赋值。下面的语句就是错的。1.getVal() = 1;//compilation error  所以右值只能够用来给其他的左值赋值。右值引用在C++11中,你可以使用const的左值引用来绑定一个右值,比如说:1.const int& val = getVal();//right  2.int& val = getVal();//error  因为左值引用并不是左值,并没有建立一片稳定的内存空间,所以如果不是const的

8、话你就可以对它的内容进行修改,而右值又不能进行赋值,所以就会出错。因此只能用const的左值引用来绑定一个右值。在C++11中,我们可以显示地使用“右

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。