我在这里做错了什么(在C++中的引用)?
我一直在玩弄引用(我仍然有这方面的问题)。我在这里做错了什么(在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;
}
要回答你的问题:
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])
换句话说 - 返回一个值。您应该几乎总是返回值而不是引用 - 引用是用于函数参数的。
当重载'operator []'时,引用作为返回类型会派上用场;) – fredoverflow 2010-06-13 11:54:40
@Fred当然 - 这就是为什么我说“几乎总是”的原因。在用户的情况下,这样做毫无意义。 – 2010-06-13 15:08:29
也重载'operator =',但说实话,我不喜欢使用赋值作为表达式。 – fredoverflow 2010-06-13 15:28:36
关于引用的重要事情总是确保引用不是针对超出范围的对象。
即与第二示例中的问题:
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];
}
你说得对。我鞠躬可耻的方式,大声笑 – zildjohn01 2010-06-12 22:20:29
+ 1的弓,但我不同意轻微:学习没有什么可耻的。你永远不会再犯这个错误。 :-) – Thanatos 2010-06-12 22:22:50
为什么要涉及一个指针?本地参考似乎更可取。 – 2010-06-12 22:24:07