为什么通过引用返回是有利的?



我知道经验法则是,如果返回的变量存在于调用者中,则通过引用返回。假设我们有一个函数:

int& f(int& a){ return a; }

现在,在调用者中,我可以用两种方式调用:

int a = 5;
int b1 = f(a); // 1
int& b2 = f(a); // 2 

区别在于调用者b1或a的变化不会相互影响,但调用者b2或a的变化会相互影响。

这意味着,a在调用对象中指向int的值被复制到b2,然而,由于上面的语句,似乎只有a在调用对象中指向的值被复制到b1。

那么像第一种情况一样通过引用返回的优点是什么呢?像1这样的语句的例子是复制赋值操作符,它通过引用返回赋值链:例如:obj1 = obj2 = obj3;

我错过了什么吗?

坦率地说,你的论点没有实际意义。

根据同样的推理,你可能会认为一般使用引用没有任何好处,因为它可以用来复制:

int x = 42; 
int& ref = x;
int y = ref;    // makes a copy
然而,仅仅因为你可以使用引用来制作副本并不会降低引用的可用性:
ref = 24;  // does modify x 

在你的例子中:

int a = 5;
int b1 = f(a); // 1
int& b2 = f(a); // 2

调用者决定在// 1中复制几乎与f无关。当然,你可以使用参考来制作副本。但是你不能使用副本来修改a:

f(a) = 42;   // modifies a

f返回一个引用时,这只按预期工作(修改a)。

作为一个类比,你可以问:使用飞机的优势是什么?飞机可以像汽车一样在地面上行驶;)

最新更新