J_X_W_Q 2024-03-12 14:57 采纳率: 64.3%
浏览 2
已结题

关于#this#的问题,如何解决?(语言-c++)


#include<iostream>
class A
{
public:
    int a = 1;
    int b = 2;
    int c = 3;
    int d = 4;
    void f1()
    {
        std::cout << this << std::endl;
        std::cout << &this->a << std::endl;
        std::cout << &this->b << std::endl;
        std::cout << &this->c << std::endl;
        std::cout << &this->d << std::endl;
    }
};
using namespace std;
int main()
{
    A D;
    D.f1();
}

运行结果:
000000768AAFF678
000000768AAFF678
000000768AAFF67C
000000768AAFF680
000000768AAFF684

//请问为什么输出的第一行和第二行相同

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2024-03-12 14:57
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:

    在给出的C++代码中,this 指针是一个隐含的参数,它在每个非静态成员函数中都存在,且指向调用该成员函数的对象实例。在 f1 函数内部,this 指针存储了对象 D 的地址。当你使用 this->a 时,你实际上是在访问对象 D 中的成员变量 a

    第一行输出 this 指针的值,即对象 D 在内存中的地址。第二行 &this->a 输出的是成员变量 a 的地址。由于 aD 对象内的第一个成员变量,它的地址应该与对象实例 D 的地址相同,因为成员变量直接按照它们在内存中的顺序紧跟着对象的起始地址。

    所以,当 f1 被调用时,this 指针指向 D 对象的开始位置,而 abcd 分别紧随其后。因此,this 指针的值(对象的地址)和 a 的地址是相同的,这解释了为什么第一行和第二行的输出相同。

    后面的几行分别输出了 bcd 的地址,它们依次在 a 之后,每次增加的偏移量通常是所对应数据类型的大小(对于 int,通常是4个字节)。所以在32位系统上,每个 int 占4个字节,地址会每次增加4(0x04)。在你的输出中,从 ad 的地址依次增加了 4 字节,这也符合预期。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 3月20日
  • 已采纳回答 3月12日
  • 创建了问题 3月12日

悬赏问题

  • ¥15 QQ邮箱过期怎么恢复?
  • ¥15 登录他人的vue项目显示服务器错误
  • ¥15 (标签-android|关键词-app)
  • ¥60 如何批量获取json的url
  • ¥15 comsol仿真压阻传感器
  • ¥15 Python线性规划函数optimize.linprog求解为整数
  • ¥15 llama3中文版微调
  • ¥15 pg数据库导入数据序列重复
  • ¥15 三分类机器学习模型可视化分析
  • ¥15 本地测试网站127.0.0.1 已拒绝连接,如何解决?(标签-ubuntu)