[英]Am I doing something wrong here (references in C++)?
我一直在玩引用(我在這方面仍有問題)。
1-我想知道這是否是可接受的代碼:
int & foo(int &y)
{
return y; // is this wrong?
}
int main()
{
int x = 0;
cout << foo(x) << endl;
foo(x) = 9; // is this wrong?
cout << x << endl;
return 0;
}
2-這也來自考試樣本:
Week & Week::highestSalesWeek(Week aYear[52])
{
Week max = aYear[0];
for(int i = 1; i < 52; i++)
{
if (aYear[i].getSales() > max.getSales())
max = aYear[i];
}
return max;
}
它詢問此代碼中的錯誤,以及如何修復它。
我的猜測是它返回一個本地引用。 修復是:
Week & max = aYear[0];
這是正確/足夠嗎?
第一個是正確的。
對於第二個,有無限數量的解決方案:),但這將是我的:
Week Week::highestSalesWeek(Week aYear[52]) // return a copy of the week
{
Week max = aYear[0];
for(int i = 1; i < 52; i++)
{
if (aYear[i].getSales() > max.getSales()) max = aYear[i];
}
return max;
}
如果max是引用,則每次執行時都會修改aYear的第一個元素:
max = aYear[i]
此外,您可以使用指針返回對周的引用:
Week & Week::highestSalesWeek(Week aYear[52])
{
Week* max = &aYear[0];
for(int i = 1; i < 52; i++)
{
if (aYear[i].getSales() > max->getSales()) max = &aYear[i];
}
return *max;
}
引用的重要一點是始終確保引用不是超出范圍的對象。
這是你的第二個例子的問題:
Week & Week::highestSalesWeek(Week aYear[52])
{
Week max = aYear[0];
return max;
}
max
是該方法的本地自動變量。 當該方法超出范圍時, max
超出范圍,現在您的代碼引用了隨機內存。
由於您的代碼希望保持max
重新分配,因此您無法使用引用(因為在初始賦值之后,您只能修改引用的內容,而不是引用本身)。 您需要跟蹤要返回引用的aYear
的實際部分。 兩個建議。
// By pointer
Week & Week::highestSalesWeek(Week aYear[52])
{
Week *max = &aYear[0];
...;
return *max;
}
// By index
Week & Week::highestSalesWeek(Week aYear[52])
{
size_t max_idx = 0;;
...;
return aYear[max_idx];
}
回答你的問題:
foo(x) = 9; // is this wrong?
我會說是的,它是錯誤的,雖然它在語法上是有效的,但沒有意義。 至於你的“考試”問題(誰在問這個東西?):
Week & Week::highestSalesWeek(Week aYear[52])
{
Week max = aYear[0];
for(int i = 1; i < 52; i++)
{
if (aYear[i].getSales() > max.getSales()) max = aYear[i];
}
return max;
}
好吧,在參數上提供數組維度是沒有意義的,代碼顯然應該使用向量。 並且校正應該在函數的簽名中:
Week Week::highestSalesWeek(Week aYear[52])
換句話說 - 返回一個值。 您應該幾乎總是返回值而不是引用 - 引用是用於函數參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.