c/c++基础知识杂谈(参数缺省,函数重载, 引用)

本文探讨了C/C++编程中的函数参数缺省规则,区分全缺省和半缺省参数,以及函数重载的概念,涉及函数名与参数的匹配。同时讲解了externc关键字的作用以及左值引用的特性,包括隐式类型转换和常量引用的初始化规则。
摘要由CSDN通过智能技术生成

参数缺省: 

        缺省参数是我们在调用需要传参函数时,默认传递给函数的参数值,如果我们自主传参了则

 利用我们传入的值,没有则用默认值。根据传参时是否全部为缺省参数,我们可以将函数的传参分为全缺省参数和半缺省参数。

以上两段代码分别代表函数全缺省和半缺省,执行结果相同:

参数缺省的一些原则 :

1、在编写一个函数时,缺省的参数需要统一放在最右边,避免传参出现二义性。

2、函数显式调用时,未缺省的函数必须显式地传参,即必须传值,缺省的参数可以选择不传值,即采用函数定义时设置的默认值。

函数重载:

        在编码中,可能需要两个同名的函数,用来实现不同的功能,这便需要用到函数重载。

1、如何构成函数重载,函数重载的原则是什么?

        简单来说函数重载就是两个函数重名,但是传入参数不同,这里的不同指的是,参数类型不同,数量不同,顺序不同(没有必要同时满足)。

        以下两种情况都是构成函数重载的(参数的数量不同,参数的顺序不同):

        注意,返回值不作为是否构成函数重载的要素。即函数重载只有函数名和参数的要求。类似于下面的这种情况 是不构成函数重载的,自然不会编译通过的。

2、函数重载是怎么实现的?为什么c语言不能函数重载?

         在编译c代码和c++代码时,编译器所采取的对函数的修饰规则不同。

        在我们的源码被编译器编译时,会生成一张符号表,用来表示我们函数的虚拟地址和函数名的对应关系,已经确定链接时函数的位置。

        在linux环境下,编译c代码生成符号表时,函数名即为我们源码中的函数名,但是编译c++代码生成符号表时,函数名有一系列命名规则。举例说明,以下两段代码,一段为c,一段为c++。

        运行结果分别如下:

        当我们用指令“objdump -S 文件名”来查看对应程序的符号表,上面为c的,下面是c++的

        可以发现c++的命名是以前缀_Z 加函数名字符个数 加函数名 加每个参数类型的首字母来命名的,以此规则来命名避免函数的重复,而c的命名只有函数名,这解释了为什么c++能实现函数重载,而c却不行。 

extern "c" 关键字:

        在c++代码中有时会看到在函数定义或者声明前面写extern "c" 的写法,其作用就是告诉编译器在编译过程中,不使用c++的函数修饰规则,而使用c的函数修饰规则,因此被写有extern "c"关键字的函数是无法与其他函数构成重载的。

引用:

        这里谈左值引用。众所周知,引用就是对一个变量起一个别名,而不开辟新的空间,这是一般情况。这里谈谈一些细节。

1、我们知道一个定义一个float类型变量,如果用int类型对其进行初始化,会发生隐式类型转换,而引用是不支持这种转换的,定义一个引用时是不能用不同类型来初始化的,如下就会发生报错:

2、与上一段代码对比一下,当我们定义常量引用,用不同类型对其进行初始化,编译器不会报错,如下

这是为什么?在我们定义阶段,用一个不同类型的变量对一个引用进行初始化时,隐式类型转化会生成一个临时变量,即int类型的a发生隐式类型转换生成了一个float类型的临时变量,临时变量是具有常性的,所以可以编译通过。这也解释了我们上一段代码中的“float& rb = a”为什么会报错,因为a生成的float类型的临时变量具有常性,不能用来初始化非const变量。

        那么这个中间产生的临时变量和我们一开始的a是一个变量吗?换个问法,他们占有的是同一块空间吗?不是的生成临时变量开辟了一块新的空间,而我们的引用占有的就是这块新开辟的空间。请观察如下代码及其运行结果:

        我们的三个变量“int a"、”float rb"、”double db“分别占有不同的空间,其中rb和db占有的是a在发生隐式类型转化时生成的临时变量的空间。

3、(1)不论是常量引用还是非常量引用,都必须对其进行初始化。

     (2)常量引用的初始化可以使用常量,因为其具有常性,如下:

       (3)引用在初始化之后就不能引用别的变量了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值