Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我在这里做错了什么吗(C+;+;)中的引用?_C++_Reference - Fatal编程技术网

C++ 我在这里做错了什么吗(C+;+;)中的引用?

C++ 我在这里做错了什么吗(C+;+;)中的引用?,c++,reference,C++,Reference,我一直在玩弄参考资料(在这方面我仍然有问题) 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;

我一直在玩弄参考资料(在这方面我仍然有问题)

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;
}

这是否正确/足够?

第一个是正确的

对于第二个,有无限多的解决方案:),但这将是我的:

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; 
} 
此外,您还可以使用指针返回对周的引用:

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(每周[52])
{ 
周*最大值=&年[0];
对于(int i=1;i<52;i++)
{ 
如果(aYear[i].getSales()>max->getSales())max=&aYear[i];
} 
返回*最大值;
} 

回答您的问题:

foo(x) = 9;   // is this wrong?
我想说是的,这是错误的,因为它没有意义,尽管它在语法上是有效的。至于你的“考试”问题(谁在问这个问题?)


换句话说-返回一个值。您几乎应该始终返回值而不是引用-引用用于函数参数。

关于引用的重要事项始终是确保引用不指向超出范围的对象

这就是第二个示例的问题:

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];
}    

+我赞成鞠躬,但我有点不同意:学习没有什么可耻的。你再也不会犯那种错误了。:-)@乔恩·埃里克:推荐人是行不通的。基本上,一旦初始化它,它就成为它自己的数组元素(别名)。所以,你不能再重新分配了,你是对的。我错过了一行
if
末尾的作业。重载
运算符[]
;)时,作为返回类型的引用很方便。)@弗雷德:当然,这就是为什么我说“几乎总是”。在用户的情况下,这样做是没有意义的。重载
操作符=
也是如此,但老实说,我不喜欢使用赋值作为表达式。
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])
Week & Week::highestSalesWeek(Week aYear[52])
{
  Week max = aYear[0];
  return max;
}
// 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];
}