为什么简单数据类型的返回值要作为左值时,就必须返回引用类型,而返回一般的值就不可以做左值。

Python024

为什么简单数据类型的返回值要作为左值时,就必须返回引用类型,而返回一般的值就不可以做左值。,第1张

1+2是啊,你说的“链式应用”我觉得有些夸张就是连续运用操作符号,比如你用加法操作符return一个类类型数据,但是你用想使用这个被加后产生的类的成员x,如果你不引用就是a=b+ca.x,但是如果你引用了就可以(b+c).x,只是因为如果你只是返还一个值,那么它只会在栈区开辟一块数据地址存放零时对象的值,然后把这个临时对象的值用复制构造函数复制给b,但是你却不能用它,但是引用是传地址所以可以用它,有个例子很鲜明能浅显说明这种区别:a=3,如果我用3+1,这里的3就值传递情况下的b+c显然是没有意义;但是我用a+1就是用意义的,a就是3这个地址的引用,你改变它下面的值是用意义的,只能说这么多,有些东西还要自己想;

3,更简单,++a,如果你引用了就是返回了a的地址,此时a已经加1,完全可以,但是如果是a++,你返还的是a加1之前的数值,换句话说此时a已经不是a,而是a+1,但是你如果引用,那么又是它的地址,而地址下是a+1,那么后++就和前++没有任何区别,这样做是没有意义的,能明白吗?

4,你去了当然有用,看你怎么用了,引用不是强迫你用,但是要看你想实现什么功能,举++的例子,你定义函数时必定起传地址,但是如果你返还不传引用而是传值,那么你想(++a)++,有意义吗?很显然没,应为括号里的++a是常量,这就和3+1一样

5,看了上面的东西,如果你理解了,这个问题就不是问题了,还是地址的问题

函数返回值是引用或者是指针类型的时候,返回值可以作为左值。例子:一、int *value=new intint *find(int a){*value=areturn value}void main(){cout<<(*find(100)=1000)<<endl等价于int *temp= find (100)*temp=1000cout<<*value<<endlsystem("pause")}运行结果如下: 二、int *value=new intint &find(int a){*value=areturn *value}void main(){cout<<(find(100)=1000)<<endl等价于int &temp=find(100)temp=1000cout<<*value<<endlsystem("pause")}运行结果如下: 但是如果返回值是按值返回的话:int value=new intint find(int a){value=areturn value}void main(){cout<<(find(100)=1000)<<endlcout<<value<<endlsystem("pause")}会出现编译错误:提示不能作为左值的错误! 综上所述:按值返回的返回值不能作为左值,因为对临时变量(接收返回值的临时变量,编译器自动生成)来说,C++规定这种返回类型的临时变量不能作为左值,因为操作这样的临时变量并不能对实际的变量产生影响。

.....一个返回的是对象的引用,一个返回的是类的对象...看你怎么用了...

好吧,... 返回类的对象的不用说了吧.和返回int型,float型什么的都一样. 主要是返回引用的.

返回引用时,没有复制返回对象,返回的是对象本身.

string &shorterString(string &s1,string &s2)

{

return s1.size()<s2.size()? s1:s2//返回

//的是s1,或者s2.是你传递引用类型形参.

//看了下面的两个函数你会发现,传递的形参里

//至少有一个是引用. .是用来被返回的.

}

不要返回局部对象的引用.

const string &manip(const string&s)

{

string ret=s

return ret// 错误,ret为局部对象.

}

引用返回左值.(这个是和返回类对象的一个很大的区别)

char &get_val(string &str,int ix)

{

return str[ix]

}

int main()

{

string s("a value")

cout<<s<<endl

get_val(s,0)='A' // 这里可以用来赋值的,

cout<<s<<endl

return 0

}

上面的例子内容,摘自<<C++ Primer>>