簡體   English   中英

返回對int的引用與在c ++函數中返回int?

[英]returning a reference to an int vs returning an int in c++ function?

int& returnC() {
    return c;
}

因此,我的部分問題已在此處被另一個問題回答,但我仍然有些困惑。 所以我知道這將返回引用而不是地址。 但是此定義的優勢是什么,您只是返回c而不將其定義為:

int returnC() {
    return c;
}

如果它們都返回相同的變量,則返回對int而不是int的引用有什么好處?

如果我這樣聲明,會發生什么:

int& returnC() {
    return &c;
}

謝謝!

按價值回報

按值返回是最簡單,最安全的返回類型。 當按值返回值時,該值的副本將返回給調用方。 例如:

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

對於第一個版本:

int returnC() {
    return c;
}

您只是返回c的副本。 調用者可以使用此副本執行任何操作,並且永遠不會影響s

使用第二個版本(無需使用c的地址):

int& returnC() {
    return c;
}

呼叫者將能夠寫

returnC() = 5

並將成員c設置為5。我假設c是類的數據成員,因為我在任何地方都看不到它的定義。 如果c不是類的數據成員,那么您將返回對一個臨時引用,該臨時引用在returnC的調用者嘗試使用它時將不存在,應避免使用

要返回一個整數,我可能會使用按值返回。 除非我希望調用者能夠更改c,否則這會泄漏實現細節,通常被認為是不好的做法。 如果我想返回一個對象,可以通過const引用來實現。 這樣就節省了復制類的時間,而沒有使調用者能夠更改對象。 如果調用者需要更改對象,那么我們將返回按值返回

這取決於您的變量在哪里聲明。 如果變量在函數內部沒有自動存儲,則只能返回引用。 我的意思是, 您無需執行以下操作:

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的指針,也不得返回一個指向自動變量的指針。

看起來返回一個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 ,這無關緊要,但是對於對象而言,這可能要慢得多 簡而言之,必須創建要返回的對象的副本 ,並使該對象的屬性值完全相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM