尝试以底层角度,理解c++代码书写逻辑
大家好现在是4月10号下午6点7分又来写blog了废话不多说我来写写要将内容的大纲一由c转为c时写代码时出现的困惑二实验性理论开发之路三理论哈哈就三点还是要写很多内容的一由c转为c时写代码时出现的困惑不知道大家写c代码的时候有没有一种无力感以前c语言写代码都是随心所欲感觉没有什么限制到了c有了想法但是在实现代码的时候有一种无法下笔的感觉哈哈我也是在刚开始接触c时脑袋一片乱码尤其是什么sss(这个是namespace)::func()让我茫然 额………为啥要后来我才慢慢弄懂了为什么但是还是不放心为什么呢学习类和对象之时有时要又是又不要很烦啊以至于后面的模板string类愈发让我想要弄到它的核心好了进入第二个章节二实验性理论开发之路前提1、相同域才能够在代码处调用2、不同域语法允许以声明编译器从哪里找到检查3、编译器负责检查代码是否合法链接器直接将变量函数等等以项目大表来找函数/变量物理地址进行替换4、编译器完成链接器才开始工作5、声明/定义所写的域会一并给到项目大表的地址成为该地址的特征是重载函数的底层实现6、编译期结束也就是编译器工作完成才生成了完整的项目大表链接器才能够查表进行替换7、只有声明与定义结合才会生成有效的地址存入项目大表。所以函数/变量的声明与定义要在同一域编译器会检查8、一个cpp就是一个文件域9、编译器先检查字符是否拼写正确然后以函数入口开始按代码一行行检查10、调用有了声明编译器才会通过链接器才能够去查项目大表 声明对于编译器是很重要的代表我确实有这个东西这样链接期时链接器才有把握在项目大表里面有这个声明的实例的物理地址 声明有了编译器允许链接器才会在大表找到吧想要调用namespace空间的函数/变量怎么办简单 命名空间名字函数名/变量名这代表着向编译器声明是调用这个域的并且编译期的编译器只看域编译器以域来衡量一切由命名空间域-----类域类域为什么有public和private就是防止通过 声明 调用private函数或变量class mystring{public:void func();private:}大家想一想怎么调用func()?依据前面理论就mystring::func();但是c语法规定非static成员函数要传入this指针所以this-mystring::func(); a.mystring::func();你们可以自己去试试编译通过编译器没有检查出生命问题但是主流编译器同样更推荐怎么写a.func()这样跟精简 但是失去了底层编译器自动加上了不信我尝试看汇编语言也是这么写的call mystring::func() 函数地址后面再传入this指针即可传this指针和声明域是独立的但是c语法将它们并为一起所以调用成员函数可以直接写为a.func();后面依据我的观察与实现仅有调用成员函数和语法糖 不用写声明域好了现在来到声明与定义这么才能合法的写函数/变量声明和定义声明与定义结合我就不多赘述了讲讲声明与定义分离成员函数的声明与定义分离class string{public:void func();//声明}void string::func(){//定义}就这样定义声明了是string这个类域里面的所以声明与定义是同一域相互结合生成有效物理地址好了我的理论也差不多结束了三理论1、编译期时编译器先检查整体的拼写后以main函数入口逐行检查代码2、对于调用编译器会优先去找它的声明找到了就抛给链接期的链接器它应该能够找到其声明与定义结合还带有域属性的物理地址替换3、不同域不能够直接调用调用代码域与声明域不同就是编译器找不到声明在哪里要配合声明我调用的是哪个域的函数/变量要不然编译器找不到声明在哪里编译器就是要找到其来源声明剩下交给链接器4、对于语法糖和成员函数调用编译器会在汇编语言处自动加上域声明能够找到声明所以不用自己手动加上域声明欧克了这篇文章完成了现在是晚上7点40下篇文章再见谢谢各位读者的耐心观看 以后会慢慢改进文章编写能力的祝大家事业有成
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2506114.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!