我无法在标题中清楚地说明我的问题,但事实确实如此。
void DChatbox::ClampObject(DTextbox _txtbox) {
this->_txtbox = &_txtbox;
}
这个只是创建_txtbox
没有引用它的副本。
但是这个有效。
void DChatbox::ClampObject(DTextbox* _txtbox) {
this->_txtbox = _txtbox
}
当我检查第一个时,它只是复制它,而不是引用它。为什么会那样?
注意:_txtbox
上的{/ em> DChatbox
被声明为此DTextbox* _txtbox
答案 0 :(得分:2)
在第一种情况下,指针成员被赋予一个DTextbox
对象的地址,该对象是函数的本地对象,并且只保证在函数作用域{ }
结束之前存在。
当您在函数this->_txtbox
之外引用DChatbox::ClampObject
时,您获得的是未定义的行为。
在第二种情况下,指针成员被分配给传递给函数的对象的地址,并且可能(很难说,除非你显示调用它的代码)该对象的生命周期传递给函数的时间足以使程序正常工作,因此它可以正常工作。
答案 1 :(得分:1)
这是因为第一个版本按值传递参数,即它生成整个对象的副本。该方法完成后,只需删除副本。因此,当方法完成时,该本地对象的地址无效,因为它指向已删除的对象。
第二个版本使用指针传递参数,因此指针引用真实对象而不是对象的副本。因此,当方法完成时,指针的值仍然与它指向仍然存在的对象相同。