函数的定义与函数的声明
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.2.1 函数调用的格式 2.2.2 函数调用的过程 2.2.3 函数调用时的参数传递 2.2.4 带默认形参值的函数 2.2.5 函数的递归调用 2.2.6 函数的嵌套调用
返回首页
2.2.1 函数调用的格式
在C++中,除了主函数main由系统自动调用外, 其他函数都是由主函数直接或间接调用的。函数 调用的语法格式为:
图2-1 main()函数与被调用函数的关系示意图 返回本节
2.2.3 函数调用时的参数传递
1.按值传递 2.地址传递 3.引用传递
1.按值传递
例2-3:按值传递。 #include "iostream.h" void swap(int,int); void main() {
int a=3,b=4; cout<<"a="<<a<<",b="<<b<<endl; swap(a,b); cout<<"a="<<a<<",b="<<b<<endl; } void swap(int x,int y) { int t=x; x=y; y=t; } 此程序的运行结果为: a=3,b=4 a=3,b=4
return 0; else return -1; } void main() { int n; cout<<"Please input n:"<<endl; cin>>n; cout<<"\nthe result:"<<func(n)<<endl; }
此程序的运行结果为: Please input n: 2↙
(3)虽然函数声明与函数头相似,但是它们之 间也有细微的差别。
(4)函数声明中不能只写形参名而不写类型。
(5)函数声明中除了当函数返回值类型为int或 char时函数类型可以省略外,一般情况下不能省 略函数类型。
(6)由于调用时是按参数顺序进行传递的,所 以函数声明中形参的次序也不要写错。
例: func1(int a, int b) {
… … } 也可写成: func1(a,b) int a; int b; { … … }
例2-1:给出以下程序的运行结果。 #include "iostream.h" int func(int n) { if(n>0)
return 1; else if(n==0)
2.地址传递
例2-4:地址传递。 #include "iostream.h" void swap(int *,int *); void main() {
int a=3,b=4; cout<<"a="<<a<<",b="<<b<<endl; swap(&a,&b); cout<<"a="<<a<<",b="<<b<<endl; } void swap(int *x,int *y) { int t=*x; *x=*y; *y=t; } 此程序的运行结果为: a=3,b=4 a=4,b=3
return(-1); }
else if(n<=1) return(1);
else return (n*f(n-1));
} void main() { long f(int n);
int n; cout<<"please input n:"<<endl; cin>>n; cout<<"n!="<<f(n)<<endl; } 此程序的运行结果为: please input n: 5↙ n!=120
} int leijia(int a, int b, int c) {
cout<<"a="<<a<<"\tb="<<b<<"\tc="<<c<<endl; return(a+b+c); } 此程序的运行结果为: a=5 b=6 c=7 he=18
a=5 b=6 c=3 he=14
a=5 b=2 c=3 he=10
<函数名>是用户为函数所起的名字,它是一个标 识符,应符合C++标识符的一般命名规则,用户 通过使用这个函数名和实参表可以调用该函数。
<参数表>又称形式参数表,它包含有任意多个 (含0个,即没有)参数说明项,当多于一个时 其前后两个参数说明项之间必须用逗号分开。
<函数体>是一条复合语句,它以左花括号开始, 到右花括号结束,中间为一条或若干条C++语句。
函数名(实际参数表); 调用函数时的参数称为实际参数或实参。调用函
数时,被调函数名后跟实参表。
对一个函数的调用方式可以有多种,常见的有下列两种方 式:
方式一:这种方式是将函数调用单独作为一条表达式语句 使用,只要求函数完成一定的操作,而不使用它的返回值。 如果该函数调用带有返回值,则这个值将会自动丢失。例 如:
3.引用传递
例2-5:引用传递。 #include "iostream.h" void swap(int &,int &); void main() {
int a=3,b=4; cout<<"a="<<a<<",b="<<b<<endl; swap(a,b); cout<<"a="<<a<<",b="<<b<<endl; } void swap(int &x,int &y) { int t=x; x=y; y=t; } 此程序的运行结果为: a=3,b=4 a=4,b=3
(7)并不是对所有被调函数都要作声明。
例如:设有一函数的定义为: double func1(double a, int b, float c) {
函数体 } 正确完整的函数声明应为: double func1(double x, int y, float z);
//末尾要加上分号
返回本节
2.2 函数的调用
<类型名> <函数名> ([<参数表>]) <函数体> 例如: int max(int a,int b) {
int t; if(a>b) t=a; else t=b; return t; }
<类型名>为系统或用户已定义的一种数据类型, 它是函数执行过程中通过return语句要求返回的 值的类型,又称为该函数的类型。
关于函数声明的几点说明:
(1)一个完整的程序中,函数的定义和函数的 调用可以在同一个程序文件中,也可以处在不同 的程序文件中,但必须确保函数声明语句与函数 调用表达式出现在同一个文件中,并且函数声明 语句出现在前,函数的调用出现在后。
(2)当一个函数要被一个文件中的多个函数调 用时,可以将该函数声明写在所有函数之前。
} 此程序的运行结果为: Please input x y z: 364↙ The max is:6
返回本节
2.2.2 函数调用的过程
当一个C++程序执行时,系统首先将其代码装入 内存中的代码区,然后自动调用主函数。在主函 数的执行过程中,如果遇到某个函数调用语句, 则将函数调用语句执行后的位置(称为返回地址) 保存起来,作为从被调用函数返回时的地址,同 时,保存当前函数的现场。然后开始执行被调用 函数。当被调用函数执行结束或遇到return语句 结束,则首先将返回值赋给调用函数本身,然后 恢复调用之前的现场,并从调用前保存的返回地 址处开始继续向下执行程序。
max(3,5);
方式二:这种方式是对于具有返回值的函数来说,把函数 调用语句看作语句一部分,使用函数的返回值参与相应的 运算或执行相应的操作,如把它赋值给一个变量,用它参 与运算,把它输出到屏幕上显示出来,作为判断条件,作 为另一个函数的实参等等。
例2-2:给出以下程序的运行结果。 #include<iostream.h> int max(int a,int b,int c) {
第2章 函数
2.1 函数的定义与函数的声明 2.2 函数的调用 2.3 内联函数 2.4 存储类型说明与作用域
2.1 函数的定义与函数的声明
2.1.1 函数的定义 2.1.2 函数的声明
返回首页
2.1.1 函数的定义
C++中的每一个函数都是从四个方面来进行定义:类 型、函数名、形式参数表和函数体。定义一个函数 的语法格式为:
//func1()函数调用func2()函数,间接递归 //func2()函数调用func1()函数,间接递归
例2-10:求n的阶乘。 #include "iostream.h" long f(int n) { if(n<0)
{ cout<<"Negative argument to fact!"<<endl;
int x(5),y(6),z(7); int he; he=leijia(x,y,z); cout<<"he="<<he<<endl; cout<<endl; he=leijia(x,y); cout<<"he="<<he<<endl; cout<<endl;
he=leijia(x); cout<<"he="<<he<<endl; cout<<endl;
1.递归的概念
例2-8:直接递归调用。 int f(x) int x; { int y,z;
… z=f(y); 调用自身,直接递归 … return(z*x); }
wk.baidu.com//f() 函 数
例2-9:间接递归调用。 int func1(int a) {
int b; … b=func2(a+1); … return(b); } int func2(int c) { int d; … d=func1(c-1); … return(d); }
the result:1 Please input n: -2 ↙
the result:-1
返回本节
2.1.2 函数的声明
函数声明也称函数模型(或函数原型)。在主调 函数中,如果要调用另一个函数,则须在本函数 或本文件中的开头将要被调用的函数事先作一声 明。声明函数,就是告诉编译器函数的返回类型、 名称和形参表构成,以便编译系统对函数的调用 进行检查。
2.默认参数的声明规定
注意:当函数既有声明又有定义时,默认参数在 函数声明中定义,函数定义中不允许使用默认参 数。
3.默认参数的顺序规定
例2-7:给出以下程序的运行结果。 #include <iostream.h> int leijia(int a, int b=2, int c=3); void main() {
返回本节
2.2.4 带默认形参值的函数
1.默认参数的含义 默认参数就是在调用函数时可以省略实参。
2.默认参数的声明规定 3.默认参数的顺序规定 4.默认值的限定
1.默认参数的含义
例如: void delay(int loops); ...... void delay(int loops) {
4.默认值的限定
例如: int a=1; int fun(int); 下面调用是合法的: int g(int x=fun(a)); //默认参数是函数调用。 而下面调用是不合法的:
void fun( ) {
int i; void g(int x=i); }
返回本节
2.2.5 函数的递归调用
1.递归的概念 2.函数递归调用机制 3.递归的实现 4.递归的评价与消除递归
if (loops==0) return; for (int i=0;i<loops;i++);
}
例2-6:给出以下程序的运行结果。 #include <iostream.h> int func1(int a=4); void main() {
int b; b=func1(); cout<<”b=”<<b<<endl; } int func1(int a) { return a+1; } 此程序的运行结果为: b=5
2.函数递归调用机制
3.递归的实现
(1)需有完成函数任务的语句(递推公式)。 (2)一个能结束递归的语句。 (3)一个递归调用语句。 (4)先测试,后递归调用。
int t; t=a; if(b>t) t=b; if(c>t) t=c; return t; } void main() { int x,y,z;
cout<<"Please input x y z:"<<endl; cin>>x>>y>>z; int m=max(x,y,z); cout<<"The max is:"<<m<<endl;
返回首页
2.2.1 函数调用的格式
在C++中,除了主函数main由系统自动调用外, 其他函数都是由主函数直接或间接调用的。函数 调用的语法格式为:
图2-1 main()函数与被调用函数的关系示意图 返回本节
2.2.3 函数调用时的参数传递
1.按值传递 2.地址传递 3.引用传递
1.按值传递
例2-3:按值传递。 #include "iostream.h" void swap(int,int); void main() {
int a=3,b=4; cout<<"a="<<a<<",b="<<b<<endl; swap(a,b); cout<<"a="<<a<<",b="<<b<<endl; } void swap(int x,int y) { int t=x; x=y; y=t; } 此程序的运行结果为: a=3,b=4 a=3,b=4
return 0; else return -1; } void main() { int n; cout<<"Please input n:"<<endl; cin>>n; cout<<"\nthe result:"<<func(n)<<endl; }
此程序的运行结果为: Please input n: 2↙
(3)虽然函数声明与函数头相似,但是它们之 间也有细微的差别。
(4)函数声明中不能只写形参名而不写类型。
(5)函数声明中除了当函数返回值类型为int或 char时函数类型可以省略外,一般情况下不能省 略函数类型。
(6)由于调用时是按参数顺序进行传递的,所 以函数声明中形参的次序也不要写错。
例: func1(int a, int b) {
… … } 也可写成: func1(a,b) int a; int b; { … … }
例2-1:给出以下程序的运行结果。 #include "iostream.h" int func(int n) { if(n>0)
return 1; else if(n==0)
2.地址传递
例2-4:地址传递。 #include "iostream.h" void swap(int *,int *); void main() {
int a=3,b=4; cout<<"a="<<a<<",b="<<b<<endl; swap(&a,&b); cout<<"a="<<a<<",b="<<b<<endl; } void swap(int *x,int *y) { int t=*x; *x=*y; *y=t; } 此程序的运行结果为: a=3,b=4 a=4,b=3
return(-1); }
else if(n<=1) return(1);
else return (n*f(n-1));
} void main() { long f(int n);
int n; cout<<"please input n:"<<endl; cin>>n; cout<<"n!="<<f(n)<<endl; } 此程序的运行结果为: please input n: 5↙ n!=120
} int leijia(int a, int b, int c) {
cout<<"a="<<a<<"\tb="<<b<<"\tc="<<c<<endl; return(a+b+c); } 此程序的运行结果为: a=5 b=6 c=7 he=18
a=5 b=6 c=3 he=14
a=5 b=2 c=3 he=10
<函数名>是用户为函数所起的名字,它是一个标 识符,应符合C++标识符的一般命名规则,用户 通过使用这个函数名和实参表可以调用该函数。
<参数表>又称形式参数表,它包含有任意多个 (含0个,即没有)参数说明项,当多于一个时 其前后两个参数说明项之间必须用逗号分开。
<函数体>是一条复合语句,它以左花括号开始, 到右花括号结束,中间为一条或若干条C++语句。
函数名(实际参数表); 调用函数时的参数称为实际参数或实参。调用函
数时,被调函数名后跟实参表。
对一个函数的调用方式可以有多种,常见的有下列两种方 式:
方式一:这种方式是将函数调用单独作为一条表达式语句 使用,只要求函数完成一定的操作,而不使用它的返回值。 如果该函数调用带有返回值,则这个值将会自动丢失。例 如:
3.引用传递
例2-5:引用传递。 #include "iostream.h" void swap(int &,int &); void main() {
int a=3,b=4; cout<<"a="<<a<<",b="<<b<<endl; swap(a,b); cout<<"a="<<a<<",b="<<b<<endl; } void swap(int &x,int &y) { int t=x; x=y; y=t; } 此程序的运行结果为: a=3,b=4 a=4,b=3
(7)并不是对所有被调函数都要作声明。
例如:设有一函数的定义为: double func1(double a, int b, float c) {
函数体 } 正确完整的函数声明应为: double func1(double x, int y, float z);
//末尾要加上分号
返回本节
2.2 函数的调用
<类型名> <函数名> ([<参数表>]) <函数体> 例如: int max(int a,int b) {
int t; if(a>b) t=a; else t=b; return t; }
<类型名>为系统或用户已定义的一种数据类型, 它是函数执行过程中通过return语句要求返回的 值的类型,又称为该函数的类型。
关于函数声明的几点说明:
(1)一个完整的程序中,函数的定义和函数的 调用可以在同一个程序文件中,也可以处在不同 的程序文件中,但必须确保函数声明语句与函数 调用表达式出现在同一个文件中,并且函数声明 语句出现在前,函数的调用出现在后。
(2)当一个函数要被一个文件中的多个函数调 用时,可以将该函数声明写在所有函数之前。
} 此程序的运行结果为: Please input x y z: 364↙ The max is:6
返回本节
2.2.2 函数调用的过程
当一个C++程序执行时,系统首先将其代码装入 内存中的代码区,然后自动调用主函数。在主函 数的执行过程中,如果遇到某个函数调用语句, 则将函数调用语句执行后的位置(称为返回地址) 保存起来,作为从被调用函数返回时的地址,同 时,保存当前函数的现场。然后开始执行被调用 函数。当被调用函数执行结束或遇到return语句 结束,则首先将返回值赋给调用函数本身,然后 恢复调用之前的现场,并从调用前保存的返回地 址处开始继续向下执行程序。
max(3,5);
方式二:这种方式是对于具有返回值的函数来说,把函数 调用语句看作语句一部分,使用函数的返回值参与相应的 运算或执行相应的操作,如把它赋值给一个变量,用它参 与运算,把它输出到屏幕上显示出来,作为判断条件,作 为另一个函数的实参等等。
例2-2:给出以下程序的运行结果。 #include<iostream.h> int max(int a,int b,int c) {
第2章 函数
2.1 函数的定义与函数的声明 2.2 函数的调用 2.3 内联函数 2.4 存储类型说明与作用域
2.1 函数的定义与函数的声明
2.1.1 函数的定义 2.1.2 函数的声明
返回首页
2.1.1 函数的定义
C++中的每一个函数都是从四个方面来进行定义:类 型、函数名、形式参数表和函数体。定义一个函数 的语法格式为:
//func1()函数调用func2()函数,间接递归 //func2()函数调用func1()函数,间接递归
例2-10:求n的阶乘。 #include "iostream.h" long f(int n) { if(n<0)
{ cout<<"Negative argument to fact!"<<endl;
int x(5),y(6),z(7); int he; he=leijia(x,y,z); cout<<"he="<<he<<endl; cout<<endl; he=leijia(x,y); cout<<"he="<<he<<endl; cout<<endl;
he=leijia(x); cout<<"he="<<he<<endl; cout<<endl;
1.递归的概念
例2-8:直接递归调用。 int f(x) int x; { int y,z;
… z=f(y); 调用自身,直接递归 … return(z*x); }
wk.baidu.com//f() 函 数
例2-9:间接递归调用。 int func1(int a) {
int b; … b=func2(a+1); … return(b); } int func2(int c) { int d; … d=func1(c-1); … return(d); }
the result:1 Please input n: -2 ↙
the result:-1
返回本节
2.1.2 函数的声明
函数声明也称函数模型(或函数原型)。在主调 函数中,如果要调用另一个函数,则须在本函数 或本文件中的开头将要被调用的函数事先作一声 明。声明函数,就是告诉编译器函数的返回类型、 名称和形参表构成,以便编译系统对函数的调用 进行检查。
2.默认参数的声明规定
注意:当函数既有声明又有定义时,默认参数在 函数声明中定义,函数定义中不允许使用默认参 数。
3.默认参数的顺序规定
例2-7:给出以下程序的运行结果。 #include <iostream.h> int leijia(int a, int b=2, int c=3); void main() {
返回本节
2.2.4 带默认形参值的函数
1.默认参数的含义 默认参数就是在调用函数时可以省略实参。
2.默认参数的声明规定 3.默认参数的顺序规定 4.默认值的限定
1.默认参数的含义
例如: void delay(int loops); ...... void delay(int loops) {
4.默认值的限定
例如: int a=1; int fun(int); 下面调用是合法的: int g(int x=fun(a)); //默认参数是函数调用。 而下面调用是不合法的:
void fun( ) {
int i; void g(int x=i); }
返回本节
2.2.5 函数的递归调用
1.递归的概念 2.函数递归调用机制 3.递归的实现 4.递归的评价与消除递归
if (loops==0) return; for (int i=0;i<loops;i++);
}
例2-6:给出以下程序的运行结果。 #include <iostream.h> int func1(int a=4); void main() {
int b; b=func1(); cout<<”b=”<<b<<endl; } int func1(int a) { return a+1; } 此程序的运行结果为: b=5
2.函数递归调用机制
3.递归的实现
(1)需有完成函数任务的语句(递推公式)。 (2)一个能结束递归的语句。 (3)一个递归调用语句。 (4)先测试,后递归调用。
int t; t=a; if(b>t) t=b; if(c>t) t=c; return t; } void main() { int x,y,z;
cout<<"Please input x y z:"<<endl; cin>>x>>y>>z; int m=max(x,y,z); cout<<"The max is:"<<m<<endl;