C++函数的用法(非常详细)
函数是能够实现特定功能的程序模块,它可以是只有一条语句的简单函数,也可以是包含许多子函数的复杂函数。
C++ 程序的入口和出口都位于 main() 函数中。main() 函数可以调用其他函数,其他函数间也可以相互调用。main() 函数就像总工程师一样,控制着整体程序的推进和执行。
在 C++ 程序中,开发者可以调用系统内置的库函数,还可以自行定义很多函数。
根据功能,可将函数分为字符函数、日期函数、数学函数、图形函数、内存函数等。
关于函数定义的说明如下:
1) 形式参数列表可以为空,此时表明并不需要通过函数返回某个值。例如:
2) 函数名后的大括号表示函数体,在函数体内进行变量声明和添加实现语句。
3) 函数体内不能再包含其他函数的定义。
函数定义是为了让编译器知道函数的功能,而函数声明是为了让编译器预先知道有这么一个函数(并不需要知道具体功能),以及函数的名称、参数、返回值类型等信息。
声明函数的代码和定义函数时的函数头基本一致,但末尾要添加分号“;”。
函数声明的一般形式如下:
【实例 1】编写一个简单的函数。定义 Poem() 函数,并在主函数中调用它。注意函数声明和函数定义的用法。
调用函数的过程就是真正使用函数的过程,因此调用函数会传递一些要实际参与运算的参数给被调用函数,简称实参。
实参与形参的个数应相等,类型应一致,并按顺序对应,调用时一对一地传递数据,例如:
1) 定义函数时指定的形参,在未出现函数调用前,并不占用内存中的存储单元。只有在发生函数调用时,函数的形参才被分配内存单元。在调用结束单元。只有在发生函数调用时,函数的形参才被分配内存单元。在调用结束后,其所占的内存单元将被释放。
2) 实参是确定的值。在调用时将实参的值赋给形参,如果形参是指针类型,就将地址值传递给形参。
3) 实参与形参的类型相同。
4) 实参与形参之间是单向传递,只能由实参传递给形参,而不能由形参传回给实参。
实参与形参之间存在一个分配空间和参数值传递的过程,这个过程是在函数调用时发生的,C++ 支持引用型变量,但没有值传递的过程,这将在后文讲解。
实参可以是常量、变量、数组或指针等,还可以是表达式。
在实例 1 中,我们已经接触过了函数调用。函数调用的说明如下:
函数的调用方式有 3 种,分别是语句调用、表达式调用和函数参数调用。
1) 函数可以作为一个独立语句出现,这是最常用的函数调用方式。语句调用中,函数可以有返回值,也可以没有返回值。例如:
2) 函数调用可以出现在表达式中,此时函数必须返回一个确定的值,作为表达式运算的一部分。例如:
3) 函数调用可以出现在函数参数中,此时函数的返回值作为实际参数使用。例如:
函数的返回值通过 return 语句返回,其一般形式如下:
1) 函数返回值的类型和函数定义时的类型标识符应保持一致。如果两者不一致,则以函数类型为准,自动进行类型转换。
2) 如函数值为整型,在函数定义时可以省去类型标识符。
3) 函数中允许有多个 return 语句,但每次调用只能有一个被执行,因此只能返回一个函数值。
4) 不需要返回函数值的函数,可以明确定义为“空类型”,类型标识符为 void。例如:
5) 类型标识符为 void 的函数不能进行赋值运算及值传递。例如:
传值调用是函数的基本方式。需要注意的是,传值调用是单向的,只能把实参的值传递给形参,却无法把形参的值传回实参。
【实例 2】认识传值调用。在主函数中输入两个数,先调用 add() 函数,实现两个数的求和;然后判断 x 和 y 的大小,当 x 小于 y 时调用 swap() 函数,交换两个数值。程序代码如下:
add() 函数中,实参 x、y 的值传递给形参 a、b,进行加法计算后,通过 return 语句返回两数之和。swap() 函数中,实参 x 和 y 的值传递给形参 a、b,进行两数交换,但交换后的值却无法再传回给实参。
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 中,我们已经接触过了函数调用。函数调用的说明如下:
- 被调用的函数必须是已经存在的函数(库函数或用户自定义函数);
- 如果使用库函数,需在主函数中使用 #include 预编译指令引入对应的头文件;
- 如果使用用户自定义函数,需在主调函数中声明被调用函数。
函数的调用方式有 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
add() 函数中,实参 x、y 的值传递给形参 a、b,进行加法计算后,通过 return 语句返回两数之和。swap() 函数中,实参 x 和 y 的值传递给形参 a、b,进行两数交换,但交换后的值却无法再传回给实参。