c++:左值,右值,引用分类,move

一:

左值:能用在赋值等号的左侧的东西,能代表一个地址,必须有地址

右值:不能出现在,赋值语句的左侧。

结论:

1.c++的一条表达式,不是左值,就是右值,不可能两者都不是。

2.左值有的时候能够被当作右值使用。

  

i = i+1;//一个左值,可以同时具有左值和右值属性。

 二:引用分类

左值引用:

没有空引用的说法

左值绑定到左值

左值必须绑定到有名字的变量(临时变量不可以如:“This is a string”)

const int &c = 1; //这个可以

右值引用:

必须绑定到右值的引用

int  &&refrightvalue = 3; //绑定到一个常量

refrightvalue = 5;

const 引用(常量引用):

int v;

alue = 12;

const int&referval = value;

总结:

1.++i :直接个i加一,返回i本身,返回左值表达式

i++; 先用i,再加一。先产生临时变量,再给i加一,再返回临时变量的,右值表达式。

2.任何函数里面的形参都是左值 void f(int && w);

右值引用的目的:

提高程序运行效率:把拷贝对象变成移动对象来提高程序的运行效率。

移动构造函数,移动赋值运算符

三:std::move函数

移动:实际上没有做移动的操作

只有把一个左值强制转换成一个右值的能力。

string st = " i Lou=ve China" ; 

const char *p = st.c_str();

string def  = std::move(st) ; //sting里的移动构造函数把st的内容转移到了def中,而不是std::move移动了st

const char *q = def.c_str();

string &&deff = std::move(st);  //不会使用移动构造函数。st并没有变。有的书要承诺:以后st不再使用

参考:网易云 精通c++111417 课程

猜你喜欢

转载自blog.csdn.net/qq_41543888/article/details/89639819