第5讲函数重载和作用域 教学目的与要求: 了解函数的重载的目的。 掌握函数重载的使用,数据的作用域与生存期。 教学内容提要: 1、C++函数重载; 2、C++的作用域与可见性; 3、C++中的编译预处理; 教学重点:函数重载和作用域与可见性。 教学难点:函数重载和作用域与可见性。 教学进度:P31~P35 教学过程:
(51重载函数 函数的重载是指建立多个同名的函数,但函数的形参表必须互不相同。不相 同可是形参个数不同,也可是形参的类型不同,还可两者都不相同。 例如: int fun(int;int) int fun(int); 合法的重载函数 long fun(int, long); long fun (long) 重载函数的返回类型,即函数类型可以相同,也可以不同。如果仅 仅是返回类型不同,而函数名相同、形参表也相同,则是非法的 例如: int fund(mmtb);「不合法的 long fun(int a int b) 例如: int fun(inta,intb);说明:合法的。但不是重载。它只是对同 int fun(int x, int y); 函数原型的多次声明。 函数重载又称函数的多态性。它通过改变形参的个数或类型使 多个函数共用一个函数名
函数的重载是指建立多个同名的函数,但函数的形参表必须互不相同。不相 同可是形参个数不同,也可是形参的类型不同,还可两者都不相同。 例如:int fun(int,int); int fun(int); long fun(int,long); long fun(long); 重载函数的返回类型,即函数类型可以相同,也可以不同。如果仅 仅是返回类型不同,而函数名相同、形参表也相同,则是非法的。 例如:int fun(int a,int b); long fun(int a,int b); 例如:int fun(int a,int b); int fun(int x,int y); 函数重载又称函数的多态性。它通过改变形参的个数或类型使 多个函数共用一个函数名。 合法的重载函数 不合法的 说明:合法的。但不是重载。它只是对同 一函数原型的多次声明。 【 5.1 重载函数】
例5-1使用重载函数 #includesiostream.h> int add(int a, int b) long add(ong a, long b) float add (float a, float b) double add(double a, double b); id (0 i int integer1=100, integer 2=200; long longint1=200L, longint2-=400L float floatdigit1-=5.5f, floatdigit2-=10.6f; double doubledigitl=5.5e22, doubledigit2=4.4e20 cout<< NT: <<endl cout<<add(integer, integer)<<end; cout<<endk<< " LONG: <<endI; cout<<add(longintl, longint2)<<endl
#include int add(int a,int b); long add(long a,long b); float add(float a,float b); double add(double a,double b); void main() { int integer1=100, integer2=200; long longint1=200L, longint2=400L; float floatdigit1=5.5f, floatdigit2=10.6f; double doubledigit1=5.5e22, doubledigit2=4.4e20; cout<< ″INT: ″<<endl; cout<<add(integer1,integer2)<<endl; cout<<endl<< ″LONG: ″<<endl; cout<<add(longint1,longint2)<<endl;
(3:) cout<<endk<<"FLOAT: "<<endl cout<<add(floatdigitl, floatdigit2)<<endl; cout<<end<</DOUBLE: <<endl cout<<add(doubledigitl, doubledigit2)<<end; int add(int a, int b {cout≤<" In int add(inta,intb)"≤<endl; cout<<a<<+<<b return(a+b); long add(long a, long b) i cout<< "In long add(ong a, long b)<<endl; cout<<a<</+'<<b return(a+b)
cout<<endl<< ″FLOAT: ″<<endl; cout<<add(floatdigit1,floatdigit2)<<endl; cout<<endl<< ″DOUBLE: ″<<endl; cout<<add(doubledigit1,doubledigit2)<<endl; } int add(int a,int b) { cout<< ″In int add(int a,int b) ″<<endl; cout<<a<<′+′<<b<<′=′; return(a+b); } long add(long a,long b) { cout<< ″In long add(long a,long b) ″<<endl; cout<<a<<′+′<<b<<′=′; return(a+b); }
float add(float a, float b) cout<< " In float add(float a, float b)"<<endl; cout<<a<<+<<b<<'= return a+b: Rk double add(double a, double b) cout<< "In double add (double a, double b)"<<endl: cout<<a<<+<<b<< return a+b 注不要将不同功能的函数声明为重载函数,以免出现调用 结果的误解、混淆。这样不好: 当重载的函数带有默认参数时,应该注意避兔二义性
(续) In int add (int a, int b) 100+200=300 LONG: In long add(long a, long b) 200+400=600 FLOAT. In float add(float a, float b); 5.5+10.6=16.1 DOUBLE In double add(double a, double b) 5.5e+022+4.4e+020=5.544e+022 说明:遇到fun(2)的函数调用时, 例如: int fun(intA,int b=);编译器将无法准确地确定应调用哪 int fun(int a) 个函数
例如:int fun(int a,int b=0); int fun(int a); INT: In int add(int a,int b) 100+200=300 LONG: In long add(long a,long b) 200+400=600 FLOAT: In float add(float a,float b); 5.5+10.6=16.1 DOUBLE: In double add(double a,double b) 5.5e+022+4.4e+020=5.544e+022
52作用域与可见性 作用域讨论的是标识符号的有效范围; 可见性讨论的是标识符是否可以引用 作用域;一个标识符在程序正文中有效的区域。 口函数原型作用域 口块作用域 口文件作用域 口类作用域
:讨论的是标识符号的有效范围; :讨论的是标识符是否可以引用。 作用域;一个标识符在程序正文中有效的区域
521函数原形的作用域 ●函数原型中的参数,其作用域始于 "(",结束于")"。 ●例如,设有下列原型声明 void maino double area(double radius) radius=10.0 radius的作用域仅在于此,不能 用于程序正文其它地方,因而可 有可无
l 函数原型中的参数,其作用域始于 "(" ,结束于")" 。 l 例如,设有下列原型声明: void main() double Area(double radius); radius=10.0; radius 的作用域仅在于此,不能 用于程序正文其它地方,因而可 有可无
522块作用域 在块中声明的标识符,其作用域自声明处 起,限于块中,例如: void fun(int a) I int b(a) cin>>b i£(b>0) b的作用域 int c c的作用域
l 在块中声明的标识符,其作用域自声明处 起,限于块中,例如: void fun(int a) { int b(a); cin>>b; if (b>0) { int c; ...... } } c的作用域 b的作用域
523类和文件作用域〗 类作用域作用于特定的成员名,类及其 对象有特殊的访问和作用域规则 ●在所有函数定义之外声明的标识符,具有 文件作用域,这样声明的标识符的作用 域开始于声明点,结束于文件尾
l 类作用域作用于特定的成员名,类及其 对象有特殊的访问和作用域规则。 l 在所有函数定义之外声明的标识符,具有 文件作用域,这样声明的标识符的作用 域开始于声明点,结束于文件尾