int& returnC() {
return c;
}
所以我的问题的一部分已经被另一个问题回答了,但我仍然有点困惑。所以我知道这会返回引用而不是地址。但是这个定义的优点是什么,你只是回归c为什么不把它定义为:
int returnC() {
return c;
}
如果它们都返回相同的变量,那么返回对int的引用而不仅仅是int的优点是什么?
如果我这样宣布会发生什么:
int& returnC() {
return &c;
}
谢谢!
答案 0 :(得分:2)
按值返回
按值返回是最简单,最安全的返回类型。当按值返回值时,该值的副本将返回给调用者。 例如:
int returnC() {
return c;
}
按引用方式返回
就像通过引用传递一样,引用返回的值必须是变量(不能返回对文字或表达式的引用)。当通过引用返回变量时,对变量的引用将传递回调用者。然后调用者可以使用此引用继续修改变量,这有时很有用。 按引用返回也很快,这在返回结构和类时很有用。 例如:
// This struct holds an array of 25 integers
struct MyArrays
{
int ArrValue[25];
};
// Returns a reference to the nIndex element of rArray
int& Value(MyArrays &rArray, int nIndex)
{
return rArray.ArrValue[nIndex];
}
int main()
{
MyArrays objArray;
// Set the 10th element of objArray to the value 5
Value(objArray, 10) = 5;
cout << objArray.ArrValue[10] << endl;
return 0;
}
答案 1 :(得分:1)
第一个版本:
int returnC() {
return c;
}
您刚刚返回c的副本。调用者可以使用此副本执行任何他们想要的操作,它永远不会影响s
第二个版本(无需取c的地址):
int& returnC() {
return c;
}
来电者可以写
returnC() = 5
并将成员c设置为5.我假设c是类的数据成员,因为我没有看到它在任何地方定义。如果c不是类的数据成员,那么当returnC的调用者尝试使用它时应该返回对临时的引用,并且应该避免
要返回一个int,我可能会使用按值返回。除非我希望调用者能够更改c,但这会泄漏实现细节并且通常被认为是不好的做法。如果我想返回一个对象,我可以通过const引用来做。这样可以节省复制类,而不会让调用者能够更改对象。如果调用者需要更改对象,那么我们将返回按值返回
答案 2 :(得分:0)
这取决于您声明的变量在哪里。如果变量在函数内没有自动存储,则只能返回引用。我的意思是,你永远不必做这样的事情:
int& foo () {
int a = 1;
return a;
}
在这种情况下,a
随自动存储而变化。当函数返回时,变量会丢失并且你有一个对被破坏变量的引用,这是一件非常糟糕的事情。
如果您有类的成员变量或全局变量,则可以按值或按引用返回。区别在于语义:如果按值返回,只有value
很重要,变量将被复制。
另一方面,通过返回引用,您可以修改原始数据。它可能更快,因为不需要复制。但这是另一回事。
class MyClass {
int a;
public:
int& foo () { return a; }
int foo () { return a; }
/* ... */
};
MyClass类有一个int成员a
。您可以按值或按引用返回a
。这里的区别在于意义。您是否允许修改原始数据?如果是这样,请通过引用返回。
你的最后一个例子是错误的:
int& returnC() {
return &c;
}
您的函数说:“我正在返回对int的引用”,但return &c
表示您正在返回指向它的指针。在这种情况下,正确的方法是:
int* returnC() {
return &c;
}
然后你返回一个指向int的指针,你也不能返回指向自动变量的指针。
答案 3 :(得分:0)
返回对int的引用可能看起来像返回int一样,但事实上它们是两个根本不同的东西。
以参考方式返回
当您返回对Object / primitive(例如int)的引用时,您将返回对方法中返回的变量的引用。对于对象,这是有利的,因为不必复制对象,而只是返回对该对象的引用
它还允许您这样做:
int& max(int &x, int &y){
if (x > y){
return x;
}
return y;
}
int main(){
int x = 10, y = 12;
//This sets, y to 0.
max(x, y) = 0;
}
按价值返回
当您返回Object / primitive本身(再次,例如int)时,您将返回变量的副本而不是实际变量本身。对于int
或char
这样的原始类型而言,这并不重要,但对于对象,此可能会慢得多。简而言之,必须使用具有完全相同的属性值的对象创建要返回的对象的副本。