左值,右值和引用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/winter_wu_1998/article/details/84190940
  • 左值与右值
    • 左值是长久存在的值, 如 arr, arr[x], *pt
    • 右值是临时存在的值, 如 x+y, “foo", 2
      • 函数的返回值如果不是返回引用的话也是右值,不可赋值给一个左值引用
    • 最简单的判断方式就是能否用取地址符&操作
    • 无法对右值进行更改操作,也无法对右值赋值
  • 引用
    • 声明时在变量的类型后放置一个&来进行。如string& rstr= str;
    • 注意不能将一个右值赋值给左值引用, 如string& rstr = str + "hello";
    • 用途
      • 给一个结构复杂的名称起别名
        • auto& whichList = lists[ myhash(x, lists.size() ) ]
        • auto 后一定要加&符号, 否则解读为拷贝
      • 范围for循环
        • for(auto x : arr) x++; 是不行的, 因为x是拷贝的值,并不能改变arr中原来的值
        • for (auto& x : arr) x++; 可以,因为x此时是引用
      • 引用传参
        • 无需将参数复制一份临时变量
        • 如果不希望改变参数,可以使用常量引用
      • 返回值传递
        • 避免的返回值的复制
        • 不要返回对一个局部变量的引用,一般是返回一个静态变量的引用
        • 如果不想返回的变量在后面被改变,应该返回常量引用
        • 不能返回函数内部new分配的内存的引用
        • 今天看到一篇博客讲引用返回值,非常好:https://blog.csdn.net/u012814856/article/details/84099328
    • std::move(var)
      • 当你确定var不会再使用的时候,可以使用std::move(var)将var转换成右值,一般当做参数传递,避免的不必要的复制

猜你喜欢

转载自blog.csdn.net/winter_wu_1998/article/details/84190940
今日推荐