C语言实现面向对象的方式 C++中的class的运行原理

这里主要介绍下在c语言中是如何实现的面向对象。知道了c语言实现面向对象的方式,再联想下,c++中的class的运行原理是什么?
首先看一段c++的class,拿一个student类来举例子:
在头文件中,我定义一个student类:
#pragma onceclass student {public:  void setnumber(int number);  void setgrade(int grade);  void print();private:  int number;  int grade;};  
再在源文件中实现它:
#include studentpp.h#include void student::setnumber(int number) { this->number = number; }void student::setgrade(int grade) { this->grade = grade; }void student::print() { printf(studentpp number : %d, grade : %d , this->number, this->grade);}  
接下来是使用student类:
#include #include studentpp.hint main() {  student *stu1 = new student;  student *stu2 = new student;  stu1->setnumber(11);  stu2->setnumber(22);  stu1->setgrade(111);  stu2->setgrade(222);  stu1->print();  stu2->print();  delete stu1;  delete stu2;}  
再运行一下,运行结果不出所料。
有没有想过,它的底层是怎么实现的?为什么不同对象,设置了不同的number和grade,它的输出却不一样?
这个问题先放在这。等我用c语言实现一套这种方案后,估计就明白了。
首先,在头文件中定义一个c语言的结构体student:
#pragma oncetypedef struct student student;student* createstudent();void destroystudent(student* student);void setnumber(student* student, int number);void setgrade(student* student, int grade);void print(student* student);  
注意在这里使用了一个typedef,即student = struct student;
但是却没有在头文件中定义它:
struct student {  int number;  int grade;};  
我把它放在了源文件中,在源文件中定义它,再实现相关的方法。
#include student.h#include #include struct student {  int number;  int grade;};student* createstudent() {  student* self = (student*)malloc(sizeof(student));  return self;}void destroystudent(student* student) {  if (!student) return;  free((void*)student);}void setnumber(student* student, int number) {  if (!student) return;  student->number = number;}void setgrade(student* student, int grade) {  if (!student) return;  student->grade = grade;}void print(student* student) {  if (!student) return;  printf(student number : %d, grade : %d , student->number, student->grade);}  
然后使用它:
#include student.hint main() {  student* stu1 = createstudent();  student* stu2 = createstudent();  setnumber(stu1, 11);  setnumber(stu2, 22);  setgrade(stu1, 111);  setgrade(stu2, 222);  print(stu1);  print(stu2);  destroystudent(stu1);  destroystudent(stu2);}  
这是不是面向对象的原理?数据封装到了不同的指针下,不同的指针传到了相同的函数中,行为也会不同。
这时候再联想一下c++中的面向对象是不也是这个原理:
平时我们使用的:
a->print();  
其实它的原理可能是这样的:
void print(student* this) {  this->number;  this->grade;}  
只不过编译器把默认的这个this参数隐藏在内部,我们看不见而已。其实每个成员函数默认都会有一个参数,就是对象的指针,也就是this指针。到这里你应该也就明白面向对象的原理了吧。
注意在这里我使用了一个typedef,即student = struct student;
但是我却没有在头文件中定义它。
这样可以更好的隐藏student的实现,外面不知道student究竟是什么东西,只有内部知道。在头文件中对外只暴露student的指针,然后指针传到源文件中,再去解析它。
比如,我在其它地方想要得到student的大小,编译器会报错,没法使用sizeof,因为它不知道student,它只知道它是不完整的类型。而只能在源文件中使用sizeof。
这种设计是不是比c++的class更安全一些,确实安全,其实c++也可以这样实现,就是可以使用pimpl指针。
pimpl我暂时先不介绍,大家可以自己研究一下(其实历史文章中介绍过)。
大家可以思考下,怎么用c语言实现多态呢?
这里有 一个优质的c++学习圈 等你加入,来一起钻研c++吧。


一款抢答器的质疑
尼泊尔和韩国联合资助Chameliya水电项目助力尼泊尔国家电网
邬贺铨院士:工业互联网ICT的新挑战
云计算与5G等新兴技术融合,推动传统企业数字化转型
关于GD32F350R8的单导联心电采集系统的介绍和分析
C语言实现面向对象的方式 C++中的class的运行原理
柔性供料器CCD视觉上料 柔性振动盘anyfeeder
深入了解开关电源BUCK电路各个元器件
惠普推Cortana智能扬声器 是其Windows 10 PC的配套设备
诺基亚财报让微软心寒 双方尚未找到互补契合点
铜线拉丝机生产的常见问题与产生原因
基于LabVIEW开发平台的功率放大器测试与分析系统的设计
中国联通与IBM认知物联网联合成立了创新中心
LCD驱动电路分析 绿、红、蓝三个节点波形产生
【Infineon XMC 应用笔记】 XMC1000 and XMC4000 CCU8 捕获比较单元 Part 1
设计师:只有与众不同才能让用户印象深刻,车更是如此
LG的新专利文件显示了全新的笔记本电脑设计
小米mix2什么时候上市?小米mix2发布时间倒计时:外观、参数汇总,全面屏很惊艳值得期待
杭州城市物流无人机发展顺利 全球首个商业化城市空中配送网初见雏形
动荡的2018年对于机器人资本市场的影响几何?