这里主要介绍下在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年对于机器人资本市场的影响几何?