面向对象模型一点感想

    xiaoxiao2021-03-26  26

    基础知识

    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指针。 普通成员函数包含了一个指向具体对象的指针。
    转载请注明原文地址: https://ju.6miu.com/read-662517.html

    最新回复(0)