2014-03-06 133 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)而言並不重要,但對於對象而言,此可能會慢很多。簡而言之,要返回的對象的副本必須使用具有完全相同的屬性值的對象來創建。