Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当setter方法参数是C++;? 我对当复制的东西和C++中引用时有点困惑。例如,我有一个非常简单的方法,其中参数是引用: void setTimeSig(const int &tsNumerator, const int &tsDenominator) { this->timeSigNum = tsNumerator; this->timeSigDenom = tsDenominator; }_C++_Reference_Member - Fatal编程技术网

当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(在您的例子中,在函数调用时)。