C++11的右值引用是什么意思?

什么是左值?右值?

顾名思义,左值代表=左边的内容,可被修改,即非const变量都是左值;右值代表=右边的内容,不可被修改,即const变量。

左值引用

“引用”都是引用变量的,而变量是左值,因此它们都是“左值引用”。

右值引用

函数调用的返回值若不是引用,则该函数调用就是右值。常量也可以作为右值引用。C++11 新增了一种引用,可以引用右值,因而称为“右值引用”。无名的临时变量不能出现在赋值号左边,因而是右值。右值引用就可以引用无名的临时变量。

类型 && 引用名 = 右值表达式;

右值引用的应用场景

引入右值引用的主要目的是提高程序运行的效率。有些对象在复制时需要进行深复制,深复制往往非常耗时。合理使用右值引用可以避免没有必要的深复制操作。

右值引用的关联词

无名临时变量、常量、函数返回、移动构造、移动赋值

  • 函数返回的变量基本都是无名临时变量,这些临时变量完成传递任务后就被释放了
  • 移动构造函数,传入的参数类型是右值引用,函数体内,取右值引用的指针传给另一个变量,然后把右值引用的指针指向一个新的内存去。避开了深拷贝,也避免了浅拷贝带来的指针重复的问题。
  • 移动赋值函数,与移动构造同理。避开了深拷贝,也避免了浅拷贝带来的指针重复的问题。
移动构造和移动赋值
char* str;							//private变量
String(String && s) : str(s.str) { //移动构造函数
    cout << "move constructor called" << endl;
    s.str = new char[1];
    s.str[0] = 0;
}
String & operator = (String && s) { //移动赋值号
    cout << "move operator = called" << endl;
    if (str != s.str) {
        str = s.str;
        s.str = new char[1];
        s.str[0] = 0;
    }
    return *this;
}

在移动赋值号函数中没有执行深复制操作,而是直接将对象的 str 指向了参数 s 的成员变量 str 指向的地方,然后修改 s.str 让它指向别处,以免 s.str 原来指向的空间被释放两次。

该移动赋值号函数修改了参数,这会不会带来麻烦呢?答案是不会。因为移动赋值号函数的形参是一个右值引用,则调用该函数时,实参一定是右值。右值一般是无名临时变量,而无名临时变量在使用它的语句结束后就不再有用,因此其值即使被修改也没有关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值