第 3章 函 数
3.1 函 数 的 定 义
3.2 函 数 调 用
3.3 局部变量和全局变量
3.4 内 联 函 数
3.5 函 数 重 载
3.6 C++的系统函数
3.1 函 数 的 定 义
3.1.1 函数定义函数定义的一般语法格式如下:
函数类型 函数名 (参数表 )
{
函数体
}
函数名必须符合 C++标识符命名规则 。 函数类型规定了函数返回值的数据类型,它可以是各种数据类型,包括基本数据类型和构造数据类型,也包括指针和引用类型 。
如果函数无返回值,则该函数的数据类型为 void。
参数表指明了函数的参数个数,名称,数据类型 。 当函数有多个参数时,每个变量必须分别定义类型和名字,用逗号将多个参数分开 。 无参数时,最好用关键字 void
说明此函数无参数,也可以不提供参数,
但括弧不可以省略 。
参数表中的参数称为形式参数,简称形参 。
形参在该函数调用时才被初始化,
函数定义中的一对花括号不能省略,它用于指明函数体的开始和结束。
3.1.2 函数原型函数原型告诉编译器函数名称,函数的返回类型,函数要接收的参数个数,参数类型和参数顺序,编译器用函数原型验证函数调用 。
函数原型的说明语法格式为:
类型 函数名 ( 参数列表 ) ;
3.2 函 数 调 用
3.2.1 函数调用的概念函数调用的格式为:
函数名 ( 实参列表 )
其中,函数名是用户自定义的或是 C++提供的标准函数名 。 实参列表是由逗号分隔的若干个表达式,每个表达式的值为实参,
实参是用来在调用函数时对形参进行初始化的 。 实参与形式参数个数相同,类型一致,顺序一致 。
【 例 3.1】 实现两个数相加 。
#include <iostream.h>
int add(int,int);
void main()
{
int sum,x,y;
cout<<"请输入被加数和加数,"<<endl;
cin>>x>>y;
sum=add(x,y);
cout<<"Sumr="<<sum<<endl;
}
//函数定义
int add(int a,int b)
{
return a+b;
}
执行结果:
请输入被加数和加数,
213 625
Sum=838
Press any key to continue
3.2.2 函数调用的参数传递
C++采用以下几种方法向调用函数传递参数:传值调用,传址调用和引用调用 。
3.2.2.1 传值调用调用函数的实参用常量,变量或表达式的值,被调用函数的形参用变量 。 调用时把实参的值按位置赋给对应的形式参数,
即对形参进行初始化,然后执行函数体 。
在函数体执行过程中形式参数的变化不会影响对应实参的值 。 传值方式可以有效地防止被调用函数改变参数的原始值 。
【 例 3.2】 两整型数互换 。
#include <iostream.h>
void swap(int,int);
void main()
{
int a,b;
cin>>a>>b;
swap(a,b);
cout<<"main program a="<<a<<"\t
b="<<b<<"\n";
}
//函数定义
void swap(int a,int b)
{
int t;
cout<<"function swap begin a="<<a<<"\t
b="<<b<<"\n";
t=a;
a=b;
b=t;
cout<<"function swap end a="<<a<<"\t
b="<<b<<"\n";
}
程序执行结果为:
10 20
function swap begin a=10 b=20
function swap begin a=20 b=10
main program a=10 b=20
Press any key to continue
3.2.2.2 传址调用使用传址调用方式时,形参是指针变量,
实参数是数据的地址值,由主调程序向被调用函数传递的是指向参数的指针 。 在函数调用时,把实参数地址赋给形式参数,
形式参数和实参数都使用同一地址中的值 。
因此,形式参数的任何改变都会导致实参数值的改变 。
【 例 3.3】 两整型数互换 。
#include <iostream.h>
void swap(int *,int *);
//函数声明或函数原型
void main()
{
int a,b;
cin>>a>>b;
swap(&a,&b);
cout<<"main program a="<<a<<"\t
b="<<b<<"\n";
}
//函数定义
void swap(int *a,int *b)
{
int t;
cout<<"function swap begin
*a="<<*a<<"\t *b="<<*b<<"\n";
t=*a;
*a=*b;
*b=t;
cout<<"function swap end *a="<<*a<<"\t
*b="<<*b<<"\n";
}
程序执行结果为:
10 20
function swap begin *a=10 *b=20
function swap end *a=20 *b=10
main program a=20 b=10
Press any key to continue
3.2.2.3 引用调用引用也是一种特殊类型的变量,它不同于指针 。 引用是在程序中为一个变量取一个别名,以便在不同的情况下也能使用 。
定义引用的格式为:
数据类型 &引用名 ( 变量名 ) ;
或者数据类型 &引用名 =变量名;
其中&为引用操作符 。 一般情况下,定义引用时必须初始化 。
引用主要用来作为函数的参数和返回值的类型,将引用用作函数形参的作用与指针作为函数形参的作用是相同的,可以通过调用函数来改变实参的值 。
【 例 3.4】 通过引用调用实现两整型数互换
#include <iostream.h>
void swap(int &,int &);
void main()
{
int a,b;
cin>>a>>b;
swap(a,b);
cout<<"main program a="<<a<<"\t
b="<<b<<"\n";
}
//函数定义
void swap(int &a,int &b)
{
int t;
cout<<"function swap begin a="<<a<<"\t
b="<<b<<"\n";
t=a;
a=b;
b=t;
cout<<"function swap begin a="<<a<<"\t
b="<<b<<"\n";
}
程序执行结果为:
10 20
function swap begin a=10 b=20
function swap begin a=20 b=10
main program a=20 b=10
Press any key to continue
3.2.3 函数的嵌套调用和递归调用
3.2.3.1 函数的嵌套调用在一个函数中又调用另一个函数,则称这样的调用过程为函数的嵌套调用 。
【 例 3.5】 函数的嵌套调用 。
#include <iostream.h>
void f1();
void f2();
void f3();
int max(int,int);
void main()
{
cout<<"1 main program begin "<<endl;
int a;
f1();
a=max(2,10);
cout<<"8 max number is,"<<a<<endl;
cout<<"9 main program end "<<endl;
}
//函数 f1定义
void f1()
{
cout<<"2 function f1 begin "<<endl;
fa2();
cout<<"6 function f1 end "<<endl;
}
//function af
void f2()
{
cout<<"3 function f2 begin "<<endl;
f3();
cout<<"5 function f2 end "<<endl;
}
//function a3
void f3()
{
cout<<"4 function f3 begin "<<endl;
}
//function max
int max(int a,int b)
{
int x;
x=(a>b? a:b);
cout<<"7 function max "<<endl;
return x;
}
执行结果如下:
1 main program begin
2 function f1 begin
3 function f2 begin
4 function f3 begin
5 function f2 end
6 function f1 end
7 function max
8 max number is,10
9 main program end
Press any key to continue
3.2.3.2 函数的递归调用在调用一个函数的过程中出现直接或间接调用该函数本身,就称作函数的递归调用 。
【 例 3.6】 用递归求阶乘 。

1)!1(*
11
!
nnn
n
n
#include <iostream.h>
int fac(int n);
void main()
{
int n;
cout<<"Input a integer number:";
cin>>n;
cout<<n<<"!="<<fac(n)<<endl;
}
int fac(int n)
{
if(n==1)return 1;
else return n*fac(n-1);
}
执行结果如下:
Input a integer number:8
8!=40320
Press any key to continue
3.2.4 函数 main()的参数许多程序在运行时都允许带有命令行参数 。
所谓命令行参数是指那些跟在执行程序后面且位于操作系统所要求的命令行上的参数,其作用是把某些信息传递给程序 。 命令行的一般形式为:
命令名 参数 1 参数 2 …… 参数 n
【 例 3.8】 使用命令行参数 。
//test.cpp
#include "stdafx.h"
#include <iostream.h>
int main(int argc,char* argv[])
{
while(argc>1)
{
++argv;
cout<<*argv<<endl;
argc--;
}
return 0;
}
3.3 局部变量和全局变量
3.3.1 局部变量在函数或者类内说明的变量是局部变量 。
局部变量仅在定义它的函数或类内起作用,
在这个范围之外不能使用这些变量 。 局部变量的作用域也称为块作用域 。
函数内部使用的局部变量包括形式参数和函数体内定义的变量 。
3.3.2 全局变量全局变量是在函数和类外部定义的变量 。
全局变量的作用域从说明点开始直到文件的结束 。 这种作用域也称为文件作用域 。
【 例 3.9】 全局变量和局部变量的使用 。
#include <iostream.h>
int i=3;
void main()
{
double i=2.2;
cout<<"local variable i is "<<i<<"\n";
cout<<"glocal variable i is "<<::i<<"\n";
}
程序执行结果为:
local variable i is 2.2
glocal variable i is 3
Press any key to continue
3.4 内 联 函 数内联函数的目的是为了解决函数调用的效率问题。
内联函数的定义形式为:
inline 类型 函数名(形式参数列表);
【 例 3.10】 使用内联函数的方法,判断从键盘输入的字符是字母还是数字 。
#include <iostream.h>
inline int isnumber(char c)
{
return (c>='0'&&c<='9')? 1:0;
}
void main()
{
char c;
cout<<"Enter a character:";
cin>>c;
if(isnumber(c))
cout<<"you entered a digit\n";
else
cout<<"you entered a character\n";
}
程序执行结果为:
Enter a character:2
you entered a digit
Press any key to continue
另一种执行结果为:
Enter a character:a
you entered a character
Press any key to continue
3.5 函 数 重 载函数重载是指同一个函数名可以对应着多个不同函数的实现。
【 例 3.11】 求三个操作数之和 。
#include "iostream.h"
int sum(int,int,int);
double sum(double,double,double);
void main()
{
cout<<"Int:"<<sum(2,3,4)<<endl;
cout<<"Double:"<<sum(1.4,2.7,3.8)<<endl;
}
int sum(int a,int b,int c)
{
return a+b+c;
}
double sum(double a,double b,double c)
{
return a+b+c;
}
程序执行结果为:
Int:9
Double:7.9
Press any key to continue
【 例 3.12】 求几个操作数中的最大者 。
#include "iostream.h"
int max(int,int);
int max(int,int,int);
void main()
{
cout<<"Max2:"<<max(22,38)<<endl;
cout<<"Max3:"<<max(4,72,18)<<endl;
}
int max(int a,int b)
{
return a>b?a:b;
}
int max(int a,int b,int c)
{
return max(a,b)?max(a,b):c;
}
程序执行结果为:
Max2:38
Max3:72
Press any key to continue
3.6 C++的系统函数
C++系统将所提供的系统函数的说明分类放在不同的头文件中,即,h文件。在程序中可以使用系统函数,但是要在程序开始处说明函数所在的头文件名。
在使用系统函数时,要注意以下几点:
( 1) 不同的 C++编译系统提供的系统函数不完全相同,要了解所使用的 C++系统提供了哪些系统函数 。
( 2) 清楚所使用的系统函数的说明在哪个头文件中 。
( 3) 调用一个系统函数时,一定熟悉该函数的功能,参数的类型,参数的意义和返回值类型 。
3.6.1 常用数学函数表 3 - 1 数学函数函数 说明 举例
c e i l (x ) 将 x 取整为不小于 x 的最小整数 c e i l (8,2 )= 9,0 c e i l ( - 8,2 )= 8,0
c o s(x ) x( 弧度 ) 的余弦 c o s(0,0 )= 1,0
e x p (x ) 指数函数 e
x
e x p (2,0 )= 7,3 8 9 0 6
f a b s(x ) x 的绝对值 f a b s( - 3,2 )= 3,2
f l o o r(x ) 将 x 取整为不大于 x 的最大整数 f l o o r(8,2 )= 8,0 f l o o r( - 8,2 )= - 9,0
f m o d (x ) x / y 的浮点数余数 f m o d (1 3,6 5 7,2,3 3 3 )= 1,9 9 2
l o g (x ) x 的自然对数(底数为 e ) e x p (7,3 8 9 0 6 )= 2,0
l o g 1 0 (x ) x 的常用对数(底数为 10 ) l o g (1 0 0 )= 2,0
p o w (x,y ) x 的 y 次方 p o w (2,7 )= 1 2 8 p o w (9,,5 )= 3
sin (x ) x( 弧度 ) 的正弦 sin (0,0 )= 0
sq rt (x ) x 的平方根 sq rt (2 5 )= 5,0
t a n (x ) x( 弧度 ) 的正切 t a n (0,0 )= 0
3.6.2 字符串处理函数
3.6.2.1 字符串拷贝函数 strcpy()
该函数的功能是实现字符串复制 。
【 例 3.14】 实现字符串拷贝 。
#include "iostream.h"
#include "string.h"
void main()
{
char stra[50]="china";
char strb[]="Beijing";
cout<<stra<<'\t'<<strb<<endl;
strcpy(stra,strb);
cout<<stra<<'\t'<<strb<<endl;
}
程序执行结果为:
china Beijing
Beijing Beijing
Press any key to continue
3.6.2.2 字符串连接函数 strcat()
该函数的功能是将一个字符串连接到另外一个字符串的后面,构成包含两个字符串内容的新字符串 。
注意,在使用该函数时必须保证 str1所指向的对象能够容纳下 str1和 str2的字符,否则将出现错误 。
【 例 3.15】 实现字符串连接 。
#include "iostream.h"
#include "string.h"
void main()
{
char stra[100]= "Beijing of ";
char strb[]="china";
cout<<stra<<'\t'<<strb<<endl;
strcpy(stra,strb);
cout<<stra<<'\t'<<strb<<endl;
}
程序执行结果为:
stra:Beijing of strb:china
stra:Beijing of china strb:china
Press any key to continue
3.6.2.3 字符串比较函数 strcmp()
该函数的功能是比较两个字符串的大小 。
如果函数返回值为 0,说明两个字符串相等 。
如果函数返回值大于 0,说明第一个字符串大于第二个字符串 。 如果函数返回值小于 0,
说明第一个字符串小于第二个字符串 。
【 例 3.16】 比较两个字符串 。
#include "iostream.h"
#include "string.h"
void main()
{
char stra[80],strb[80];
int result;
cout<<"Input first string:";
cin>>stra;
cout<<"Input second string:";
cin>>strb;
result=strcmp(stra,strb);
if(result>0)
cout<<stra<<" is greater than
"<<strb<<endl;
else if(result<0)
cout<<stra<<" is less than "<<strb<<endl;
else
cout<<stra<<" is equal to "<<strb<<endl;
}
程序执行结果为:
Input first string:abcdef
Input second string:abcdfe
abcdef is less than abcdfe
Press any key to continue
再执行程序结果为:
Input first string:beijing
Input second string:Beijing
beijing is greater than Beijing
Press any key to continue
再次执行程序结果为:
Input first string:china
Input second string,china
china is equal to china
Press any key to continue
3.6.2.4 字符串长度函数 strlen()
该函数的功能是计算字符串的长度 。
【 例 3.17】 计算字符串的长度。
#include "iostream.h"
#include "string.h"
void main()
{
char stra[]="Beijing of china",strb[80]="Beijing of
china";
cout<<stra<<" length is,"<<strlen(stra)<<endl;
cout<<strb<<" length is,"<<strlen(strb)<<endl;
}
程序执行结果为:
"Beijing of china" length is,16
"Beijing of china" length is,16
Press any key to continue