对象指针的副作用

Side Effect on Object Pointer

本文关键字:副作用 指针 对象      更新时间:2023-10-16

我可以在这个代码片段中找到问题所在:

我想在函数中重置一个指针,我通过返回指针实现了它的工作,但是我不能让它有副作用(通过指针传递)。

void function(Object * obj)[{
    obj = new Object();
    cout << obj << endl;
    //return obj;
}
main(){
    Object * obj = 0;
    function(obj);
    cout << obj << endl;
}

在这种情况下,结果是:

0x12345678
0

而它应该是

0x12345678
0x12345678

我尝试使用指针的指针或引用的指针,但仍然无法通过函数。虽然只是返回值,但效果很好。但是我需要在几个参数上这样做,代码比这里显示的要复杂得多。

如果你像这样改变你的函数声明,它应该工作:

void function(Object  * &obj)

在您的原始代码中,您是按值传递指针,这意味着函数复制了指针,并且函数中指针的任何更改都不会反映出来。当您通过引用传递时,您实际上正在处理原始数据,这可能在幕后使用指针完成。

你可能会想看看这个主题。

通过指针指向指针返回对象(C方式):

void function(Object ** obj) {
  *obj = new Object();
}

main(){
  Object * obj = 0;
  function(&obj);
...

通过引用指针返回对象(c++方式):

void function(Object *& obj) {
  obj = new Object();
}
main(){
  Object * obj = 0;
  function(obj);
...

调用

void function(Object * obj){

你正在复制指针obj,换句话说,"函数"的堆栈现在保存了一个名为obj的指针的本地副本。当函数返回时,此本地副本将被销毁。你可以实现你想要的:

void function(Object* obj&){

将通过引用传递调用者的obj指针。现在,对obj的任何更改也将反映在调用者的作用域中。