2014-03-06 212 views
0
int& returnC() { 
    return c; 
} 

所以我的问题的一部分已经被另一个问题回答了,但我仍然有点困惑。所以我知道这会返回一个参考而不是一个地址。但是,什么是这个定义的优点,你只是回到ç为什么不把它定义为:返回一个int的引用与返回一个int在c + +函数?

int returnC() { 
    return c; 
} 

什么是返回一个引用为int的优势,而不是只是一个int,如果他们都返回相同的变量?

会发生什么,如果我声明它是这样的:

int& returnC() { 
    return &c; 
} 

谢谢!

+0

你可以试试最后一个,看看它不会编译。前两个不同,因为一个让调用者修改'c'(这是参考的整个点)。 – chris

回答

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; 
} 
+0

所以返回类型“int&”与返回变量“c”一起授予访问权限以修改c,而“int”+“return c”只返回c的值。 – user3348712

+0

准确!这就是我们使用这些技术的地方。 –

+0

明白了!非常感谢你! – user3348712

1

随着第一个版本:

int returnC() { 
    return c; 
} 

你只是返回℃的副本。呼叫者可以做任何他们想做的这个副本,并不会影响到小号

与第二个版本(没有必要采取的C地址):

int& returnC() { 
    return c; 
} 

主叫方将能够写

returnC() = 5 

并将成员c设置为5.我假设c是一个类的数据成员,因为我没有看到它在任何地方定义。如果c不是类的数据成员,那么你会返回一个临时的引用,当returnC的调用者尝试使用它并且应该被避免时,它不会存在。

要返回一个int,我可能会使用return按价值。除非我希望调用者能够更改c,但是这会泄漏实现细节,并且通常被认为是不好的做法。如果我想要返回一个对象,我可以通过const引用来实现。这样可以节省复制类而不给调用者修改对象的能力。如果调用者需要更改对象,那么我们将返回按值返回

+0

第一个版本返回一个副本,你的意思是“int&returnC()”或“int returnC()”?如果你的意思是int&returnC(),那么它会和我想的相反。 – user3348712

+0

对不起,我的意思是int returnC(),所以你认为是正确的 – RichardBruce

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,你不能返回一个指针到自动变量要么。

0

它看起来像返回一个int的引用与返回一个int相同,但实际上它们是两个完全不同的东西。

返回由参考
当返回一个参考到对象/原语(如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; 
} 


返回到值
当您返回一个对象/原始本身(再次,如int),你是返回一个复制的变量,而不是实际变量本身。这对于原始类型(如intchar)而言并不重要,但对于对象而言,此可能会慢很多。简而言之,要返回的对象的副本必须使用具有完全相同的属性值的对象来创建。