先来看一个问题:类的空指针能不能调用类的成员函数呢?
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21class 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等)与放在类外面定义的类型除了作用域不同外没有本质区别。
因此,构成对象本身的只有数据,任何成员函数都不隶属于任何一个对象,非静态成员函数与对象的关系就是绑定,绑定的中介就是这个指针。
复制代码
1
2
3
4
5
6//p的属性是A的类型,p本身就就包含了除普通成员变量外的所有东西,有无具体参数只是相当于给this指针赋值 //普通成员数据 才是对象所拥有的,其他的都是p的 A *p=NULL;//NULL就相当于给this指针赋值 p->func_1();//因为func_1函数中并没有调用具体对象用this指针调用的数据成员 //所以不会出错 //若是函数中调用了this指针指向的数据成员,则会程序崩溃
参考资料:“高质量程序设计指南c ++ / c语言”林锐编
最后
以上就是阳光学姐最近收集整理的关于c++的内存映像的全部内容,更多相关c++内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复