自定义函数
c++中函数定义一般是下面的方式:
下面列出一个函数的所有组成部分:
:: tip 注意 函数名称: 这是函数的实际名称。函数名和参数列表一起构成了函数签名。
函数主体: 函数主体包含一组定义函数执行任务的语句。
返回类型: 一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void。
参数: 参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
::
函数示例
该函数有两个参数 x 和 y,会返回这两个数的和:
运行结果:
:: tip 分析
50 传给了 x,660 传给了 y,最终在函数里计算得到 710 返回到主函数给 sum 进行接收
函数名称: func
函数主体: return x + y;
返回类型: int 类型
参数: 参数 x 和 参数 y
::
函数声明
函数声明会告诉编译器函数名称及如何调用函数。
函数声明包括以下几个部分:
针对上面定义的函数 func(),以下是函数声明:
在函数声明中,参数的名称并不重要,只有参数的类型是必需的,因此下面也是有效的声明:
函数调用
创建 C++自定义函数后,就可以通过调用之来执行它。当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。
调用函数时,传递所需参数,如果函数返回一个值,则可以存储返回值。
例如上面的程序,我们把函数里面 x+y 跟 主函数传过来的 sum 都打印一下看看:
运行结果:
:: tip 分析
x+y 跟 sum 的结果是一致的
第 10 行代码中 的 func(50, 660); 即函数调用 ::
函数参数
函数参数分为 形式参数 和 实际参数
形式参数
如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数。
形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。
当调用函数时,有三种向函数传递参数的方式:
调用类型 | 描述 |
---|---|
传值调用 | 该方法把参数的实际值赋值给函数的形式参数。在这种情况下,修改函数内的形式参数对实际参数没有影响。 |
指针调用 | 该方法把参数的地址赋值给形式参数。在函数内,该地址用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。 |
引用调用 | 该方法把参数的引用赋值给形式参数。在函数内,该引用用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数 |
实际参数
即实际传给函数进行计算的数值,例如上面的程序,在主函数中传入的 50 和 660 就是实际参数
:: tip 传值调用
- 将参数以值的形式传入函数,函数内的操作,不改变原参数。
:: details 引用变量作为函数参数 示例代码
::
:: tip 引用调用
- 将参数以引用的形式传入函数,函数内的操作,会改变原参数。
:: details 引用变量作为函数参数 示例代码
::
:: details 数组变量作为函数参数 示例代码
::
局部变量和全局变量
任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问。
有以下三个地方可以声明变量:
- 在函数或块内部的局部变量
- 在所有函数外部的全局变量
- 在形式参数的函数参数定义中
我们先来认识一下局部变量、全局变量。
局部变量
在某个函数或块的内部声明的变量称为局部变量。它们只能被该函数或该代码块内部的语句使用。局部变量在函数外部是不可知的。下面是使用局部变量的实例。
- 以函数为例:
:: details 局部变量 示例代码
运行结果:
:: tip 分析 这里的 a,b,c 都是 main 函数的局部变量 ::
- 以代码块为例:
:: details 局部变量 示例代码
运行结果:
:: tip 分析 这里的 a,b,c 都是 for 循环的局部变量,出了 for 循环,这里的 a,b,c 即消亡了,若在 for 循环外面进行打印 a,b,c 的值,程序会报错;
:: warning 警告 程序报错,此时 16 行,17 行,18 行的 a,b,c 未定义;再次验证了局部变量的作用; ::
全局变量
全局变量是定义在函数外部,通常是在程序的顶部。全局变量在整个程序生命周期内都是有效的,在任意的函数内部能访问全局变量。
全局变量可以被任何函数访问。也就是说,全局变量在声明后整个程序中都是可用的。
:: details 全局变量 示例代码
运行结果:
:: tip 分析 这里的 sum 是全局变量,a,b 是 main 函数内部的局部变量,验证了全局变量在声明后整个程序中都是可用的; ::
局部变量 和 局部变量重名怎么处理?
在程序中,局部变量和全局变量的名称可以相同,但是在函数内,如果两个名字相同,会优先使用局部变量值,全局变量不会被使用。
我们来看一个例子:
:: details 全局变量 示例代码
运行结果:
:: tip 分析
可以看的出来,程序执行之后,全局变量 sum 的值是 1,局部变量 sum 的值是 30;
在 func 函数内部,打印的 sum 值是函数内部定义的 sum,而不是全局变量 sum;
::