带指针参数的函数

时间:2013-02-03 13:35:36

标签: c++

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

void DChatbox::ClampObject(DTextbox _txtbox) {

    this->_txtbox = &_txtbox;

}

这个只是创建_txtbox没有引用它的副本。

但是这个有效。

void DChatbox::ClampObject(DTextbox* _txtbox) {

    this->_txtbox = _txtbox

}

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

注意:_txtbox上的{/ em> DChatbox被声明为此DTextbox* _txtbox

2 个答案:

答案 0 :(得分:2)

在第一种情况下,指针成员被赋予一个DTextbox对象的地址,该对象是函数的本地对象,并且只保证在函数作用域{ }结束之前存在。 当您在函数this->_txtbox之外引用DChatbox::ClampObject时,您获得的是未定义的行为

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

答案 1 :(得分:1)

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

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