我对复制内容以及在C ++中引用它们时有点困惑。例如,我有一个非常简单的方法,其中参数是引用:
void setTimeSig(const int &tsNumerator, const int &tsDenominator) {
this->timeSigNum = tsNumerator;
this->timeSigDenom = tsDenominator;
}
这是否意味着因为我在完成setTimeSig
的函数时使用了引用,所以timeSigNum
和timeSigDenom
的对象将这两个字段为空?或者是在此时复制:this->timeSigNum = tsNumerator;
还有一个关于同样事情的问题:
class A{
public:
B bObject;
}
B b;
A a;
a.bObject = b;
bObject
现在引用b还是包含副本?
非常感谢有关我应该阅读的内容或内容的任何信息。我还在困惑很多事情。
答案 0 :(得分:5)
引用可以被认为是隐式指针。虽然在语义上它们可以具有更复杂的含义(即,引用通常被认为是“绑定”的,并且不能是NULL
),但是底层编译器通常将它们视为自动解引用的指针。因此,从编译器的角度来看,您的代码实际上如下所示:
this->timeSigNum = *tsNumerator;
this->timeSigDenom = *tsDenominator;
因此,不会复制引用本身的值,而是复制引用所绑定的原始变量的值,就像手动取消引用显式指针一样。
答案 1 :(得分:3)
在第一个示例中,您将函数参数引用的值复制到成员变量中。
在第二个示例中,您可以在此处将对象b中的值复制到对象a.bObject中。
使用operator =时总是使用赋值运算符,而执行此操作的默认方式是所谓的浅拷贝。如果在类中有动态数据,则需要小心,因为默认情况不会这样做,因为您只复制动态数据的地址,并且可以在原始实例或复制的实例中销毁此数据。在这种情况下,您需要进行深度复制,这意味着您需要通过重载赋值运算符来手动复制动态数据。
更多关于浅层和深层复制的信息:
http://www.learncpp.com/cpp-tutorial/912-shallow-vs-deep-copying/
关于复制/作业选择主题的更多相同来源的阅读:
答案 2 :(得分:0)
只有当你明确地将东西声明为引用时,C ++才会使用引用(几乎)。