C++_复习08(面向对象模型的探讨及内存四区)

一、前言

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 值呢?

非常重要,下面这张图:

结论: 

  1. c++类对象中的成员变量和成员函数是分开存储的。C语言中的内存四区模型仍然有效!
  2. c++中类的普通成员函数都隐式的包含了一个指向当前对象的this指针
  3. 静态成员函数、成员变量属于类。
  4. 静态成员函数与普通成员函数的区别:静态成员函数不包括指向具体对象的指针!普通成员函数包含一个指向具体对象的指针!

内存四区模型补充:

 

发布了27 篇原创文章 · 获赞 3 · 访问量 3338

猜你喜欢

转载自blog.csdn.net/weixin_40977054/article/details/102580634
今日推荐