【C/C++】【类和对象】左值(引用)和右值(引用)

时间:2020-07-21 09:32:08   收藏:0   阅读:61

左值和右值

结论

  1. C++的表达式,要么是左值,要么是右值,不能能两者都不是;
  2. 左值有的时候能够被当做右值使用;
int i = 10;
i = i + 1;	//i是个左值,不是右值,虽然它出现等号右边
//i用在等号右边的时候,i有一种右值属性;不是右值;
//i用在等号左边的时候,用的是i代表的内存中的地址,i有一种左值属性;
//一个左值,他可能给同时具有左值属性和右值属性

用到左值的运算符有哪些:

  1. 赋值运算符

    int a;
    cout << a = 4  << endl;
    (a = 4) = 8; //整个赋值语句的结果是左值;
    
  2. 取地址 &

    int a  = 5; //变量a是个左值		
    &a; // 
    
  3. 容器中的下标/迭代器

    string str = "hello world!";
    str[0]; 
    vector<int>::iterator iter;
    iter++;
    iter--;
    
  4. 通过判断一个运算符在一个字面值上能不能操作,可以判断运算符是否用到的是左值;

左值表达式、右值表达式

  1. 左值表达式当成左值;左值代表一个地址,所以左值表达式的求值结果,就得是一个对象,就得有地址;求值结果为对象的表达式,不代表一定是左值,具体再分析;
  2. 右值表达式当成右值;

总结:

  1. 左值,赋值运算符等号左边的东西;代表一个地址;
  2. 右值,代表赋值运算符右边的东西;代表一个值;

引用分类

三种形式的引用

  1. 左值引用(绑定到左值)

    int value = 10;
    int &ref_val = value;
    ref_val = 13; // value = 13;
    
  2. const引用(常量引用),也是左值引用,不希望改变值的对象;

    int value = 10;
    const int &ref_val = value;
    //ref_val = 18; 不可修改
    
  3. 右值引用,绑定到右值:是个引用,主要用于临时对象;

    int &&ref_right_value = 3; //绑定到一个值上
    ref_right_value = 5;
    

左值引用

将变量绑定到左值上;

右值引用

引用右值,也就是说,绑定到右值;必须是绑定到右值的引用;通过&&

总结

  1. 返回左值引用的函数,连同赋值,下标,解引用和前置递增递减运算符,都是左值表达式的例子;可以将一个左值引用绑定到这类表达式上;
  2. 返回非引用类型的函数,连同算术,关系,位以及后置递增运算符,都生成右值;不能将一个左值引用绑定到这类表达式上,但是可以将一个const的左值引用或者一个右值引用绑定到这类表达式上;

前置++和后置++的区别

重点

右值引用的引入目的

std::move函数

int i = 10;
int &&ref = std::move(i);
i = 20; //i的值改变,ref的值也变量; ref代表i;


int &&ri = 100; //ri是左值
int &&re = std::move(ri); 


//string的移动构造函数做了哪些事情
// 1. 将str清空; 2. 给def分配内存 3.将str的内容移动到def
string str = "hello world";
const char* q = str.c_str(); //q是str实际所占内存
string def = std::move(str); //=会调用string的移动构造函数,导致str中的内容移动到def中
const char* p = def.c_str(); //p是def实际所占内存

string str = "hello world";
std::move(str); //单独执行 str内容没空,只是将str转成右值;


string str = "hello world";
string &&def_r = std::move(str); //def_r右值引用 绑定到str上;
//建议:使用了std::move之后,不要用str了;

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!