首页 > 编程笔记 > C++笔记 阅读:30

C++函数的用法(非常详细)

函数是能够实现特定功能的程序模块,它可以是只有一条语句的简单函数,也可以是包含许多子函数的复杂函数。

C++ 程序的入口和出口都位于 main() 函数中。main() 函数可以调用其他函数,其他函数间也可以相互调用。main() 函数就像总工程师一样,控制着整体程序的推进和执行。

在 C++ 程序中,开发者可以调用系统内置的库函数,还可以自行定义很多函数。

C++函数的定义

一个函数应包括函数头和函数体。定义一个函数的语法格式如下:
返回值类型 函数名(参数列表){
    函数体;
}
函数头是函数的入口,包括返回值类型、函数名和形式参数列表,标志着一段函数代码的开始:
根据功能,可将函数分为字符函数、日期函数、数学函数、图形函数、内存函数等。

关于函数定义的说明如下:
1) 形式参数列表可以为空,此时表明并不需要通过函数返回某个值。例如:
int ShowMessage()
{
    int i=0;
    cout << i << endl;
    return 0;
}
上述代码中,函数 ShowMessage 为无参函数,作用是通过 cout 流输出变量 i 的值。

2) 函数名后的大括号表示函数体,在函数体内进行变量声明和添加实现语句。

3) 函数体内不能再包含其他函数的定义。

C++函数的声明

调用函数前,要先对函数进行声明。

函数定义是为了让编译器知道函数的功能,而函数声明是为了让编译器预先知道有这么一个函数(并不需要知道具体功能),以及函数的名称、参数、返回值类型等信息。

声明函数的代码和定义函数时的函数头基本一致,但末尾要添加分号“;”。

函数声明的一般形式如下:
返回值类型 函数名(参数列表);
例如,声明一个函数的代码如下:
int SetIndex(int i);
函数声明也称为函数原型,函数声明时可以省略变量名。例如,上述函数声明也可写为:
int SetIndex(int);

【实例 1】编写一个简单的函数。定义 Poem() 函数,并在主函数中调用它。注意函数声明和函数定义的用法。
#include <stdio.h>      //包含头文件
void Poem();          //声明 Poem()函数
int main()
{
    Poem();           //调用 Poem()函数
    return 0;
}
void Poem()          //定义 Poem()函数,输出“会写诗”
{
    printf("会写诗\n");
}
程序运行结果为:

会写诗

Poem() 是一个无参函数,函数功能很简单,调用后输出了“会写诗”。

C++函数的形参与实参

声明和定义函数时,函数名后面括号中的参数称为形式参数,简称形参。这些参数只是定义了类型,在实际参数传入前并没有实际意义。

调用函数的过程就是真正使用函数的过程,因此调用函数会传递一些要实际参与运算的参数给被调用函数,简称实参。

实参与形参的个数应相等,类型应一致,并按顺序对应,调用时一对一地传递数据,例如:
int function(int a, int b); // 函数声明,形参a和b

void main()
{
    function(3, 4); // 函数调用,实参3和4
    cout << "the loop end" << endl;
}

int function(int a, int b) // 函数定义,形参a和b
{
    return a + b;
}
形参与实参的区别如下:
1) 定义函数时指定的形参,在未出现函数调用前,并不占用内存中的存储单元。只有在发生函数调用时,函数的形参才被分配内存单元。在调用结束单元。只有在发生函数调用时,函数的形参才被分配内存单元。在调用结束后,其所占的内存单元将被释放。

2) 实参是确定的值。在调用时将实参的值赋给形参,如果形参是指针类型,就将地址值传递给形参。

3) 实参与形参的类型相同。

4) 实参与形参之间是单向传递,只能由实参传递给形参,而不能由形参传回给实参。

实参与形参之间存在一个分配空间和参数值传递的过程,这个过程是在函数调用时发生的,C++ 支持引用型变量,但没有值传递的过程,这将在后文讲解。

实参可以是常量、变量、数组或指针等,还可以是表达式。

C++函数的调用

函数调用发生时,会立即暂停主调函数,转而执行被调用函数中的程序段。直到被调用函数执行完毕,才会再次回到主调函数,继续执行后面的语句。

在实例 1 中,我们已经接触过了函数调用。函数调用的说明如下:
函数的调用方式有 3 种,分别是语句调用、表达式调用和函数参数调用。
1) 函数可以作为一个独立语句出现,这是最常用的函数调用方式。语句调用中,函数可以有返回值,也可以没有返回值。例如:
AddTwoNum(3,5);  //通过语句调用 AddTwoNum()函数

2) 函数调用可以出现在表达式中,此时函数必须返回一个确定的值,作为表达式运算的一部分。例如:
iResult=iNum*AddTwoNum(3,5);  //函数调用出现在表达式中,返回值参与乘法运算

3) 函数调用可以出现在函数参数中,此时函数的返回值作为实际参数使用。例如:
iResult=AddTwoNum(10,Max(3,5));  //函数调用出现在函数参数中

C++函数的返回值

返回值是函数被调用时,执行函数体中程序段后得到并返回给主调函数的值。

函数的返回值通过 return 语句返回,其一般形式如下:
return (表达式);
return 语句可将表达式的值返回给主调函数。关于返回值的说明如下:
1) 函数返回值的类型和函数定义时的类型标识符应保持一致。如果两者不一致,则以函数类型为准,自动进行类型转换。

2) 如函数值为整型,在函数定义时可以省去类型标识符。

3) 函数中允许有多个 return 语句,但每次调用只能有一个被执行,因此只能返回一个函数值。

4) 不需要返回函数值的函数,可以明确定义为“空类型”,类型标识符为 void。例如:
void ShowIndex()
{
    int index=10;
    cout << "index :" << index << endl;
}

5) 类型标识符为 void 的函数不能进行赋值运算及值传递。例如:
i= ShowIndex();  //错误,空类型函数不能进行赋值
SetIndex(ShowIndex);  //错误,空类型函数不能进行值传递

为了降低程序出错的概率,凡不要求返回值的函数都应定义为 void 类型。

C++传值调用

主调函数和被调函数之间存在着数据传递关系,也就是说,主调函数需要将实参传递给被调函数的形参,这种调用方式称为传值调用。

传值调用是函数的基本方式。需要注意的是,传值调用是单向的,只能把实参的值传递给形参,却无法把形参的值传回实参。

【实例 2】认识传值调用。在主函数中输入两个数,先调用 add() 函数,实现两个数的求和;然后判断 x 和 y 的大小,当 x 小于 y 时调用 swap() 函数,交换两个数值。程序代码如下:
#include <iostream>
using namespace std;
int add(int a, int b);       //声明 add()函数
void swap(int a, int b);    //声明 swap 函数

int main()
{
    int x, y, z;
    cout << "输入两个数" << endl;
    cin >> x;               //输入 x
    cin >> y;               //输入 y
    z = add(x, y);          //调用 add()函数,计算两个数的和,返回值赋给 z
    cout << "x+y=" << z << endl; //输出 z
    if (x < y)
        swap(x, y);        //如果 x<y
                            //调用 swap()函数,交换两个数值
    cout << "x=" << x << endl; //输出 x
    cout << "y=" << y << endl; //输出 y
}

int add(int a, int b)       //定义 add()函数,可正常传值调用
{
    int sum;
    sum = a + b;
    return sum;
}

void swap(int a, int b)     //定义 swap()函数,无法将交换后的数值传回
{
    int tmp;
    tmp = a;
    a = b;
    b = tmp;
}
程序运行结果为:

输入两个数
1 2
x+y=3
x=1
y=2

可见 x、y 进行了求和,但并未进行交换。这是为什么呢?原因就是调用函数时的值传递过程是单向的,只能把实参的值传递给形参(本质是复制了一份实参值给形参),形参的值即便发生了改变,也无法再传递回来。

add() 函数中,实参 x、y 的值传递给形参 a、b,进行加法计算后,通过 return 语句返回两数之和。swap() 函数中,实参 x 和 y 的值传递给形参 a、b,进行两数交换,但交换后的值却无法再传回给实参。

相关文章