总结:
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。