当前位置:文档之家› 第4章 函数和作用域

第4章 函数和作用域

1:分析下列程序的输出结果。
#include <iostream.h> void main() { double x,y; cout<<“Input double x and y:”; cin>>x>>y; double z=x+y; cout<<“x+y=”<<z<<endl; }
4.2.3 函数的引用调用(续)
int &fun(char, int &, int &) { if(cha>=„0‟&&cha<=„9‟) return n; else return c; }
4.3.1 函数参数的求值顺序
当一个函数带有多个参数时,C++语言没有规定函 数调用时实参的求值顺序; 编译器根据对代码进行优化的需要自行规定对实 参的求值顺序; 在实参中注意不要使用带有副作用的运算符,此 时可能产生二义性;
实现机制:系统将实参拷贝一个副本给形参(数 据值) ;
特点:形参值的改变不影响实参值;
4.2.2 函数的传值调用(续)
例4.3:分析下列程序的输出结果(传值调用)。 #include <iostream.h> 输出: void swap1(int x,int y) { x=9,y=5 int temp; a=5,b=9 temp=x; x=y; y=temp; cout<<"x="<<x<<", "<<"y="<<y<<endl; } void main() { int a(5),b(9); swap1(a,b); cout<<"a="<<a<<", "<<"b="<<b<<endl; }
4.2.2 函数的说明方法(续)
void fun2() { cout<<"It is in fun2. "<<endl; fun1(); cout<<"It is back in fun2. "<<endl; } void fun3() { cout<<"It is in fun3. "<<endl; } It is in main. It is back in fun1. 输 It is in fun2. It is back in fun2. It is in fun1. It is back in main. 出 It is in fun3.
产生二义性
可能的结果(按照编译器对实参求值顺序不同): 自左至右,两个实参的值分别为5和11; 自右至左,两个实参的值分别为5和10;
4.3.2 设置函数参数的默认值
C++中,在函数声明或定义时可以为一个或多个参 数指定缺省参数值; int add(int x,int y=10); 进行函数调用时,若未指定足够的实参,则编译 器将按从左向右的顺序用函数声明或定义中的缺省 值来补足所缺少的实参; add(15); add(15,10); 注意: 函数参数求值顺序与参数默认值补足顺序不同 参数求值顺序:由编译器决定求值方向; 参数默认值补足顺序:自左向右
例4.2:分析下列程序的输出结果。 #include <iostream.h> void fun1(),fun2(),fun3(); 函数原型声明 void main() { cout<<"It is in main. "<<endl; fun2(); cout<<"It is back in main. "<<endl; } void fun1() { cout<<"It is in fun1. "<<endl; fun3(); cout<<"It is back in fun1. "<<endl; }
4.1 函数的定义格式
改写4.1 #include <iostream.h> double sum_double(double x,double y){ return x+y;} void main() { double a,b; cout<<“Input double a and b:”; cin>>a>>b; double sum=sum_double(a,b); cout<<“sum=”<<sum<<endl; }
void main(){ int m=8; fun(a,m); cout<<a[7]<<endl; }
4.3.3 使用数组作为函数参数
4.3.2
设置函数参数的默认值(续)
在一个指定了缺省值的参数的右边,不能出现没 有指定缺省值的参数; void f(int x,int y=1,int z); 错误
例如:f(2,4); 理想:f(2,1,4),实际:z参数未被赋值
在给某个参数指定缺省值时,不仅可以是一个数 值,而且可以是任意复杂的表达式; int f(); …… void delay(int k,int time=f());
4.3.2
设置函数参数的默认值(续)
例4.9:分析下列程序的输出结果。 #include <iostream.h> int m(8); int add_int(int x,int y=7,int z=m); void main() { int a(5),b(15),c(20); int s=add_int(a,b); cout<<s<<endl; 输出: } 28 int add_int(int x,int y,int z){ return x+y+z; }
4.3.3 使用数组作为函数参数
例4.10:分析下列程序的输出结果。 #include <iostream.h> int a[8]={1,3,5,7,9,11,13};
void fun(int b[],int n){ for(int i=0;i<=n-1;i++) b[7]+=b[i]; }
void main(){ int m=8; fun(a,m); cout<<a[7]<<endl; }
4.2.3
函数的引用调用(C++特有)
引用调用的实现机制和特点 用法:调用函数的实参用变量名,被调用函数 的形参用引用;
实现机制:直接通过引用来改变实参的数据值; 特点:起到传址调用的作用,但比传址调用更 方便、更直接;
4.2.3 函数的引用调用(续)
例4.5:分析下列程序的输出结果(引用调用)。 #include <iostream.h> 输出: void swap3(int &x,int &y) { x=9,y=5 int temp; a=9,b=5 temp=x; x=y; y=temp; cout<<"x="<<x<<", "<<"y="<<y<<endl; } void main() { int a(5),b(9); swap3(a,b); cout<<"a="<<a<<", "<<"b="<<b<<endl; }
例4.7:由于使用对参数求值顺序不同的编译器造 成的二义性。
4.3.1 函数参数的求值顺序(续)
#include <iostream.h> int add(int x,int y) { return x+y; } void main() { int x(4),y(6); int z=add(++x,x+y); cout<<z<<endl; }
关于return语句的说明:
有返回值的return语句可以返回一个表达式的值, 从而实现函数之间的信息传递;
无返回值的函数必须用void说明其返回类型;
4.2.2 函数的传值调用
一、传值调用的分类 • 传值调用:传递变量本身的值(数据值); • 传址调用:传递变量的地址值; 二、传值调用的实现机制和特点 用法:调用函数的实参用常量、变量(数据)值 或表达式值,被调用函数的形参用变量;
4.2.4 函数的引用调用(续)
三种调用方式比较
传值调用 传址调用 实 常量、变量(数据) 地址值 参 值或表达式值 形 变量 指针 参 实现 实 参 拷 贝 一 个 副 形参指针直 机制 本给形参 接指向实参 特 形 参 的 变 化 不 影 形参的变化 点 响实参 影响实参 引用调用 变量名 引用 通过引用直 接指向实参 形参的变化 影响实参
4.2.2 函数的说明方法(函数的声明)
一、函数的说明原则 • 如果一个函数定义在先,调用在后,调用前可 以不必说明;
• 如果一个函数定义在后,调用在先,调用前 必须说明;
二、函数的说明方法(原型说明)
<类型> <函数名>(<参数表>);
三、示例 参数表中的参数 名称可以省略
4.2.2 函数的说明方法(续)
4.3.2
设置函数参数的默认值(续)
例4.8:分析下列程序的输出结果。 #include <iostream.h> void fun(int a=1,int b=3,int c=5) { cout<<"a="<<a<<", "<<"b="<<b<<", " <<"c="<<c<<endl; } void main() 输出: { a=1,b=3,c=5 fun(); a=7,b=3,c=5 fun(7); a=7,b=9,c=5 fun(7,9); fun(7,9,11); a=7,b=9,c=11 cout<<"OK! "<<endl; OK! }
相关主题