栈和堆的概念不清楚,先看这个:http://blog.csdn.net/yichengshang/archive/2009/09/04/4520034.aspx
本笔记是思路记录,想让自己考清楚数据成员,函数,变量,类生产的对象等的内存空间
如果一个类包含了数据和函数,但是每个类对象占用的存储空间只是该对象的数据部分所占用的存储空间。具体可以用sizeof()计算。
每一个类的成员函数有一个this指针,它是指向本类对象的指针,它的值就是当前被调用的成员函数所在对象的起始地址。
class Object
{
public:
int x;
int y;
void display()
{
int i = 0;
cout<<x<<y<<endl;
}
};
void main()
{
Object a,b;//定义了Object类的两个对象 a.display();
a.display();//调用类的成员函数
}
现在有两个类的对象a和b,怎么知道是哪个对象在调用display函数呢?
编译系统就把对象a的起始地址赋给display的this指针,于是在成员函数引用数据成员时(x和y),就按照this指针找到对象a的数据成员。
display函数实际是执行:cout<<this.x<<this.y<<endl;
用VC6.0来试验一下
用上面的代码示例调试,分别在a.display()和display()内部插入断点。调试运行:
首先在a.display()暂停了,如图
上图中,我们可以看到a对象的地址,a对象的两个成员变量x,y的地址。同样也可以看到b对象的内存地址。
看来a对象的首地址也就是a.x的地址,b也是如此
然后我们还看到,a.display函数和b.display函数的地址是一样的,而且,并没有和a,b对象放在一个内存空间,隔得有点远······
假设结论:是不是对象在堆上,对象中只包含它的成员变量,它的成员函数并没有在对象里面,而是放在了另一个空间里。
结论先不管真不真确,接着调试:按10跳入display函数体中。
这时候出现了this指针!!
回顾文章开头的理论:每一个类的成员函数有一个this指针,它是指向本类对象的指针,它的值就是当前被调用的成员函数所在对象的起始地址。
比较之前的截图,果真是如此!!
我们在display()中声明了一个局部变量 i ,这个局部变量的内存地址是:
好像和a,b对象已经x,y两个成员变量的地址靠的很近,难道:局部变量也是存放在对象所在的空间里?在堆上?!
这个结论有点玄乎,不是说局部变量在栈上么?(⊙o⊙)…,越调越糊涂了,停下来,去找找资料。
冷静下来,回头看:
一个类包含了数据和函数,但是每个类对象占用的存储空间只是该对象的数据部分所占用的存储空间
重新添加代码:
#include<iostream>
using namespace std;
class Object
{
public:
int x;
int y;
void display()
{
int i = 0;
cout<<x<<y<<endl;
}
};
class TempClass
{
public:
int a;
void show()
{
a = 10;
cout << a <<endl;
}
};
void main()
{
Object a,b;
a.display();
Object *c = new Object();//动态内存分配
c->display();
}
对象中值存放该对象的数据部分。函数存哪?!局部变量存哪?!栈呗~~