c++的内存映像

先来看一个问题:类的空指针能不能调用类的成员函数呢?

class A{
public:
	A(){}
	~A(){}
	void func_1(){cout<<"调用成功!"<<endl;}
	void func_2(){}
	void func_3(int x){}
	static int s_func(int x){}
protected:
	A(const A& copy){}
	A& operator=(const A& other){}
private:
	int _a;
	int _b;
	static int _c;
}
void main()
{
	A *p=NULL;//A类型的空指针能不能调用成员函数呢?
	p->func_1();//?答案是可以的额,这就是传说中的 静态绑定
}

?为什么会有这种情况呢接下来我们看看C ++的对象内存映像:

下图是A的对象的内存布局

A这种基本的c ++对象模型有下述几个规则:

  • 非静态数据成员被放在每一个对象体内作为对象专有的数据成员(每个对象体内只包含属于自己的非静态数据
  • 静态数据成员被提取出来放在程序的静态数据区内被该类所有对象共享,仅仅存在这一份。
  • 静态和非静态函数都被放在程序的代码段中,并被该类所有对象共享,所以每一个成员函数仅仅存在一份代码实体
  • 类内嵌套定义的各种类型(typedef,class,struct,union,enum等)与放在类外面定义的类型除了作用域不同外没有本质区别。

因此,构成对象本身的只有数据,任何成员函数都不隶属于任何一个对象,非静态成员函数与对象的关系就是绑定,绑定的中介就是这个指针

//p的属性是A的类型,p本身就就包含了除普通成员变量外的所有东西,有无具体参数只是相当于给this指针赋值
//普通成员数据 才是对象所拥有的,其他的都是p的
A *p=NULL;//NULL就相当于给this指针赋值
p->func_1();//因为func_1函数中并没有调用具体对象用this指针调用的数据成员
            //所以不会出错
            //若是函数中调用了this指针指向的数据成员,则会程序崩溃

参考资料:“高质量程序设计指南c ++ / c语言”林锐编

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值