c++返回值与引用
int func(int a),该函数会返回一个int类型,如果进行一次调用 int result=func(3);会发生什么情况?(注意:这里的实参是一个常量)
首先,func将返回值复制到一个临时变量中,然后再将临时变量的值复制到result中。这里进行了两次复制。
对于返回引用的函数:
int& func(int& a);假设该函数传入的是一个int的引用,然后在func中修改它,再返回其引用。
假如调用 int result=func(b);会发生如下情况:(注意:这里的实参是一个变量)
返回的是b的引用,因此相当于直接将b的值复制给result,
这里就少了一次临时变量的复制。(这里返回的是引用,而不是被赋值的变量是一个引用。所以result并没有引用到b)
如果想要result引用到b可以这样做:
int& result=func(b);
注:返回c++内置变量看不出引用的效率,但是返回较大的类或结构体的时候就能看到效率比较高了。
但是,如果函数的声明是int func(int a)。而调用的时候是int& result=func(a);会怎样呢?
这样编译器会报错,不能用一个临时变量来初始化一个非常量的引用变量。
这样写就可以消除错误:const int& result=func(a);这样虽然返回的不是引用,但是由于最后赋值予一个引用变量,因此整个过程也只有一次复制,result不能改变其引用的内容。
我们似乎可以得出:可以将一个临时变量赋给一个常量的引用变量。
还有一种很诡异的情况:
int& func(int& a);一样假设传入一个int的引用,在func中修改它,然后返回其引用。如果有函数调用func(b)=3;那么,b的就是3了,原因就是返回了b的一个引用,又将3
赋给了这个引用。
要想避免这样的情况发生,可以这样声明函数:
const int&func(int& a);这样返回的是一个const的引用,不允许修改它的指向。如果有func(b)=3这样的调用,将不能通过编译。