函数调用 变量作用域 本章难点: 函数调用 教学内容及目标:
了解:
1.参数的传递方式的分类 2.内联函数的含义 理解:
1.变量存储特性与标识符作用域
2.函数调用机制:嵌套调用和递归调用 掌握:
1.函数参数的传递,包括:传值参数,指针参数,引用参数和函数的返回类型 2.函数指针:函数的地址,函数指针 3.重载函数的定义与使用方法
第一节 函数的定义和声明
【例3.1】实现两个数相加。 #include
int add(int ,int); //函数原型 void main() { int sum,x,y; cout<<\请输入被加数和加数:\ cin>>x>>y; sum=add(x,y); //函数调用 cout<<\}
int add(int a,int b) //函数定义 { return a+b; }
执行结果:
请输入被加数和加数: 213 625 Sum=838
函数定义的一般语法格式如下: 函数类型 函数名(参数表) {
函数体 }
1.函数类型与返回值
int sum(int a,int b) //有返回值,返回类型为整型
{
return (a+b); }
void printsum(int a,int b) //无返回值 {
cout<
函数的返回值由函数体中的return语句给出。return语句的格式为: return (表达式); 或
return 表达式; 或
return;
当程序执行到该return语句时,程序会返回到主调函数中,并带回返回值。在无返回值的函数体中可以没有return语句,遇到花括号“}”时,自动返回到主调用程序。
函数的类型要与return语句的返回值类型相同。如果类型不一致,则以函数类型为准。
2.函数的参数
int max(int a,int b) //有参数 { return a>b?a:b; }
void print(void) //无参数 {
cout<<\}
void print() //无参数 {
cout<<\ world!\}
int max(int a, b)
形参在该函数被调用时才初始化,即从主调函数获取数据。如果被调用函数不需要从调用函数那里获取数据,则该函数可为无参函数。
函数原型:
函数原型又称函数声明,用来告诉编译器函数头的相关内容。函数原型通常位于程序代码的开始处。 函数原型的语法格式为:
类型 函数名(参数列表);
参数列表的个数、顺序和指定的类型必须和函数定义中一致。在函数原型说明中也可以不给出参数名,只给出类型。例如:
int sum(int,int); //不带参数名 int fac(int a); //带参数名
第二节 函数调用
函数调用的概念:
函数调用是用一个表达式表示。 调用格式为:函数名(实参列表); 实参是用来在调用函数时对形参进行初始化的,实参与形式参数个数相同、类型一致、顺序一致。
如果在一个文件中有多个函数,一般都将主程序或主函数放在其他所有函数的前面。在函数调用前进行函数原型的说明,被调用的函数定义放在后面。通常使用函数调用的返回值来给某个变量赋值。
有返回值函数的调用格式为:
变量名=函数名(实参列表); 或
cout<<函数名(实参列表);
在任何情况下,C++能自动将变量的类型转换为与参数一致的类型,这是C++标准类型转换的一部分。任何非法的转换都会被C++编译程序检测出来。 【例3.2】编程求三个整数中最大的数。 #include
//函数定义
int max2(int a,int b) { return a>b?a:b; }
int max3(int a,int b,int c) { int m1,m2; m1=max2(a,b); m2=max2(m1,c) return m2; }
执行结果:
请输入三个数:25 36 47 最大的数是:47
函数调用的参数传递:
参数形式:数值、引用、指针 参数传递:传值、传址、引用 传值调用是利用参数传递数据最常用的方法。调用时系统先计算实参的值,再把实参的值按位置赋给对应的形式参数。本质是复制实参给形参,以后二者互不影响。 【例3.3】两整型数互换。 #include
//函数定义
void swap(int x,int y) { int t; cout<<\ t=x; x=y; y=t; cout<<\}
程序执行结果为: 10 20
function swap begin a=10 b=20 function swap end a=20 b=10 main program a=10 b=20 return
1.函数的嵌套调用
若在一个函数调用中又调用了另外一个函数,则称这样的调用过程为函数的嵌套调用。 程序执行时从主函数开始执行,遇到函数调用时,如果函数是有参函数,系统先进行实参对形参的替换,然后执行被调用函数的函数体。如果函数体中还调用了其他函数,再转入执行其他函数体。函数体执行完毕后,返回到主调函数,继续执行主调函数中的后续程序行。 3.2.3 函数的嵌套调用和递归调用 2.函数的递归调用
在调用一个函数的过程中出现直接或间接调用该函数本身,就称作函数的递归调用,这样的函数称为递归函数。编写递归函数时,必须有终止递归调用的条件 递归调用的两个阶段:
第一阶段:递推。将原问题不断分解为新的子问题,逐渐从未知向已知递推
第二阶段:回归。从已知条件出发,按照递推的逆过程,逐一求值回归,最后达到递归的开始处,结束回归阶段,完成递归调用。
第三节 变量的作用域
在函数或者类内说明的变量是局部变量。局部变量仅在定义它的函数或类内起作用,在这个范围之外不能使用这些变量。
局部变量的作用域也称为块作用域。
函数内部使用的局部变量包括形式参数和函数体内定义的变量。
函数的形式参数的作用域在函数的函数体内部。不同函数如果使用相同的参数或变量,它们仅在其所在函数体内有效,互不影响。
在函数体内定义的变量,其作用域从说明语句开始直到该函数结束为止。 全局变量:
全局变量是在函数和类外部定义的变量。全局变量的作用域从说明点开始直到文件结束。这种作用域也称为文件作用域。
全局变量一般集中在主函数之前说明。 优点:可以减少参数数量和数据传递时间。 缺点:过多的全局变量会降低程序的通用性和程序的可读性,并且全局变量在程序运行过程中始终占用内存
应尽量减少使用全局变量。
如果全局变量与函数的局部变量同名,在函数的局部变量的作用域内,同名的全局变量无效。为了在函数体内使用与局部变量同名的全局变量,应在全局变量前使用作用域作用符“::”。
【例3.6】全局变量和局部变量的使用。 #include
程序执行结果为: 局部变量 i是2.2 全局变量 i是3
在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体进行替换。
优点:加快了程序的执行速度 缺点:会增加程序代码的长度。
第四节 内联函数
内联函数必须在程序开头声明。
在C++中,除了带有循环语句、switch语句的函数不能被说明为内联函数外,都可以被说明为内联函数。
内联函数的定义形式为:
inline 类型 函数名(形式参数列表) 【例3.7】利用内联函数计算圆的面积。