当setter-method参数是C ++中的引用时会发生什么?

时间:2012-07-26 13:57:23

标签: c++ reference member

我对复制内容以及在C ++中引用它们时有点困惑。例如,我有一个非常简单的方法,其中参数是引用:

void setTimeSig(const int &tsNumerator, const int &tsDenominator) {
    this->timeSigNum = tsNumerator;
    this->timeSigDenom = tsDenominator;
}

这是否意味着因为我在完成setTimeSig的函数时使用了引用,所以timeSigNumtimeSigDenom的对象将这两个字段为空?或者是在此时复制:this->timeSigNum = tsNumerator;

还有一个关于同样事情的问题:

class A{
public:
    B bObject;
}
B b;
A a;
a.bObject = b;

bObject现在引用b还是包含副本?

非常感谢有关我应该阅读的内容或内容的任何信息。我还在困惑很多事情。

3 个答案:

答案 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/

关于复制/作业选择主题的更多相同来源的阅读:

http://www.learncpp.com/cpp-tutorial/911-the-copy-constructor-and-overloading-the-assignment-operator/

答案 2 :(得分:0)

  1. 此时正在复制:this-> timeSigNum = tsNumerator;
  2. 包含副本。
  3. 只有当你明确地将东西声明为引用时,C ++才会使用引用(几乎)。