当前栏目
C语言如何实现面向对象
这里主要介绍下在C语言中是如何实现的面向对象。知道了C语言实现面向对象的方式,再联想下,C++中的class的运行原理是什么?
首先看一段C++的class,拿一个Student类来举例子:
在头文件中,我定义一个Student类:
再在源文件中实现它:
接下来是使用Student类:
再运行一下,运行结果不出所料。
有没有想过,它的底层是怎么实现的?为什么不同对象,设置了不同的number和grade,它的输出却不一样?
这个问题先放在这。等我用C语言实现一套这种方案后,估计就明白了。
首先,在头文件中定义一个C语言的结构体Student:
注意在这里使用了一个typedef,即Student = struct Student;
但是却没有在头文件中定义它:
我把它放在了源文件中,在源文件中定义它,再实现相关的方法。
然后使用它:
这是不是面向对象的原理?数据封装到了不同的指针下,不同的指针传到了相同的函数中,行为也会不同。
这时候再联想一下C++中的面向对象是不也是这个原理:
平时我们使用的:
其实它的原理可能是这样的:
只不过编译器把默认的这个this参数隐藏在内部,我们看不见而已。其实每个成员函数默认都会有一个参数,就是对象的指针,也就是this指针。到这里你应该也就明白面向对象的原理了吧。
注意在这里我使用了一个typedef,即Student = struct Student;
但是我却没有在头文件中定义它。
这样可以更好的隐藏Student的实现,外面不知道Student究竟是什么东西,只有内部知道。在头文件中对外只暴露Student的指针,然后指针传到源文件中,再去解析它。
比如,我在其它地方想要得到Student的大小,编译器会报错,没法使用sizeof,因为它不知道Student,它只知道它是不完整的类型。而只能在源文件中使用sizeof。
这种设计是不是比C++的class更安全一些,确实安全,其实C++也可以这样实现,就是可以使用pImpl指针。
pimpl我暂时先不介绍,大家可以自己研究一下(其实历史文章中介绍过)。
大家可以思考下,怎么用C语言实现多态呢?
相关文章
- 正则表达式语法-JavaScript中的正则表达式详解
- js 数组去除重复数据-5 个提升你 JS 编码水平的实例
- js 数组去除重复数据-Vue.js开发移动端经验总结
- React.js基础知识总结一
- React.js简单轮播图组件封装
- React.js基础知识 函数组件和类组件(二)
- js for in for of 的区别
- js正则表达式基础知识
- parcel打包Vue.js零配置
- javascript学习之Pointfree是什么
- javascript学习之函数组合
- javascript中柯里化
- javascript的纯函数,纯函数怎么定义
- javascript必须要知道的闭包,怎么调试闭包
- javascript中函数试编程范式,为什么要学习函数式编程
- nodejs之npm切换源
- javascript异步编程之generator(生成器函数)与asnyc/await语法糖
- JavaScript的异步编程之Promise
- javascript编程单线程之异步模式Asynchronous
- javascript编程单线程之同步模式