0

我无法在标题中清楚地说明我的问题,但确实如此。

void DChatbox::ClampObject(DTextbox _txtbox) {

    this->_txtbox = &_txtbox;

}

这个只是创建一个_txtbox不引用它的副本。

但这一个有效。

void DChatbox::ClampObject(DTextbox* _txtbox) {

    this->_txtbox = _txtbox

}

当我检查第一个时,它只是复制它,而不是引用它。为什么会这样?

注意: _txtbox onDChatbox被声明为 thisDTextbox* _txtbox

4

2 回答 2

2

在您的第一种情况下,指针成员被分配了一个对象的地址,该DTextbox对象是函数本地的,并且保证只存在到函数范围{ }结束。
当您this->_txtbox在函数之外引用时DChatbox::ClampObject,您得到的是Undefined Behavior

在第二种情况下,指针成员被分配给传递给函数的对象的地址,并且可能(很难说,除非你显示调用它的代码)传递给函数的对象的生命周期对于你的程序来说足够长正常工作,因此它工作正常。

于 2013-02-03T13:40:10.793 回答
1

这是因为第一个版本按值传递参数,即它复制整个对象。当该方法完成时,它只是删除副本。因此,当方法完成时,该本地对象的地址是无效的,因为它指向一个已删除的对象。

第二个版本使用指针传递参数,因此指针引用真实对象而不是对象的副本。因此,当方法完成时,指针的值仍然和它指向一个仍然存在的对象一样。

于 2013-02-03T13:41:08.667 回答