C++ 我在这里做错了什么吗(C+;+;)中的引用?
我一直在玩弄参考资料(在这方面我仍然有问题) 1-我想知道这是否是一个可接受的代码: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;
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];
}