一、前言
C++对象模型可以概括为一下两个部分:
- 语言中支持面向对象程序设计的部分,主要涉及如构造函数、析构函数、虚函数、继承(单继承、多继承、虚继承)、多态等等。
- 对于各种支持的底层实现机制:在C语言中,“ 数据 ” 和 “ 处理数据的操作(函数) ”是分开来声明的,也就是说,语言本身并没有支持“数据和函数”之间的关联性。在c++中,通过抽象数据类型(abstract data type,ADT),在类中定义数据和函数,类实现数据和函数直接绑定。
总的来说,在c++类中有两种成员数据:static、nonstatic;三种成员函数:static、nonstatic、virtual。
二、基础知识
2.1 c++中类和对象的关系例子抛转
探讨下面例子中:C1、c2、s1、s2所占的字节数分别是多少。
#include<iostream>
using namespace std;
class C1 //12
{
public:
int i, j, k;//4*3=12
private:
};
class c2 //12
{
public:
//函数的入口地址也没有放到里面
//方法对应代码,放在代码区
int getK() const { return k; }
void setK(int val) { k = val; }
private:
int i, j, k; //属性放到栈里面,入栈
static int m; //没有放到类里面
};
struct s1//12
{
int i, j, k;
};
struct s2//12
{
int i, j, k;
static int m; //没有放到结构体里面
};
void playobject() {
cout << "c1: " << sizeof(C1) << endl;
cout << "c2: " << sizeof(c2) << endl;
cout << "s1: " << sizeof(s1) << endl;
cout << "s2: " << sizeof(s2) << endl;
}
2.1.2 例子结果
他们所占的字节数均是12!!通过直行结果,我们可以得出如下结论:
- c++类对象中的成员变量和成员函数是分开存储的!
- 成员变量:
- 普通成员变量:存储于对象中,与struct变量有相同的内存布局和字节对齐方式。
- 静态成员变量:存储于全局数据区中
- 成员函数存储于代码区中
- 成员变量:
2.1.3 进一步思考
当很多对象共用一块代码的时候,代码是如何具体区分对象的呢?
如:int getK() const { return k; },代码是如何区分具体时间 obj1、obj2、obj3对象的 k 值呢?
非常重要,下面这张图:
结论:
- c++类对象中的成员变量和成员函数是分开存储的。C语言中的内存四区模型仍然有效!
- c++中类的普通成员函数都隐式的包含了一个指向当前对象的this指针
- 静态成员函数、成员变量属于类。
- 静态成员函数与普通成员函数的区别:静态成员函数不包括指向具体对象的指针!普通成员函数包含一个指向具体对象的指针!
内存四区模型补充: