2013-10-03 147 views
0

任何一個可以給我解釋一下這兩個函數的區別是:C++和返回參考

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

int test(int a) 
{ 
    return a; 
} 

,並告訴我是什麼目的,當我們使用「&」操作後函數的返回類型? 我們什麼時候應該使用它,因爲我以前很少見過它。

+0

您通常不希望將其用作此處顯示的確切原因的返回類型。 – chris

+2

http://stackoverflow.com/a/2273821/78845 – Johnsyweb

+3

它不是一個「運營商」。這恰好是'&'字符恰好是某些操作符中使用的相同字符。 – AnT

回答

2

任何人都可以向我解釋這兩個函數之間的區別嗎?

第一個示例可能會產生未定義的行爲,因爲返回的引用「指向」一個在函數結束時被銷燬的變量。這與dangling pointer的定義非常相似(幾乎相同)。

第二種情況是在上面指定的示例中返回變量的正常「正確」方式。


,並告訴我,當我們使用「&」運算符函數的返回類型之後的目的是什麼?

&&在返回語句中的類型之後的用途是返回對該類型的引用。


我們什麼時候使用它,因爲我很少見過。

通常,傳遞引用或返回引用對於避免傳遞/返回參數的副本是有用的,這可能是代價高昂的。

由於C++ 11有更好的方式來處理返回大對象:move semantics

在其他情況下,它用於提供對班級內部成員的訪問。這是std::string::operator[]例如例如:它也可以用來允許函數調用鏈

char& operator[] (size_t pos); 
const char& operator[] (size_t pos) const; 

。這是:

std::cout << 'H' << 'e' << 'l' << 'l' << 'o'; 

例如。在上面的代碼中,std::ostream::operator<<返回對自身的引用。

+0

我不知道確切的方式來解釋它應該是什麼,因爲我英語不好, 但我不知道「目的「當我們使用&後返回類型。 可能是下面的例子並沒有顯示正確的方式,那正是我想的,對不起,阿博那個。 我只是想知道當我們使用它的'目的'。 感謝您的評論:D – dinhha471

+0

@ dinhha471,看看新的編輯。 – Shoe

+0

在我看來,儘管返回對int的引用可能是合法的'C',正如有人指出的那樣,該函數會返回對函數堆棧中變量的引用。因此,當您嘗試訪問它時,您可能會遇到訪問衝突或SEGV。 – cowboydan

0

'&'返回類型後的運算符表示該函數返回一個引用。它是有道理的,它的吸氣方法,如

class A{ 
public: 
    int &val(){return _val;} 
private: 
    int _val; 
}; 

好處是,你可以讀取和修改對象的狀態。例如:

A a; 
a.val() = 10; 

但它在你的情況下,它可能是更好的傳遞給函數的引用而不是返回它:

void test(int &a) 
{ 
    //do something with a 
} 

這是不好的引用返回本地功能對象,例如:

int& test() 
{ 
    int x;  
    return x; 
} 

因爲x不存在外部測試()函數。

+0

感謝提到getter和setter,它很容易瞭解 – dinhha471

0

第一個是危險的,因爲變量的範圍。如果你想這樣做,你應該使變量靜態。