版权声明:本文为博主原创文章,未经博主允许不得转载。 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转换成右值,一般当做参数传递,避免的不必要的复制
- 声明时在变量的类型后放置一个&来进行。如