当前位置: 首页 > news >正文

自己注册网站要多少钱简历电子模版免费下载

自己注册网站要多少钱,简历电子模版免费下载,网站界面设计的分类有哪几种,中外商贸网站建设转自微信公众号《阿布编程》 “我们能用C语言实现C的#xff1a;继承、成员函数、虚函数吗#xff1f;不仅可以#xff0c;而且还一摸一样#xff01;” 01 — 提出问题 说到C和C的差别#xff0c;大家很容易联想到面向对象和面向过程的差异。毕竟类#xff0c;也就是…转自微信公众号《阿布编程》 “我们能用C语言实现C的继承、成员函数、虚函数吗不仅可以而且还一摸一样” 01 — 提出问题 说到C和C的差别大家很容易联想到面向对象和面向过程的差异。毕竟类也就是class几乎是所有面向对象设计的标准配置。 当然也有同学表示不服C语言里面也有struct呀很多class能作的事情用struct也可以完成。如果真是这样的话为什么很少看见有人用C语言作面向对象的程序设计呢 02 — 基本分析 这里就让我们一起用CPU的视角从它们的实现逻辑上回答这些问题吧。打开Compiler Explorer写一段代码需要注意的是为了抵消字节对齐所产生的冗余空间针对当前的64位编译环境我们会统一把各种数据结构定义成8字节的long类型为了抵消编译器对访问权限的控制我们会把class的成员变量和成员函数统一设置成public。 这里我们先在C编译环境中定义一个简单的类A里面有两个成员变量x和y然后在C编译环境中定义一个struct B里面也有两个成员变量x和y最后分别写一个main函数分别作一下两个成员变量的写操作 图片 老规矩不用理会每条CPU指令的具体涵义我们只对比二者的差异如你所见除了变量a、b的内存地址不同外二者对应的CPU指令完全一致。 而且对象a和结构体b所占的内存空间都是16个字节正好是两个long类型的数据长度这看上去非常合理。所以我们可以确定对象a和变量b在内存上的空间分布是完全一致的 图片 03 — 继承分析 但这还远远不够因为继承才是class最显著的特征。让我们定义一个类A的派生类AA同时也照猫画虎的定义一个派生的结构体BB最后对新的成员变量z作一下写操作 图片 不出意外二者对应的CPU指令仍然是一致的。对象aa和结构体bb所占据的内存空间都同样为新增的变量z增加了8个字节的存储空间达到了24个字节 图片 因为它们在内存空间上的分布完全一致所以此时class专属的继承特性在struct身上也能窥探一二甚至还更加直接、清晰。 04 — 成员函数分析 但class的高级之处不仅在于可以继承和封装数据还可以封装方法也就是成员函数。而由于C语言的语法规则限制我们一般不能在struct内部定义成员函数也正是这个原因我们也常说struct是“面向数据”的。好了让我们为类A增加一个成员函数func 图片 你发现了吗我们虽然增加了一个成员函数func但对象a所占据的内存空间并没有变化还是2个成员变量a、b的容量大小还是只占据16个字节。其实无论在class内部定义多少个成员函数都不会影响对象a的大小和内存分布。如果这样的话成员函数跟定义在class外部的普通函数就没有本质区别。 是的让我们也为struct B也写一个“成员函数”func吧 图片 如果对比一上面2张图中的CPU指令你会发现struct B的“成员函数”func跟class A的成员函数func对应的CPU指令完全相同而且其函数的调用部分main函数对应的CPU指令也是完全相同的。 相信如果看过“CPU眼里的this指针”的话对这个结果一定不意外。所以用struct也可以实现class的成员函数和this指针且效果相同。 05 — 虚函数分析 好吧哪又怎么样呢难道你还能用struct实现虚函数吗让我们先在类A的成员函数前加上关键字virtual让它变成一个虚函数。而struct B的“成员函数”则不需要作任何调整如“CPU眼里的虚函数”所说虚函数体的实现跟普通成员函数体没有本质区别。 所以问题的关键在于我们如何为struct实现“动态绑定”的调用方式为了简化代码我们先typedef一个函数指针类型一个大写的FUNC 看过“CPU眼里的虚函数”的同学还记得虚函数的实现机制吗编译器会偷偷的为class添加一个隐形的指针变量v用来记录虚函数表的首地址。 同样的方法我们也为struct B定义虚函数表由于struct B没有可以自动调用的构造函数所以我们手动的为隐形变量v作一下虚函数表的初始化。 随后我们就可以写一个函数test1用来作struct B的虚函数调用为了和class的虚函数作对比我们也写一个函数test2用来作class A的虚函数调用 图片 如你所见虚函数的调用部分也就是函数test1和函数test2对应的CPU指令是完全相同注意哟它们可都是货真价实的动态绑定。 最后由于数组和指针常常可以混用的原因我们还可以把调用struct B的“虚函数”代码改写成数组的形式这样当有多个“虚函数”的时候我们仅仅调整一下数组的索引就可以实现不同“虚函数”的调用了 typedef long (FUNC)(struct B b); struct B{ FUNC* v; long x; long y; }; long func1(struct B* b){ return b-x; } long func2(struct B* b){ return b-y; } long func3(struct B* b){ return b-x b-y; } FUNC vfuncTable[] { func1, func2, func3 }; struct B b { .v vfuncTable }; void test(struct B* p) { p-v0;//call func1 p-v1;//call func2 p-v2;//call func3 } 如你所见仅仅通过简单的数组偏移就可以迅速切换到不同的“虚函数”并没有出现所谓的搜索、查询虚函数表的行为。这个时候你还会担心调用虚函数会大大增加系统开销吗 至此面向对象的几大特性封装、继承、虚函数我们都能用C语言中的struct重新实现一遍。如果配合类型转换我们甚至还可以实现多态或许有效的重复利用所学的C语言知识也能帮助我们快速理解C的运作原理您觉得呢 06 — 总结 排除编译器对访问权限的限制struct和class在数据结构上特别是在内存布局上面有很多相似之处。也正是这个原因我们用C语言依然可以实现诸如继承、虚函数等面向对象的效果。 所以我们也经常可以在Linux内核的文件系统、驱动框架中看到很多类似的代码。当然虽然面向对象的效果是达到了但显然没有用C的class那么简洁、优雅再加上满天飞的函数指针可读性也会差很多。 当然这里我们只讨论C语言中的struct跟class之间的差异因为C中的struct已经被强化的很厉害了甚至可以定义构造函数和析构函数已经非常接近class了。 07 — 热点问题 Q1凭什么说不能在struct的内部定义成员函数用函数指针就可以实现这样的效果呀例如下面的代码 typedef void (*PFUNC)(int a); struct B{ PFUNC* memFunc; long x; long y; }; A1不错虽然我们可以在struct内部定义一个函数指针间接的实现内部成员函数这从形式上看确实跟class的成员函数有些相似之处。但要知道这里的函数指针变量memFunc是需要占用内存的:图片现在的结构体b不仅有两个8字节的long类型变量x和y还有一个函数指针memFunc所以它所占据的内存空间从以前的16字节扩大到了24字节。而且随着成员函数的增加也将占用更多的存储空间。同时初始化这些函数指针也是一个繁琐、必须的工作这跟class实现成员函数的策略是完全不同的。 Q2如何用C语言的struct实现class中的private和protected访问属性呢 A2一般来说C语言编译器是不支持这种private和protected访问属性的。对于如private和protected的访问属性的判定是C编译器在语法分析阶段中得出的对于不合规的访问属性在这个阶段就被禁止或报错就像一行代码的末尾没有加分号一样会被编译器无情的报错不会继续生成CPU指令。 而一旦通过编译由private和protected修饰的成员变量或成员函数跟public修饰的成员变量或成员函数并无本质区别CPU对它们都一视同仁的。 Q3所以面向对象只是一种编程思想并不是一定要用C的class来实现实际上用C语言也可以实现面向对象的编程思想对吗 A3是的这是非常经典的阐述。但如果没有本文的铺垫这可能是一种很难理解的正确结论。但一旦了解底层实现这种感觉可能就会脱口而出少很多理解上的烦恼。由于编程语言和编程思想往往是你中由我我中有你所以有时候通过对细节的追踪、挖掘也能帮助我们准确理解一些抽象、奇怪的知识更好的区分出语言和思想的边界。
http://www.pierceye.com/news/243269/

相关文章:

  • 有专门下载地图做方案的网站吗家装公司报价
  • 阿里域名注册网站阿里云建站保证销售额
  • 三北防护林体系建设网站培训班学员培训心得
  • 西安百度网站排名优化友情链接代码模板
  • 网站建设怎么做网站济南做网站推广有哪些公司
  • 恩阳建设局网站南阳网站建设赛科
  • 服务器IP做网址打开网站传媒公司宣传
  • 安装Wordpress个人网站医院网站建设公司价格低
  • 万能网页编辑器南通百度seo代理
  • 关于酒店网站建设的摘要手机百度2020
  • 楚雄网站建设rewlkj自己怎么建立个人网站
  • 网站开发工程师工作描述加强门户网站建设与管理办法
  • 电商网站优化方案个人网站设计与制作代码
  • 仙居建设规划局网站asp 茶叶网站模板
  • 福州网页模板建站梦幻西如何建立网站做代练
  • 专业做毕业设计网站设计禹州市城乡建设局网站
  • 魔站网站开发手机商城官网
  • 沧州 网站建设公众号搭建第三方平台
  • 天津建设项目招投标网站唐山网站建设推广
  • 长沙h5建站手机图片网站源码
  • php网站项目无锡有网页制作公司吗
  • 做企业网站需要收费吗wordpress单主题
  • 潮州网站开发多少钱wordpress用户调用
  • 湖南响应式网站公司闸北建设机械网站
  • 图书管理系统网站开发教程北京今朝装饰设计有限公司
  • 济南咨询行业网站开发qq降龙是哪个公司开发的
  • 可以做go分析的网站网站如何做营销
  • 企业网站设计要求做公司网站的价格
  • 网站建设与管理中专专业网页设计公司营销crm系统
  • wordpress全站甘肃省住房和城乡建设厅安置局网站