C++ 对象内存布局与this指针

总结:

1.对象内存布局:对象对应的内存中只保存其成员变量,不保存任何与成员函数相关的东西,包括函数入口地址。

2.this指针:保存对象的地址,用于成员函数访问对象的成员函数或成员变量,可用于区分成员函数参数与成员变量同名的情况。

问题引入:有一个类A如下,问对A的一个实例化对象进行sizeof运算,值应该是多少.

class A
{
    int a; 
    int b;
    char *p; 
public:
    A(int a1,int b1,char *p1):a(a1),b(b1)
    {
        p=new char[strlen(p1)];
        strcpy(p,p1);
    }
    ~A()
    {
        delete []p;
        cout << " 析构函数" << 
    }
    void check()
    {
        cout << a << b << p <<endl;
    }
};
int main()
{
    char str[32]="hello";
    A *a=new A(1,2,str); //指针写法  //A *a(1,2,str);  //指针错误写法
    cout << sizeof(*a) << endl;  //16
    a->check();
    delete a;
}

16=int(4)+int(4)+char *p(8)  (为了简化起见,特意选取了一些类型,以便不用考虑字节对齐的情况)

对于多个对象的内存抽象模型:

 

可见对象a的size大小仅包括成员变量,不包括成员函数,甚至没有保存成员函数的入口地址,那问题来了

代码块中的a->check();怎么理解,既然对象a中没有保存check有关的任何东西,又是怎么指向check函数的呢?

成员函数会被保存在指令去(程序代码区)(详见linux下的C语言程序内存布局),在编译器编译时,会将a->check()自动用check函数的代码块替代,但可是成员函数若要访问成员变量时,则如何保证不同的对象调用 相同的 函数代码时,各自访问的是自己的成员变量呢?
    ===>
    C++编译器在每个成员函数中都隐藏着一个指针,这个指针名为 this,用来保存调用该函数的
对象的地址。当调用成员函数时,编译器会自动用this指针保存该对象的地址。如果该成员函数需要访问对象空间中的数据时,编译器会根据this指针的值找到这个对象的空间,然后再去访问其中的值。

this指针:

    (1)this指针只能在成员函数中使用,其实成员函数的第一个默认参数就是this
        eg:
            class Student
            {
                int fun(int x){}
            };
            函数fun(int x)的原型在编译器看来就是 fun(Student *const this, int x);


    (2) 当形参和成员变量同名时,在成员函数内

在这里,举个例子稍微修改一下A的构造函数,以使用到this指针

A(int a1,int b,char *p1):a(a1),b(this->b)
    {
        p=new char[strlen(p1)];
        strcpy(p,p1);
    }

(3) 如果需要返回类对象本身,可以用 return *this。

this 是 C++ 中的一个关键字,也是一个 const 指针,它指向当前对象,通过它可以访问当前对象的所有成员。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值