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这样的调用,将不能通过编译。