我认为以下内容非常基本,但我并没有真正了解其中一个代码的“优点”。
有这个:
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
的情况下,我们有一个大对象。
我会选择第二种可能性......你怎么看?
感谢。
修改
首先,看看答案,我在发布问题时脑子已经死了,但实际上我在评论中找到了有趣的子问题(和答案!)。
答案 0 :(得分:4)
int& b = a
不会复制,int b = a
会。
最重要的是,构造函数的调用者可以更改对象,您将在新对象中看到这些更改。更糟糕的是:如果调用者破坏了对象(或者它被自动销毁),则对象的引用无效。
答案 1 :(得分:4)
首先:
void f(int& a) {
int& b = a;
}
来电者传入a
,我们将其作为对来电者a
的引用。然后我们创建一个新的引用b
,引用a
,它仍然是调用方的a
。因此,f
及其包含的类可以看到调用者所做的任何更改,f
对a
或b
所做的任何更改都会影响来电者以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
内,a
和b
都不能被修改,因此它不会影响调用者,但通过使用对const的引用可以避免复制。仍然存在一个潜在的问题,即调用者对a
造成的任何更改都将在对象内部可见,因为只有一个实际数据项a
和许多名称;这是你需要记录的东西,以确保来电者不会做任何这样的事情。
答案 2 :(得分:2)
第二个版本创建变量的副本,而第一个版本仅生成对原始对象的另一个引用。如果您只有一个参考,如果调用者破坏了他的对象,就会发生Bad Things(tm)。所以你很可能想要使用第二个版本(除非你确定使用引用是安全的)。