首页 > 学院 > 开发设计 > 正文

面向对象模型一点感想

2019-11-14 08:50:24
字体:
来源:转载
供稿:网友

基础知识

1.问题

首先我们用最简单的程序去探究一下我们的问题,我们都知道结构体他的大小是根据成员变量的大小进行一个操作的,这个我们在C语言中已经得到了验证,下面我们来对类的大小进行操作。

代码

#include "iostream"using namespace std;class C1{public:	int i;	int j;	int k;PRivate:};class C2{public:	int i;	int j;	int k;	//变量和静态变量函数没有放在一块	static int m;//存储到全局的数据区域中public:	//函数是存储在代码段	int getK() const { return k; };	void setK(int val){ k = val; };};int main(){	cout << "C1 大小 = %d" << sizeof(C1) << endl;	cout << "C2 大小 = %d" << sizeof(C2) << endl;	system("pause");	return 0;}

最后我们运行可以看到都是12,通过这个我们可以知道类的普通成员属性是定义这个类大小的。然而我们看到的C2也是12但是我们前面学习了函数也是有一定大小,静态变量也是有大小的,所以我们发现为什么没有出现了,原来我们在以前学习的内存四区就晓得,静态变量它是放在静态区,而类的成员函数他是放在代码区域,ps(这里不太懂内存四区的朋友可以去查一下相关的知识)

问题2 C++编译器的调用

上面的标题没有说完整,主要是因为文字太长,C++编辑器怎么知道我是那个类的对象在调用代码区域的成员函数。下面就是关键的地方,C++编辑器是怎么对普通成员函数进行处理的

代码

#include "iostream"using namespace std;class Test{public:	Test(int a, int b){		this->a = a;		this->b = b;	};	~Test(){		cout << "我是析构函数" << endl;	};	int getA()	{		return this->a;	}private:	int a;	int b;};void main(){	Test t(1, 2);//====>t(this,1,2); ===>Test(&t,1,2)	t.getA();//===>getA(&t);	system("pause");}这里面的关键点就在定义了一个类,Test t(1,2)的时候C++编辑器在内部就给我们转换成了一个函数void test_initalize(Test* pthis,int a,int b)然后我们才能在里面使用这个方法,这样我们就确定了是那个类在调用这个方法,其实我们在看看本质还是C语言的指针作为函数的参数的应用,这个是我觉得可以用C语言替换的一些地方。

总结

1.C++类对象中的成员变量和成员函数是分开存储的,C语言中的内存四区模型他仍然是有效的!2.C++中类的普通成员函数都是隐藏一个指向当前对象的指针this。3.静态成员函数,成员变量属于类。静态成员函数与普通成员函数的区别静态成员函数不包含指向具体对象的指针。就是没有this指针。普通成员函数包含了一个指向具体对象的指针。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表