[英]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)時,您將返回變量的副本 ,而不是實際變量本身。 對於基本類型(例如int
或char
,這無關緊要,但是對於對象而言,這可能要慢得多 。 簡而言之,必須創建要返回的對象的副本 ,並使該對象的屬性值完全相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.