进阶篇_C++类对象的内存模型

# include <iostream>
using namespace std;
//类对象的成员变量、成员函数内存测试 
class Base
{
public:	//成员函数 
	void foo1()
	{
	}
	void foo2()
	{
	}
public:	//成员变量 
	double m_fMember1;
	int m_nMember2;	
};

typedef void (Base::*P) ();	//定义类成员函数指针类型,用于得到类的成员函数指针 

int main()
{
	Base base;
	cout<<"类对象的地址是:"<<&base<<endl;
	cout<<"类对象成员变量m_fMember1的地址是:"<<&(base.m_fMember1)<<endl;
	cout<<"类对象成员变量m_fMember1的占用的内存字节数是:"<<sizeof(base.m_fMember1)<<endl;
	cout<<"类对象成员变量m_nMember2的地址是:"<<&(base.m_nMember2)<<endl;
	
	
//	cout<<"Base类第一个成员函数的地址是:"<<&Base::foo1<<endl;
//	cout<<"Base类第二个成员函数的地址是:"<<&Base::foo2<<endl;

	P pFunc = &Base::foo1;
	unsigned int* tmp = (unsigned*) &pFunc;
	cout<<"Base类第一个成员函数的地址是:"<<hex<<*tmp<<endl;
	pFunc = &Base::foo2;
	tmp = (unsigned*)&pFunc;
	cout<<"Base类第二个成员函数的地址是:"<<hex<<*tmp<<endl;
	
	return 0;
} 
结果:


类对象中的成员变量是按照类声明中的顺序依次排列的,而类对象的成员函数不是。因为每个对象都有一份成员变量不同,而并不是每个对象都有一份成员函数。因为同一个类的所有对象的成员函数都是相同的,没有必要为每个对象都配备一份成员函数。因此类的所有成员函数都被放在一个特殊的位置,所有这个类的对象都共用这份成员函数。总结:类的对象中每个对象有各自的成员变量,并共用类的成员函数

若类中有虚函数存在,情况有一些变化。为了能让对象能够调用它的虚函数,在每个对象最开始的内存位置添加一个虚函数表的指针_vfptr,其后才是对象的成员变量内存数据;如果某个类是个派生类,那么它的对象内存中最开始的地方实际上是基类对象的拷贝, 包括基类虚函数表指针和成员变量,其后才是派生类自己的成员变量数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值