b = a++ 相当于 b = a, a = a + 1
b = ++ a 相当于a = a +1, b = a
为什么a++不能做左值
a++返回的是自身的值副本,所以不能作为左值
int int::operator++(int)
{
int oldvalue = *this;
++*this;
return oldvalue;
}
++a 返回的是a加1后自身的引用
int& int::operator ++()
{
*this = *this+1;
return *this;
}
一个令人惊讶的程序:给函数的返回值赋值
这个例子来自《C++ Primer(第四版)》。
- //例程2:给函数的返回值赋值
- #include <iostream>
- #include<string>
- using namespace std;
- char &get_val(string &str, string::size_type ix)
- {
- return str[ix];
- }
- int main()
- {
- string s("a value");
- cout<<s<<endl; //输出 a value
- get_val(s,0)='A'; //函数调用一般是不能作为赋值运算的左值的,但这儿居然没有错,只因为返回值为引用
- cout<<s<<endl; //输出为 A value,不可思议的改变
- system("pause");
- return 0;
- }
正如注释中所讲,返回值为引用,函数调用get_val(s,0)居然可以作为赋值表达式的左值,就这样,其引用的空间(s[0])中所存储的字符被赋值为‘A’,“引用是被返回元素的同义词”,此处完全等同于s[0]='A'。
程序从语法上讲没有问题,运行结果也达到了举例的目的。本例仅在于展示这种用法,理解引用作为函数返回值。在工程中,这种风格的程序当然不推荐使用,当不希望引用返回值被修改时,将返回值声明为const,即:
const char &get_val(string &str, string::size_type ix)
相关推荐
本文主要讲了为什么(i++)不能做左值,而(++i)可以的原因,希望对你的学习有所帮助。
非常量引用的初始值必须为左值的问题 C++ 11中引入的一个非常重要的概念就是右值引用。理解右值引用是学习“移动语义”(move semantics)的基础。而要理解右值引用,就必须先区分左值与右值。 对左值和右值的一...
左值和右值
这是关于C++左值与右值引用的课程视频,课程易于理解,可以很快掌握
便捷方法:对表达式取地址,如果能,则为左值,否则为右值 举例: int a = 10 int b = 20 int *pFlag = &a vector<int> vctTemp vctTemp.push_back(1) string str1 = "hello" string str...
本文主要讲了关于i++和++i以及左值,右值的问题,希望对你的学习有所帮助。
这两个概念在C语言中比较容易理解:左值能放在赋值语句的左边,右值不能。但是当来到C++时,二者的理解比较复杂了(PS:有对象真是麻烦) 简单的归纳: · 当一个对象被用作右值的时候,用的是对象的值...
看了一下自己的资源,下载了很多,实在不好意思,整理一份发一下。 Android开发高效率的还是依靠NDK,所以C语言学习一下也是有必要的。...都是baidu搜索来的,希望你也能抽空把C语言的基础打扎实。
左值:可以取地址的,有名字的,临时的右值:不能取地址的,没有名字的,临时的举个栗: int a = b + c ,a 就是左值,其变量名为 a ,通过 &a 可
这篇blog主要介绍一下左值和右值的概念及应用陷阱 1、左值和右值的概念 左值是可以放在赋值号左边可以被赋值的值;左值必须要在内存中有...即引用必须初始化,不能对引用重定义; 对引用的一切操作,就相当于对原对象
左值,右值,引用,以及源代码
cpp代码-左值 和 右值 ---- 左值引用(就是别名) 和 右值引用
MicroActionXv12网络通信说明-左值科技.pdf
C++表达式与运算符及左值专题[汇编].pdf
c++的左值右值 i++与++i的区别.docx
C语言程序设计(第2版)-2期 拓展知识3-1 左值和右值.pdf 学习资料 复习资料 教学资源
(某些情况下,右值表达式也能引用(refer)到某一个对象,并且可能间接修改该对象的值,后述)。何谓对象?如果没有明确说明,这里说的对象,和狭义的类/对象(class/object)相比,更为广泛。在C/C++中,所谓的...