0

自定义函数

c++中函数定义一般是下面的方式:

函数返回类型  函数名( 形式参数表列 )
{
    函数体语句;
}

下面列出一个函数的所有组成部分:

:: tip 注意 函数名称: 这是函数的实际名称。函数名和参数列表一起构成了函数签名。

函数主体: 函数主体包含一组定义函数执行任务的语句。

返回类型: 一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void。

参数: 参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。

::

函数示例

该函数有两个参数 x 和 y,会返回这两个数的和:

#include<iostream>
using namespace std;
int func(int x, int y)  //定义函数,传入参数x, y
{
    return x+y;  //返回x+y;
}
int main()
{
    int sum = func(50, 660);
    cout << sum << endl;
    return 0;
}

运行结果:

710

:: tip 分析

50 传给了 x,660 传给了 y,最终在函数里计算得到 710 返回到主函数给 sum 进行接收

函数名称: func

函数主体: return x + y;

返回类型: int 类型

参数: 参数 x 和 参数 y

::

函数声明

函数声明会告诉编译器函数名称及如何调用函数。

函数声明包括以下几个部分:

函数返回类型  函数名( 形式参数表列 )  ;

针对上面定义的函数 func(),以下是函数声明:

int func(int x, int y) ;

在函数声明中,参数的名称并不重要,只有参数的类型是必需的,因此下面也是有效的声明:

int func(int , int ) ;

函数调用

创建 C++自定义函数后,就可以通过调用之来执行它。当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。

调用函数时,传递所需参数,如果函数返回一个值,则可以存储返回值。

例如上面的程序,我们把函数里面 x+y 跟 主函数传过来的 sum 都打印一下看看:

#include<iostream>
using namespace std;
int func(int x, int y)  //定义函数,传入参数x, y
{
    cout << "func函数内 x+y 的值是:"  << x + y << endl;
    return x+y;  //返回x+y;
}
int main()
{
    int sum = func(50, 660);
    cout << "主函数内 sum 的值是:"  << sum << endl;
    return 0;
}

运行结果:

func函数内 x+y 的值是:710
主函数内 sum 的值是:710

:: tip 分析

x+y 跟 sum 的结果是一致的
第 10 行代码中 的 func(50, 660); 即函数调用 ::

函数参数

函数参数分为 形式参数 和 实际参数

形式参数

如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数。

形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。

当调用函数时,有三种向函数传递参数的方式:

调用类型描述
传值调用该方法把参数的实际值赋值给函数的形式参数。在这种情况下,修改函数内的形式参数对实际参数没有影响。
指针调用该方法把参数的地址赋值给形式参数。在函数内,该地址用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。
引用调用该方法把参数的引用赋值给形式参数。在函数内,该引用用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数

实际参数

即实际传给函数进行计算的数值,例如上面的程序,在主函数中传入的 50 和 660 就是实际参数

    int sum = func(50, 660);
    cout << "主函数内 sum 的值是:"  << sum << endl;

:: tip 传值调用

  • 将参数以值的形式传入函数,函数内的操作,不改变原参数。

:: details 引用变量作为函数参数 示例代码

#include<bits/stdc++.h>
using namespace std;
void fun(int a){
    a = 1;
}
int main()
{
    int a = 10;
    fun(a);
    cout << "a的值是:" << a << endl; //a的值还是10,没有被改变
    return 0;
}

::

:: tip 引用调用

  • 将参数以引用的形式传入函数,函数内的操作,会改变原参数。

:: details 引用变量作为函数参数 示例代码

#include<bits/stdc++.h>
using namespace std;
void fun(int& a){
    a = 1;
}
int main()
{
    int a = 10;
    fun(a);
    cout << "a的值是:" << a << endl; //a的值是1,被改变了
    return 0;
}

::

:: details 数组变量作为函数参数 示例代码

#include<bits/stdc++.h>
using namespace std;
void fun(int a[]){
    a[0] = 1;
}
int main()
{
    int a[3] = {3,2,1};
    fun(a);
    cout << "a[0]的值是:" << a[0] << endl;
    //a的值是1,被改变了。因为数组传入的就是引用地址。
    return 0;
}

::

局部变量和全局变量

任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问。
有以下三个地方可以声明变量:

  • 在函数或块内部的局部变量
  • 在所有函数外部的全局变量
  • 在形式参数的函数参数定义中

我们先来认识一下局部变量全局变量

局部变量

在某个函数或块的内部声明的变量称为局部变量。它们只能被该函数或该代码块内部的语句使用。局部变量在函数外部是不可知的。下面是使用局部变量的实例。

  • 以函数为例:

:: details 局部变量 示例代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a = 10;
    int b = 20;
    int c = 30;
    cout << "在main函数内:" << endl;
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    cout << "c = " << c << endl;
    return 0;
}

运行结果:

在main函数内:
a = 10
b = 20
c = 30

:: tip 分析 这里的 a,b,c 都是 main 函数的局部变量 ::

  • 以代码块为例:

:: details 局部变量 示例代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    for(int i=1;i<=1;i++){
        int a = 100;
        int b = 200;
        int c = 300;
        cout << "在for循环内:" << endl;
        cout << "a = " << a << endl;
        cout << "b = " << b << endl;
        cout << "c = " << c << endl;
    }
    return 0;
}

运行结果:

在for循环内:
a = 100
b = 200
c = 300

:: tip 分析 这里的 a,b,c 都是 for 循环的局部变量,出了 for 循环,这里的 a,b,c 即消亡了,若在 for 循环外面进行打印 a,b,c 的值,程序会报错;

#include<iostream>
#include<string.h>
using namespace std;
int main()
{
    for(int i=1;i<=1;i++){
        int a = 100;
        int b = 200;
        int c = 300;
        cout << "在for循环内:" << endl;
        cout << "a = " << a << endl;
        cout << "b = " << b << endl;
        cout << "c = " << c << endl;
    }
    cout << "在main函数内:" << endl;
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    cout << "c = " << c << endl;
    return 0;
}

:: warning 警告 程序报错,此时 16 行,17 行,18 行的 a,b,c 未定义;再次验证了局部变量的作用; ::

全局变量

全局变量是定义在函数外部,通常是在程序的顶部。全局变量在整个程序生命周期内都是有效的,在任意的函数内部能访问全局变量。

全局变量可以被任何函数访问。也就是说,全局变量在声明后整个程序中都是可用的。

:: details 全局变量 示例代码

#include<bits/stdc++.h>
using namespace std;
int sum;
int main()
{
    int a = 10;
    int b = 20;
    sum = a + b;
    cout << "sum = " << sum << endl;
    return 0;
}

运行结果:

sum = 30

:: tip 分析 这里的 sum 是全局变量,a,b 是 main 函数内部的局部变量,验证了全局变量在声明后整个程序中都是可用的; ::

局部变量 和 局部变量重名怎么处理?

在程序中,局部变量和全局变量的名称可以相同,但是在函数内,如果两个名字相同,会优先使用局部变量值,全局变量不会被使用。

我们来看一个例子:

:: details 全局变量 示例代码

#include<bits/stdc++.h>
using namespace std;
int sum = 1;
void func(int x,int y)
{
    int sum = 0;
    sum = x + y;
    cout << "func函数内:sum = " << sum << endl;
}
int main()
{
    func(10,20);
    cout << "main函数内: " << endl;
    cout << "sum = " << sum << endl;
    return 0;
}

运行结果:

func函数内:sum = 30
main函数内:
sum = 1

:: tip 分析 可以看的出来,程序执行之后,全局变量 sum 的值是 1,局部变量 sum 的值是 30;
在 func 函数内部,打印的 sum 值是函数内部定义的 sum,而不是全局变量 sum; ::

上一章
system
下一章
data structures