2014-10-05 50 views
2

我不明白我什麼時候想要返回一個函數的引用(即T& func(){...})。什麼時候你會返回一個函數的引用?

例如:

T& func() { 
    Something t; 
    return t; 
} 

這將創建一個名爲t一個Something實例,然後通過引用返回。當我們超出範圍時,t丟失。所以參考是指0我認爲..?

換句話說,爲什麼我會想要返回一個引用或一個const引用?請解釋並舉例說明。

+2

對函數中定義的靜態變量返回引用並不少見。成員函數也經常返回引用。每當引用是一個持續時間比該函數更長的對象時,如果這是有意義的。 – Galik 2014-10-05 23:42:33

+0

另一個例子是max。請仔細關注樣本實施中的返回類型http://www.cplusplus.com/reference/algorithm/max/ – 2014-10-05 23:51:01

+0

參考文獻如何神奇地開始參考「0」?那有什麼意思? – 2014-10-06 00:04:00

回答

3

當您從某個函數的參數中返回成員時,通常會這樣做。從標準庫的一個例子:

template<class T, size_t n> 
struct array 
{ 
    T data[n]; 

    T& operator[](size_t i) { return data[i]; } 
}; 
1

有時你返回到一個函數中定義一個靜態變量的引用:

T& func() { 
    static Something t; // this will exist until program closes 
    return t; 
} 

這是一種技術,以幫助包括靜態初始化的順序作戰的問題。

顯然成員變量是有意義的(我敢肯定,你不問那些雖然):

T& MyType::func() { 
    return this->t; // persists with the object 
} 

而且有時你想返回在傳遞給函數的對象:

std::ostream& operaor<<(std::ostream& os, const MyType& t) { 
    // blah blah 
    return os; // pass it back out 
} 

這可讓您鏈功能結合在一起,如:

if(std::getline(input >> size >> std::ws, line)) 
{ 
    // size and line were successfully read here 
} 
0

你能想到的引用只是指針而已。每當你從函數返回一個指針時,你可能會返回一個引用類型。

我認爲你的問題與返回引用是範圍的問題。只要沒有範圍問題,它就是您可以使用的另一種工具。

0

返回對當前對象的引用用於實現用戶定義的賦值運算符。

class Foo 
{ 
    Foo& operator=(const Foo&); 
    //... 
}; 

實現運營商+=-=*=等的過載時,它也可以用來作爲返回類型,這些運營商表明,返回類型爲調整後的當前對象,而不是一個新的對象。因此,要返回當前對象,請返回對*this的引用。

相關問題