2010-06-12 63 views
5

我一直在玩弄引用(我仍然有这方面的问题)。我在这里做错了什么(在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]; 

这是正确的吗?

回答

5

第一个是正确的。

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

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

你说得对。我鞠躬可耻的方式,大声笑 – zildjohn01 2010-06-12 22:20:29

+0

+ 1的弓,但我不同意轻微:学习没有什么可耻的。你永远不会再犯这个错误。 :-) – Thanatos 2010-06-12 22:22:50

+0

为什么要涉及一个指针?本地参考似乎更可取。 – 2010-06-12 22:24:07

1

要回答你的问题:

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]) 

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

+0

当重载'operator []'时,引用作为返回类型会派上用场;) – fredoverflow 2010-06-13 11:54:40

+0

@Fred当然 - 这就是为什么我说“几乎总是”的原因。在用户的情况下,这样做毫无意义。 – 2010-06-13 15:08:29

+0

也重载'operator =',但说实话,我不喜欢使用赋值作为表达式。 – fredoverflow 2010-06-13 15:28:36

2

关于引用的重要事情总是确保引用不是针对超出范围的对象。

即与第二示例中的问题:

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]; 
}  
相关问题