当setter方法参数是C++;? 我对当复制的东西和C++中引用时有点困惑。例如,我有一个非常简单的方法,其中参数是引用: void setTimeSig(const int &tsNumerator, const int &tsDenominator) { this->timeSigNum = tsNumerator; this->timeSigDenom = tsDenominator; }
这是否意味着,因为我在当setter方法参数是C++;? 我对当复制的东西和C++中引用时有点困惑。例如,我有一个非常简单的方法,其中参数是引用: void setTimeSig(const int &tsNumerator, const int &tsDenominator) { this->timeSigNum = tsNumerator; this->timeSigDenom = tsDenominator; },c++,reference,member,C++,Reference,Member,这是否意味着,因为我在setTimeSig函数完成时使用了引用,所以带有timeSigNum和timesignom的对象将使这两个字段为空?或者是在这里复制:this->timeSigNum=tsNumerator 还有一个关于同一件事的问题: class A{ public: B bObject; } B b; A a; a.bObject = b; bObject现在是指b还是包含副本 任何关于我应该在哪里或读什么的信息都非常感谢。我仍然把很多事情弄糊涂了 此时正在复制它:this
setTimeSig
函数完成时使用了引用,所以带有timeSigNum
和timesignom
的对象将使这两个字段为空?或者是在这里复制:this->timeSigNum=tsNumerator代码>
还有一个关于同一件事的问题:
class A{
public:
B bObject;
}
B b;
A a;
a.bObject = b;
bObject
现在是指b还是包含副本
任何关于我应该在哪里或读什么的信息都非常感谢。我仍然把很多事情弄糊涂了
此时正在复制它:this->timeSigNum=tsNumerator李>
包含一份副本
C++仅在将内容显式声明为引用时(几乎)才使用引用。引用可以被视为隐式指针。虽然在语义上它们可能有更复杂的含义(即,引用通常被认为是“绑定的”,并且不能是NULL
),但底层编译器通常将它们视为自动取消引用的指针。因此,从编译器的角度来看,您的代码实际上如下所示:
this->timeSigNum = *tsNumerator;
this->timeSigDenom = *tsDenominator;
因此,不会复制引用本身的值,而是复制引用绑定到的原始变量的值,就像手动取消引用显式指针一样。在第一个示例中,将函数参数引用的值复制到成员变量中
在第二个示例中也是一样,这里将值从对象b复制到对象a.bobObject
当使用运算符=时,您总是使用赋值运算符,默认方式是所谓的浅复制。当您的类中有动态数据时,您需要小心,因为默认数据不会这样做,因为您将只复制动态数据的地址,并且这些数据可以在原始实例或复制的实例中销毁。在这种情况下,您需要执行深度复制,这意味着您需要通过重载赋值运算符手动复制动态数据
有关浅复制与深复制的更多信息,请参见此处:
更多来自同一来源的关于复印/转让操作员主题的阅读:
阅读其中一本应该有助于你的理解。这两本书都是复印的。请记住,引用只能在初始化时绑定到refered to object(在您的例子中,在函数调用时)。