大家好,现在是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
下篇文章再见
谢谢各位读者的耐心观看!!! 以后会慢慢改进文章编写能力的!!
祝大家事业有成!!!!