首页 > 编程语言 > 详细

c++左值引用和右值引用

时间:2020-11-08 17:04:49      阅读:20      评论:0      收藏:0      [点我收藏+]

1.左值持久 右值短暂
左值有持久的状态,是定义的一个变量 右值要么是字面常量 要么是临时变量
左值表示的是一个对象的身份 比如变量名字 右值表示的是一个对象的值 比如字符串字面量
一般左值引用只可以绑定左值 常量左值引用可以绑定字面值或者临时对象
例如: const int& a=34; const A& a=A();
右值引用只能绑定到临时对象 所引用的对象即将被销毁 该对象没有其他用户
使用右值引用的对象可以接管所引用对象的资源 因为被引用的对象是右值,没有其他用户,即将被销毁,所以可以放心接管
int b=1; int &a=b;//正确左值引用 int&& a=b;//错误 右值引用必须引用一个临时对象或常量 如int&& a=1;
用右值初始化对象时候会调用移动构造函数 例如 A &&a=std::move(b); std::move()把一个左值b变成一个右值 随后将b中管理的资源置空 将其资源控制权转移给a
用右值给给一个对象赋值的时候会调用移动赋值运算符 例如 a=std::move(b);

例如:

class A {
public:
    A() {
        cout << "默认构造函数" << endl;
    }
    A(A&& a) {
        cout << "移动构造函数" << endl;
    }
    A(const A& a) {
        cout << "拷贝构造函数" << endl;
    }
    A& operator=(A&& a) {
        cout << "移动赋值运算符" << endl;
        return *this;
    }
};
A a,c; //默认构造函数
A b = std::move(a);  //移动构造函数  在b用右值初始化时候调用
b = std::move(c);    //移动赋值运算符  在b用右值赋值时候调用
const A aa;
A d=aa;               //调用拷贝构造函数  常量aa也是一个左值

c++左值引用和右值引用

原文:https://www.cnblogs.com/maomaolfq/p/13944179.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!