C++ 函数入门摘录

函数是一个命名的程序代码块,是程序完成其操作的一种功能单位。在程序设计中,有许多算法是通用的,例如求一个数的平方根,求一个三角函数等,经常会将这些算法定义为一个函数,这样在程序中需要这些算法的地方就可以直接使用(通过函数调用)它们了。
虽然 C 和 C++ 的库函数已经提供了丰富的功能,但很多时候程序员还是需要根据具体问题的需求定义自己的函数。函数需要先定义再使用(函数调用)。

函数的定义

函数定义的一般格式为:

<返回值类型>  <函数名>(<参数列表>)
    <函数体>

<返回值类型>、<函数名>及<参数列表>构成了函数头。
<返回值类型>说明函数返回值的数据类型,也称为函数的返回类型。
它可以是任一基本数据类型或用户自定义的数据类型;如果无返回值,则用关键字 void 说明。默认的返回类型是 int,即若未指定返回类型,则返回类型是 int 。
<函数名>是程序员为该函数指定的名字,函数名需要遵守标识符命名规定。
<参数列表>指明函数的参数的个数、名称和类型,函数定义中的参数称为形式参数,简称形参。
当有多个形式参数时,用逗号分隔。如果函数没有形参,参数列表为空,函数名后面的圆括号不能少,这时也可在括号中加上关键字 void,表示这是一个无参函数。
<函数体>描述函数的功能,即函数所完成的具体操作,它由一系列说明语句和执行语句组成。
函数体实际上是一个复合语句,花括号不能少,它指明函数体的开始和结束。函数执行时,如同执行一个复合语句一样,顺序执行函数体,直到遇到 return 语句或者遇到表示函数体结束的那个右花括号为止,函数执行完毕后,返回调用程序继续执行。
例如,下面的程序定义了一个名为 max 的函数,该函数有3个形式参数 a、 b 和 c,类型均为 int,返回值也是 int 类型。函数体由一个变量说明语句、一个赋值语句和一个返回语句构成。函数的功能是求 a 、b 和 c 中最大的值:

int max(int a, int b, int c)
{
    
    
    int m;
    m = (a > b) ? a : b;
    return (m > c) ? m : c;
}

注意

1.所有函数的定义是并列的、平行的,在一个函数定义内部不允许定义另外一个函数。但可以对别的函数进行调用或作引用说明;
2.函数定义中声明的所有变量都是局部变量,只在声明语句所处的程序块中有效。大多数函数都有一组参数,函数定义时指明了每个形式参数的名字、类型,函数调用时提供的实在参数要与形式参数一一对应(函数调用时需要进行参数传递,将实参的值一个个传给对应的形参)。函数的形式参数也可视为局部变量,在函数体范围内有效;
3.函数可以有返回值,也可以没有返回值;
4.函数没有返回值时,返回类型必须用关键字 void 说明。这类函数的函数体内没有 return 语句或 return 语句中无表达式。当函数执行到 return 语句时,程序返回到调用该函数的地方;如果函数体没有 return 语句,当执行完函数体最后的语句后,程序再返回到调用该函数的地方;
5.函数有返回值时,必须指明返回值类型(不能是 void ),此时函数体必须包含带表达式的 return 语句。表达式的值将返回给调用程序,该值的数据类型必须与返回值类型一致;
6.函数体可有多个 return 语句。调用函数执行时,只要遇到一个 return 语句,就马上忽略剩余代码,立刻返回到调用程序;
7.函数需要先定义后使用,但函数的相互调用关系很难保证所有函数都是先定义后使用的。这时就需要先声明函数原型了。

声明函数

为了让 main 程序(或者其他准备调用函数的程序)知道函数的相关信息,需要在调用程序的前面,以“函数原型”的方式对被调用的函数进行声明。
在 C 和 C++ 中,函数原型的一般形式为:

<返回值类型>  <函数名>(<参数列表>);

函数原型形式上只是比函数头多了一个分号,函数原型参数列表中形参的名称可以省略。函数原型告诉编译器后面将会定义这么一个函数,其函数名、返回值类型、参数列表分别是什么,便于编译器检查函数调用的正确性。
例如,前面函数 max 的函数原型可以为:

int  max(int , int , int);

建议:如果一个文件中定义多个函数时,把主函数之外的其它函数的函数原型都放在文件中所有函数定义的前面,这样所有函数调用就都符合“先声明,后使用”的原则了。

参数传值

传值是指值的复制,即把实参的值传递给形参,实参和形参是不同的变量,有各自独立的存储空间,因此函数被调用执行时,只能访问形式参数对应的内存单元,不能访问或修改实在参数的值。
下面的 swap 函数试图交换两参数的值。

#include <iostream>
using namespace std;
// 交换 x 和 y 的值
void swap(int x,int y)
{
    
    
    int temp = x;
    x = y;
    y = temp;
}
int main()
{
    
    
    int a = 10, b = 20;
    // 调用函数,试图交换
    swap(a, b);
    cout << "a:" << a << " b:" << b << endl;
    return 0;
}

程序的运行结果显示 a 和 b 的值并没被交换。
这是因为 main 函数在执行swap(a,b)时,是把实在参数 a 和 b 的值传给了 swap 中形式参数 x 和 y,swap 函数中交换的也只是形参 x 和 y 这两个局部变量的值,跟 a 、b 两个变量无关,当 swap 函数执行完后,就返回到 main 函数的调用语句处,继续向下执行,输出 a 、b 的值,因此依然是原来的10和20。

参数传引用

传引用是指调用函数时,把对实参变量的引用传给形式参数,即将实参变量的地址存放到对应的形参的形式单元中。
当程序转入到被调用函数后,在执行函数体过程中,对形式参数的任何引用或赋值都被处理成对相应形式单元的间接访问,即根据形式单元中存放的实参变量的地址找到实参单元,对形式参数的引用或赋值被处理成对该实参单元的访问。
也就是说,对形参的访问实际上就是对实参的访问,可以通过修改实参的方式把数据传出被调用函数。
提示:传引用要求实在参数必须是变量。
修改上面的 swap 函数,实现真正的交换。

#include <iostream>
using namespace std;
// 交换x和y的值
void swap(int &x, int &y)
{
    
    
    int temp = x;
    x = y;
    y = temp;
}
int main()
{
    
    
    int a = 10, b = 20;
    // 调用函数,试图交换
    swap(a, b);
    cout << "a:" << a << " b:" << b << endl;
    return 0;
}

输出结果为:a:20 b:10
程序中函数 swap 的参数定义为int &x,int &y,其中 x 、y 前面的 & 为引用符号,表示 x 、y 是引用变量,调用该函数时,对应参数的传递采用传引用方式。这时函数 swap 中修改 x 和 y 的值,实际上就是在修改实参 a 和 b 的值。

扫描二维码关注公众号,回复: 12500283 查看本文章

猜你喜欢

转载自blog.csdn.net/interestingddd/article/details/113818204
今日推荐