栈(stack) | 为运行函数而分配的局部变量、函数参数、返回数据、返回地址等 |
---|---|
堆 (heap) | 由new分配的内存块 |
全局/静态存储区(static) | 全局变量,静态数据和常量,共同占用一块内存区 |
常量存储区 | 常量 |
代码区(.text段) | 代码(函数)、所有类成员函数和非成员函数代码 |
文字常量区 | 常量字符串 |
- 类的静态成员变量
类的静态成员变量在类定义时就已经在全局数据区分配了内存,因而它是属于类的。 - 非静态成员变量
对于非静态成员变量,我们是在类的实例化过程中(构造对象)才在栈区或者堆区为其分配内存,是为每个对象生成一个拷贝,所以它是属于对象的。
类是对象的抽象,对象是类的具体实例。
类是抽象的,不占用内存,而对象是具体的,占有内存空间。
例如:类就是水果,对象就是苹果。
class D
{
public:
void printA()
{
cout<<"printA"<<endl;
}
virtual void printB()
{
cout<<"printB"<<endl;
}
};
int main(void)
{
D *d=NULL;
d->printA();
d->printB();
}
可以输出printA,void printA()函数存放在代码段,没有实例化类的时候仍可以用。
不可以输出printB,因为指向虚函数表的指针存放在实例化的对象中。