【问题标题】:How does object pointer works in c++?对象指针在 C++ 中是如何工作的?
【发布时间】:2020-07-12 14:29:13
【问题描述】:

我试图了解对象如何存储在内存(堆)中以及引用变量的工作原理。我写了一个简单的程序来理解这个概念。但是,当函数callBar() 返回地址时,为什么我得到取消引用的地址,即*(&cat) 而不是&cat

#include<iostream>
using std::cout;
using std::string;
class Cat{
        public: string name;
};
Cat* callBar(Cat *cat){
        cat = new Cat();
        cout<<&cat<<"\n";
        cout<<*(&cat)<<"\n";
            
        return cat;
}
int main(void){
        Cat *c = new Cat();
        cout<<&c<<"\n";
        cout<<callBar(c)<<"\n";
        cout<<*(&c)<<"\n";
        return 0;
}

代码的输出是:

0x7ffd38985d70
0x7ffd38985d48
0x56368fbd22b0
0x56368fbd22b0
0x56368fbd1e70

我在 main 中创建了类的实例并打印了它的地址。我将这个对象传递给另一个函数,然后再次打印它的地址,这给了我新的参考。 Atlast,我尊重它。

我仍然不清楚为什么我会在函数返回时得到取消引用的地址,即*(&amp;cat),而不是&amp;cat

【问题讨论】:

  • 提供的代码中没有对象引用。也许问题应该是:对象指针在 c++ 中是如何工作的?

标签: c++ oop


【解决方案1】:

我仍然不清楚为什么在函数返回时我得到了取消引用的地址,即 *(&cat) 而不是 &cat?

callBar 内部,相关位是...

Cat* callBar(...unused argument...){
    cat = new Cat();
    cout << &cat << "\n";
    cout << *(&cat) << "\n";
    return cat;
}

您没有收到 &amp;cat 回复,因为您的退货声明是 return cat; 而不是 return &amp;cat;

但是 - 你的问题的其余部分 - 你为什么得到*(&amp;cat)?那里的&amp; 运算符获取Cat* cat 局部变量的地址,然后用* 取消引用它:这些操作取消了,所以*(&amp;cat) == cat

【讨论】:

  • 如何原样返回?我的意思是我正在同一个引用变量 cat 上创建一个新对象。 cat = new Cat(); 如果取消,那么地址应该匹配吗?
  • @SauravJaiswal • 您正在同一个callBar 局部参数变量cat 上创建一个新对象。这具有将cat 设置为不同值的效果,而不是更改调用者的c 参数。
  • 对不起 - 我什至没有注意到函数中的那一行 - 太困了! :-/ Point 仍然存在 - 在您将该值分配给 cat 之后,*(&amp;cat) 是一样的。
猜你喜欢
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
相关资源
最近更新 更多