簡體   English   中英

我在這里做錯了什么(在C ++中引用)?

[英]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.

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