2013-02-03 52 views
0

我无法在标题中清楚地说明我的问题,但这确实是。带指针参数的函数

void DChatbox::ClampObject(DTextbox _txtbox) { 

    this->_txtbox = &_txtbox; 

} 

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

但这个工程。

void DChatbox::ClampObject(DTextbox* _txtbox) { 

    this->_txtbox = _txtbox 

} 

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

注:_txtboxDChatbox被声明为这个DTextbox* _txtbox

+0

DTextbox _txtbox应该是'DTextbox&_txtbox'.pointers和reference是不同的。 – Arpit

+0

@Arpit:我想你的意思是'DTextbox _txtbox'应该是'DTextbox&_textbox',不是吗?第二个例子是正确的,而第一个例子是分配一个局部变量的内存地址(在堆栈中)。 –

+2

请小心,第一个版本将不起作用,因为您正在取得一个局部变量的地址,该变量在函数结束时将被删除。所以当函数结束时,'this - > _ txtbox'不会指向有效的'Dtextbox'对象 – lucasmrod

回答

2

在你的第一种情况,指针成员被分配一个DTextbox对象,它是本地的功能,并保证只活到了地址功能范围{ }结束。
当您在功能DChatbox::ClampObject之外提及this->_txtbox时,您将得到的是未定义的行为

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

+0

它被称为是这样的: //在这里初始化DTextbox实例...然后 mchatbox.ClamObject(&txtbox); 我现在明白了。谢谢! – mr5

1

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

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

+0

我认为它不会被删除,因为我运行它时仍然可以在程序中看到该对象? – mr5

+0

@ mr5:这是未定义的行为。本地对象只保证在该函数内存在。除了函数之外,该对象的地址*可能会或可能不会指向有效的对象。没有保证。所以它有时可能会有效,也可能不会有其他时候。总之,这不是你应该依赖的行为,只是避免它。 –

+0

@AlokSave我会记住它的。感谢您的建议。 – mr5