C++语言程序设计 C++语言程序设计 第五章 函数 第十一组 C++语言程序设计
“ 目录 C++语言程序设计 基本知识 编程技能 刨根问底 函数概述 函数定义 递归函数 变量的存储类型和生存期 函数调用 内联函数 全局变量与局部变量 结构化程序设计 递归函数 内联函数 重载函数 带默认参数值的函数 变量的存储类型和生存期 函数调用的执行机制 参数的传递机制 C++语言程序设计
基本知识 a C++语言程序设计
5.3 函数的调用 函数调用的三种形式 C++语言程序设计 函数语句 函数表达式 函数参数 函数语句形式: 函数名(实参数表); 5.3 函数的调用 函数调用的三种形式 函数语句 函数语句形式: 函数名(实参数表); DispColor(color); 函数表达式 函数调用出现在表达式中,形式:函数名(实际参数表) x=max(a,b); y=sqrt(x); 此时函数要使用return语句向主调函数返回一个确定的值,参与它所在的表达式的运算。 float max(float a,float b) { return a>=b?a:b; } 函数参数 函数参数调用方式是将函数调用写在另一次函数调用的实际参数位置。 例如: m=max(a, b, max(c, d, e)); C++语言程序设计
5.3 函数的调用 实际参数表可简称为实参表,是按与被调函数形式参数表一一对应的格式组织的参数表,即参数的类型、个数和排列顺序必须与被调函数声明的形式参数表严格一致。 实际参数表的各实际参数以逗号间隔,实际参数可以是常量、变量或表达式,变量和表达式必须具有确定值。 如果被调函数无形式参数,则实参表也是空的。 例: 计算y=kx+b的函数 float func(int k,int b,float x) { return k*x+b; } void main() { int k,b; float x,y; cin>>k>>b>>x; y=func(k,b,x); C++语言程序设计
5.4 全局变量与局部变量 根据变量定义的位置 作用域 局部变量(在函数内部定义的变量、函数的形参) 5.4 全局变量与局部变量 根据变量定义的位置 局部变量(在函数内部定义的变量、函数的形参) 全局变量(在函数外部定义的变量为全局变量) 作用域 由于变量定义的位置不同,所以变量起作用的范围也不同。把程序中一个标识符起作用的范围称为其作用域。 C++语言程序设计
局部变量包括在函数体内定义的变量和函数的形式参数,它们的作用域就在函数体内,只能在本函数内使用,不能被其它函数直接访问。 5.4 全局变量与局部变量 局部变量包括在函数体内定义的变量和函数的形式参数,它们的作用域就在函数体内,只能在本函数内使用,不能被其它函数直接访问。 #include <iostream> using namespace std; int fun1(int x, int y); int fun2(int x, int y); void main() { int a,b; cout<<"input a,b:" cin>>a>>b; cout<<fun1(a,b) <<endl; cout <<fun2(a,b) <<endl; } int fun1(int x, int y) { int n; n=x*x+y*y; return n; } int fun2(int x, int y) { int m; m=x*x-y*y; return m; C++语言程序设计
局部变量能够随其所在的函数被调用而被分配内存空间,也随其所在的函数调用结束而消失(释放内存空间),所以使用这种局部变量能够提高内存利用率。 5.4 全局变量与局部变量 局部变量能够随其所在的函数被调用而被分配内存空间,也随其所在的函数调用结束而消失(释放内存空间),所以使用这种局部变量能够提高内存利用率。 由于局部变量只能被其所在的函数访问,所以这种变量的数据安全性好(不能被其它函数直接读写)。局部变量在我们实际编程中使用频率最高。 C++语言程序设计
一个C++的源文件(.cpp)可以由多个函数组成,可以在函数外部定义变量,即全局变量。 5.4 全局变量与局部变量 一个C++的源文件(.cpp)可以由多个函数组成,可以在函数外部定义变量,即全局变量。 全局变量能够被位于其定义位置之后的所有函数(属于本源文件的)共用。即全局变量起作用的范围是从它定义的位置开始至源文件结束。 全局变量的作用域是整个源文件。 全局变量在程序执行的整个过程中,始终位于全局数据区内固定的内存单元;如果程序没有初始化全局变量,系统会将其初始化为0。 C++语言程序设计
5.4 全局变量与局部变量 C++语言程序设计 //全局变量使用示例 #include<iostream> 5.4 全局变量与局部变量 //全局变量使用示例 #include<iostream> using namespace std; int maximum; int minimum; void fun(int x,int y int z) { int t; t=x>y?x:y; maximum=t>z?t:z; t=x<y?x:y; minimum=t<z?t:z; } void main() { int a,b,c; cout<<"input data a,b:"; cin>>a>>b>>c; fun(a,b,c); cout<<"maximum="<<maximum<<endl; cout<<"minimum="<<minimum<<endl; } C++语言程序设计
程序中标识符的作用域也就是标识符起作用的范围,标识符只能在其起作用的范围内被使用。 从标识符起作用的范围上划分,作用域主要分为 5.4 全局变量与局部变量 程序中标识符的作用域也就是标识符起作用的范围,标识符只能在其起作用的范围内被使用。 从标识符起作用的范围上划分,作用域主要分为 全局作用域 局部作用域 从标识符在程序中所处的位置,又可区分作用域为 块作用域 函数作用域 类作用域 文件作用域 C++语言程序设计
5.4 全局变量与局部变量 块作用域 块作用域是指标识符起作用的范围为块内范围,在块内定义的标识符具有块作用域。 5.4 全局变量与局部变量 块作用域 块作用域是指标识符起作用的范围为块内范围,在块内定义的标识符具有块作用域。 这个块,可以是复合语句的块,也可以是函数定义的函数体块。 块内定义的局部变量的作用域是从变量定义起至本块结束。 C++语言程序设计
C++语言程序设计 t的作用域 a和b的作用域 c的作用域 #include<iostream> using namespace std; void main() { int a, b; cout<<"input a,b:" cin>>a>>b; if (a<b) { int t; t=a; a=b; b=t; } int c=a*a-b*b; cout<<a<<"*"<<a" - "<<b<<"*"<<b<<"="<<c<<endl; t的作用域 a和b的作用域 c的作用域 C++语言程序设计
C++语言程序设计 #include ”iostream” using namespace std; void fun(); void main() { int num=10; cout<<“the first : num=”<<num<<endl; fun(); { int num=30; cout<<“the third: num=”<<num<<endl; } cout<<“the forth: num=”<<num<<endl; void fun() { int num=20; cout<<“the second: num=”<<num<<endl; 作用域范围在main函数中 块作用域范围 作用域范围在fun函数中 C++语言程序设计
5.4 全局变量与局部变量 函数作用域 文件作用域 函数作用域是指标识符的作用域为函数,或者是从标识符定义开始到函数结束。 5.4 全局变量与局部变量 函数作用域 函数作用域是指标识符的作用域为函数,或者是从标识符定义开始到函数结束。 文件作用域 文件作用域也即全局作用域,指标识符的作用域为文件范围。 在源文件所有函数之外声明或定义的标识符具有文件作用域,全局变量和函数名(不包括在其它函数内部声明原型的函数名)具有全局作用域,起作用的范围是从声明或定义点开始,直至其所在文件结束。 C++语言程序设计
标识符在其作用域内,能被访问到的位置称其为可见的。不能被访问到的位置称其为不可见的。 5.4 全局变量与局部变量 标识符的可见性 是研究标识符在其作用域内能否被访问到的问题。 标识符在其作用域内,能被访问到的位置称其为可见的。不能被访问到的位置称其为不可见的。 内层标识符与外层标识符同名时,内层标识符可见,外层标识符不可见。对于变量,也即内层变量屏蔽外层同名变量。 作用域范围小的标识符称为内层标识符;作用域范围大的标识符称为外层标识符 在同一作用域中,不能声明同名的标识符。 C++语言程序设计
C++语言程序设计 #include<iostream> using namespace std; double pi=3.1415926; double BallVolume(double radius) { double volume=pi*radius*radius*radius*4/3; //全局变量pi return volume; } double CircleArea(double radius) { double area=pi*radius*radius; //全局变量pi return area; } float CircleArea( float radius) { float pi=3.14f; float area=pi*radius*radius; //局部变量pi void main() { float r; cout<<"input radius: "; cin>>r; double dr=(double) r; cout<<"Ball volume: "<<BallVolume(dr)<<endl; cout<<"Circle area: "<<CircleArea(dr)<<"(double)"<<endl; cout<<"Circle area: "<<CircleArea(r)<<"(float)"<<endl; } C++语言程序设计
函数的实现代码如果函数内的局部变量与全局变量同名,且在函数内一定要使用这个同名全局变量,可以用作用域符号(::)指定要访问的全局变量。 #include<iostream> using namespace std; double pi=3.1415926; void BallVolume(double radius) { double volume=pi*radius*radius*radius*4/3; //全局变量pi cout<<"Ball volume: "<<volume<<endl; } void CircleArea( float radius) { float pi=3.14f; float area=pi*radius*radius; //局部变量pi cout<<"Circle area: "<<area<<"(float)"<<endl; area=::pi*radius*radius; //全局变量pi cout<<"Circle area: "<<area<<"(double)"<<endl; void main() { float r; cout<<"input radius: "; cin>>r; BallVolume(r); CircleArea(r); } 函数的实现代码如果函数内的局部变量与全局变量同名,且在函数内一定要使用这个同名全局变量,可以用作用域符号(::)指定要访问的全局变量。 C++语言程序设计