2

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

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

这是否意味着因为我在函数 wheresetTimeSig完成时使用了引用,所以带有timeSigNum和的对象timeSigDenom将使这两个字段为空?还是此时正在复制它:this->timeSigNum = tsNumerator;

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

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

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

非常感谢有关我应该在哪里阅读或阅读有关此内容的任何信息。我仍然对很多事情感到困惑。

4

3 回答 3

5

引用可以被认为是隐式指针。虽然在语义上它们可以具有更复杂的含义(即,引用通常被认为是“绑定的”,但不能是NULL),但底层编译器通常将它们视为自动取消引用的指针。因此,从编译器的角度来看,您的代码实际上如下所示:

this->timeSigNum = *tsNumerator;
this->timeSigDenom = *tsDenominator;

所以引用本身的值不会被复制,而是引用绑定到的原始变量的值被复制,就像您手动取消引用显式指针一样。

于 2012-07-26T14:01:16.987 回答
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/

于 2012-07-26T14:11:08.033 回答
0
  1. 那时它正在被复制: this->timeSigNum = tsNumerator;
  2. 包含一个副本。

C++ 仅在您将内容显式声明为引用时(几乎)使用引用。

于 2012-07-26T14:00:54.030 回答