200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > C++_你真的知道++i 和 i++的区别吗?_左值/右值/右值引用

C++_你真的知道++i 和 i++的区别吗?_左值/右值/右值引用

时间:2021-10-26 09:15:16

相关推荐

C++_你真的知道++i 和 i++的区别吗?_左值/右值/右值引用

目录

1 基本概念

2 左值

3 右值

4 左值引用

5 右值引用

参考

1 基本概念

C++ Primer 第五版13.6.1 P471:左值持久,右值短暂

2 左值

左值 lvalue(又称 locator value):代表一个在内存中占有确定位置的对象(换句话说就是有一个地址,一个对象)。(如 int a; a+1 =2; 这里的(a+1)表示:表达式的临时结果,没有确定的内存空间(换句话说,它们只是计算的周期驻留在临时的寄存器中)。

变量是左值

变量可以看做一个运算对象(没有运算符的表达式)

返回左值的例子:

例子:变量赋值,返回引用的函数,下标,解引用,前置递增递减,都是返回左值的表达式的例子。左值引用(常规引用,区别于右值引用) 当然可以作为左值了。

int a = 10;int b = 20;a = b; //变量赋值,a是左值,b作为右值//int c = ++(a++);//err: 后置加减返回的是右值(常量11),右值自身运算无意义。int d = ++(++a);//ok: 前置加减返回的是左值(变量a),左值可以继续运算。int arr[10];arr[0] = 6; //下标*(arr+2) = 7;//ok: arr是变量,*(arr+2)虽有运算符,但解引用后成为一个变量,是左值,//*arr + 3 = 8;//err: *arr是解引用,成为一个变量,是左值, *arr+3是右值表达式,因为有运算符//-----//返回引用的函数 (当右值)---------------------------int& func() { int tmp = 10;tmp = 10 * tmp;return tmp;//ok//return &tmp; //err,返回的是临时变量的地址,无意义。}int e = func(); //返回引用当右值//------//返回引用的函数 (当左值)---------------------------// 除了 赋值运算操作符(operator=)外,还有如下情况char &get_val(srting &str, string::size_type ix){return str[ix];}int main(){string s("a string");cout << s << endl;//输出 a stringget_val(s, 0) = 'A';cout << s << endl;//输出 A stringreturn 0;}// 参考:/yueguohai/article/details/56841707

3 右值

右值 rvalue(又称 readable value,value of an expression,一个对象的值):通过排他性来定义,每个表达式不是lvalue就是rvalue。因此从上面的lvalue的定义,rvalue是在不在内存中占有确定位置的表达式。(如 4 = a;)因此给它们赋值没有语意-这里没有地方给它们赋值。)

返回右值的一些例子:

返回非引用类型的函数,算术、关系、位运算、后置递增减运算符,都生成右值。当然,常量只能作为右值。

4 左值引用

通过 & 来获取

对一个对象的引用,理解为变量的别名。int a = 10;int b = 20;int &c = b;//ok:对变量的引用const int &c1 = 10; //ok: 可以将一个const引用,绑定到右值上const int &c2 = b*10; //ok: 可以将一个const引用,绑定到返回右值表达式(也是右值)上int &f = 10; //err: 不能 绑定到字面常量int &d = b*10; //err: 不能引用(绑定)到返回右值的表达式上double &e = b; //err: 不能绑定到要求转换的表达式上

5 右值引用

通过 && 来获取

必须绑定到右值的引用;不能将右值引用绑定到左值上。

也是引用(某个对象的别名而已),只能绑定到一个将要销毁的对象,如右值引用可以绑定到一个右值表达式上。

int a = 10;int b = 20;int &&c = a; //err:右值引用c,不能绑定到一个左值上int &&d = a*10; //ok:右值引用d,可以绑定到一个右值表达式上int &&e = 10; //ok:右值引用e,可以绑定到一个右值上

右值引用,也是变量(左值),但不能被右值引用再绑定。但可以通过std::move将左值显示地转换为对应的右值引用类型。

int &&a = 10; // okint &&b = a; //err: 不能将右值引用(a是左值!)绑定到右值引用类型的变量(b)上。int &&c = std::move(a); //ok: 将左值显示地转成右值,//此时 a和c第地址是一样的,a已经失效std::cout << "a:" << &a << std::endl; // a: 000000D7C4D2F5F4std::cout << "c:" << &c << std::endl; // c: 000000D7C4D2F5F4a = 20; //不建议这样使用,因为a已经交出了它的内存的所有权c = 30;int d = a; //不建议这样使用,因为a已经交出了它的内存的所有权// 最终 c = b = a = 30;

参考

理解c++中的lvalue 和 rvalue什么是 lvalue,什么是 rvalue?

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。