初写 -----> C++ ---> 入门_02

奋斗吧
奋斗吧
擅长邻域:未填写

标签: 初写 -----> C++ ---> 入门_02 C/C++博客 51CTO博客

2023-04-30 18:24:07 213浏览

初写 -----> C++ ---> 入门_02,各位朋友们,欢迎来到本期博文!本期继续推进C++入门环节!----------------------------------------------------------------------------------------------------------------------1.缺省参数------>缺省参数是声明或定义函数时为函数指定一个缺省值。在调用该函

各位朋友们,欢迎来到本期博文 !本期继续推进 C++入门环节 !

----------------------------------------------------------------------------------------------------------------------

1. 缺省参数

------> 缺省参数 是声明或定义函数时 为函数指定一个缺省值 。在调用该函数时, 如果没有指定实参则采用该形参的缺省值,否则使用指定的实参 !

初写 -----> C++ ---> 入门_02_引用特性大总结

显然函数传参时候,若没有指定实参,则使用参数默认值 !

(1)缺省参数分类 :>  全缺省   半缺省

i. 半缺省参数必须从右往左依次给出,不能间隔着给 

---> a. 半缺省

初写 -----> C++ ---> 入门_02_引用做返回值具有一定的危险性_02

---> b. 全缺省

初写 -----> C++ ---> 入门_02_引用_03


j.  缺省参数不能函数声明和定义中同时出现

初写 -----> C++ ---> 入门_02_引用特性大总结_04

以上是本期 缺省参数的讲解 !下面开始转战,函数重载 !

2.  函数重载

何为 函数重载 ?

------>函数重载是函数一种的特殊情况, C++ 允许同一个作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或者 类型 或者 类型顺序不同,常用来处理实现 功能类似 数据类型不同的问题 !

(1)函数重载  ---> 参数类型不同

初写 -----> C++ ---> 入门_02_引用做返回值具有一定的危险性_05

(2)函数重载  ---> 参数个数不同

初写 -----> C++ ---> 入门_02_函数重载_06


(3)函数重载  ---> 参数类型顺序不同

初写 -----> C++ ---> 入门_02_引用_07

请注意 :> 引用类型 必须同 引用实体 是相同类型 !

3.  引用

------> 引用不是新定义一个变量,而是给已经存在的变量取一个别名(稍后解释,何为别名),编译器不会为引用变量开辟内存空间,该变量 和 该变量的引用变量 公用同一块空间 !

初写 -----> C++ ---> 入门_02_缺省参数_08

------> 何为别名 ?---> 其实别名就是 “外号”,其本质还是原先的变量,只不过是换了一个叫法而已 !!

虽然 更换了变量叫法,但是 “引用” 的引入,完成了许多变革 !而且 引用 运用在一些场景中更加便捷 !至于那些变革,未来的一段很长时间,会慢慢进行讲解 !

下面 继续推进,模块 :>

(1)引用特性

---> a.  引用必须初始化

初写 -----> C++ ---> 入门_02_缺省参数_09


初写 -----> C++ ---> 入门_02_函数重载_10

---> c. 引用过程,权限可以平移或缩小 

初写 -----> C++ ---> 入门_02_缺省参数_11

--> 引用权限不能扩大 

(1)同种类型引用

初写 -----> C++ ---> 入门_02_函数重载_12

(2)不同种类型引用

初写 -----> C++ ---> 入门_02_引用_13

至于上述修改为何成功,值得探讨 !有意思的点,可是来了 !?

--> 现附上示意图:>

初写 -----> C++ ---> 入门_02_引用_14

--> 下面是 不涉及权限放大的拷贝过程 

初写 -----> C++ ---> 入门_02_引用_15

--> 下面再来看一组,函数返回值中权限的探讨

初写 -----> C++ ---> 入门_02_函数重载_16

至于修改成功的原因,还是直接上手示意图,会有更好的观感,如下 :>

初写 -----> C++ ---> 入门_02_引用特性大总结_17


小总结:传值返回,会生成临时变量,具有常性;而引用返回,不会生成临时变量 。

以上,涉及到,临时变量的生成 ! 那么该如何证明,确是生成了临时变量呢?

现 附上证明过程 :>

初写 -----> C++ ---> 入门_02_引用_18

---> d.  引用一旦引用了一个实体,就不能再引用其他实体 !否则,会出现 “重定义:多次初始化” 的字样 !

初写 -----> C++ ---> 入门_02_函数重载_19

---> e.  引用过程,无论是传参,还是做返回值 ,都不会开辟临时空间 !因此,减少了拷贝,提升了效率 !


---> f. 引用做返回值,可以读取返回值,进而能够进行修改 !

--->(fm)使用引用, 对静态顺序表进行修改

初写 -----> C++ ---> 入门_02_引用特性大总结_20

--->(fn)不用引用, 对静态顺序表进行修改

初写 -----> C++ ---> 入门_02_函数重载_21

经发现,运用引用之后,程序极大地简化了!其实,使用引用进行修改返回值的做法,是相当香的 !可以说,等用习惯了引用之后,或许就不再想用指针了 !?

------> 特性大总结 :>

a.  引用必须初始化 ;

b. 一个变量可以有多个引用 ;

c. 引用过程,权限可以平移或缩小 ;

d.  引用一旦引用了一个实体,就不能再引用其他实体 !否则,会出现 “重定义:多次初始化” 的字样 ;

e.  引用过程,无论是传参,还是做返回值 ,都不会开辟临时空间 !因此,减少了拷贝,提升了效率 ;

f. 引用做返回值,可以读取返回值,进而能够进行修改 !

(2)常引用

初写 -----> C++ ---> 入门_02_引用做返回值具有一定的危险性_22

(3)使用场景

-----> a.  做参数

初写 -----> C++ ---> 入门_02_引用做返回值具有一定的危险性_23


-----> b.  做返回值

引用做返回值是相当危险的,会存在值覆盖的情况,如下所示 :>

初写 -----> C++ ---> 入门_02_缺省参数_24


为了方便大家理解,特附上流程过程示意图:>

初写 -----> C++ ---> 入门_02_引用_25


由于篇幅视图限制,特再一次 论述一遍,上述蓝色方框内的解析 !

------> 解析 :>

Count 函数运行结束后,该函数对应的栈区空间就被回收了,即变量 c 就没有了意义 !

在 main()函数中, ret 引用 Count 函数返回值。实际上,引用的是一块已经释放过的空间 !

为了,加强论述的严谨性与科学性,现附上调试流程示意图 :>

初写 -----> C++ ---> 入门_02_引用做返回值具有一定的危险性_26


此后,第二次调用 Count()函数 !虽然空间被回收了,但是空间本身还在那里,只是暂时放在那儿,不先用而已 

而 ret 引用的 c 位置会被修改成 数值 8,从而 ret 值就改变了 !

现附上调试流程示意图 :>

初写 -----> C++ ---> 入门_02_引用特性大总结_27

以上就是,论述与调试证明过程了 !现对以上内容略作简要总结 :>

初写 -----> C++ ---> 入门_02_函数重载_28


上述流程讲解,用引用做返回值很危险。其实,上述的底层逻辑,类似野指针的访问 !

现推出,正确示范样例,用不在栈区内的静态区,就可以了 !

如下 :>

初写 -----> C++ ---> 入门_02_引用做返回值具有一定的危险性_29


上述静态区的运用,不会再出现 警告 “返回局部变量或临时变量的地址 ” !

另外,特别讲述一下,静态区运行结果 :>

初写 -----> C++ ---> 入门_02_引用特性大总结_30


其实,上述结果 很容易理解 !由于静态区的引入,第一次调用 Count 函数结束后,处于静态区的 变量 c 就不能再被修改了 !“static” 具有常量固定属性,这在 C 语言学习阶段就提到过了 !而 静态区, 不在栈区内 !

至此,引用 做返回值就讲解完成了 !其实,引用涵盖的知识点,还是比较广的,也有些深度 !

下一期,将对 传值 与 引用的效率进行比较 !希望本期内容,对大家有所帮助 ! 感谢阅读 !!??


好博客就要一起分享哦!分享海报

此处可发布评论

评论(0展开评论

暂无评论,快来写一下吧

展开评论

您可能感兴趣的博客

客服QQ 1913284695