news 2026/4/25 20:16:31

尝试以底层角度,理解c++代码书写逻辑

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
尝试以底层角度,理解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

下篇文章再见

谢谢各位读者的耐心观看!!! 以后会慢慢改进文章编写能力的!!

祝大家事业有成!!!!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 20:15:44

深入剖析STM32软件PWM呼吸灯:从原理到代码实战

1. 呼吸灯背后的科学原理 第一次看到呼吸灯效果时,我完全被这种柔和的光线变化迷住了。就像人类呼吸时胸腔的起伏,LED灯从暗到亮再到暗的循环过程,给人一种"活"的错觉。这种效果在手机通知灯、电脑电源指示灯上很常见,但…

作者头像 李华
网站建设 2026/4/11 12:11:36

QuickBMS深度解析:脚本驱动的通用文件格式处理引擎

QuickBMS深度解析:脚本驱动的通用文件格式处理引擎 【免费下载链接】QuickBMS QuickBMS by aluigi - Github Mirror 项目地址: https://gitcode.com/gh_mirrors/qui/QuickBMS 在游戏逆向工程和资源提取领域,我们经常面临一个核心挑战&#xff1a…

作者头像 李华
网站建设 2026/4/11 12:10:30

Music Tag Web:5步打造完美音乐库的免费开源解决方案

Music Tag Web:5步打造完美音乐库的免费开源解决方案 【免费下载链接】music-tag-web 音乐标签编辑器,可编辑本地音乐文件的元数据(Editable local music file metadata.) 项目地址: https://gitcode.com/gh_mirrors/mu/music-t…

作者头像 李华
网站建设 2026/4/11 12:08:45

【金仓数据库实战】CentOS7下KingbaseES V9高可用集群搭建:从零到生产级部署

1. 环境准备与系统配置 在开始部署KingbaseES V9高可用集群之前,我们需要确保所有节点都满足基本硬件和软件要求。我曾在多个生产环境中部署过这套系统,发现前期准备工作的细致程度直接决定了后期集群的稳定性。 1.1 硬件与操作系统要求 对于生产环境&am…

作者头像 李华