关于参考的问题

时间:2010-09-01 09:52:39

标签: c++

我认为以下内容非常基本,但我并没有真正了解其中一个代码的“优点”。

有这个:

int main()
{
    int a = 10;
    f(a);
    return 0;
}

之间有什么区别
void f(int& a)
{
    int& b = a;
}

void f(int& a)
{
    int b = a;
}

特别是在f代替类的构造函数而不是int的情况下,我们有一个大对象。

我会选择第二种可能性......你怎么看?

感谢。

修改

首先,看看答案,我在发布问题时脑子已经死了,但实际上我在评论中找到了有趣的子问题(和答案!)。

3 个答案:

答案 0 :(得分:4)

int& b = a不会复制,int b = a会。

最重要的是,构造函数的调用者可以更改对象,您将在新对象中看到这些更改。更糟糕的是:如果调用者破坏了对象(或者它被自动销毁),则对象的引用无效。

答案 1 :(得分:4)

首先:

void f(int& a) {
    int& b = a;
}

来电者传入a,我们将其作为对来电者a的引用。然后我们创建一个新的引用b,引用a,它仍然是调用方的a。因此,f及其包含的类可以看到调用者所做的任何更改,fab所做的任何更改都会影响来电者以a传入。

void f(int& a) {
    int b = a;
}

此处,b是一个新变量int,它采用a副本。对b所做的更改不会影响来电者,也不会影响来电者b。但是更快地编写相同的东西是:

void f(int b) {
}

完全取消a引用。特别是,这在原型中表明该函数不会修改其参数,因为它不能;而void f (int &a)的原型表示可以修改a

编辑:如果你需要避免任何复制,第三个选项(tm)是对const的引用:

void f(const int &a) {
    const int &b = a;
}

f内,ab都不能被修改,因此它不会影响调用者,但通过使用对const的引用可以避免复制。仍然存在一个潜在的问题,即调用者对a造成的任何更改都将在对象内部可见,因为只有一个实际数据项a和许多名称;这是你需要记录的东西,以确保来电者不会做任何这样的事情。

答案 2 :(得分:2)

第二个版本创建变量的副本,而第一个版本仅生成对原始对象的另一个引用。如果您只有一个参考,如果调用者破坏了他的对象,就会发生Bad Things(tm)。所以你很可能想要使用第二个版本(除非你确定使用引用是安全的)。