?教学目的与要求:
了解函数的重载的目的 。
掌握函数重载的使用,数据的作用域与生存期 。
教学内容提要:
1,C++函数重载;
2,C++的作用域与可见性;
3,C++中的编译预处理;
教学重点:函数重载和作用域与可见性 。
教学难点:函数重载和作用域与可见性 。
教学进度,P31~ P35
教学过程:
第 5 讲 函数重载和作用域函数的重载 是指建立多个同名的函数,但函数的形参表必须 互不相同 。 不相同 可是形参个数不同,也可是形参的类型不同,还可两者都不相同。
例如,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 重载函数 】
使用重载函数
#include<iostream.h>
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;
例 5-1
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;
}
double add(double a,double b)
{
cout<< ″In double add(double a,double b) ″<<endl;
cout<<a<<′+′<<b<<′=′;
return a+b;
}
当重载的函数带有默认参数时,应该注意避免二义性。
注 不要将不同功能的函数声明为重载函数,以免出现调用结果的误解、混淆。这样不好:
例如,int fun(int a,int b=0);
int fun(int a);
说明:遇到 fun(2)的函数调用时,
编译器将无法准确地确定应调用哪个函数。
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
(续)
函数原型作用域
块作用域
文件作用域
类作用域
【 5.2作用域与可见性 】
作用域,讨论的是标识符号的有效范围;
可见性,讨论的是标识符是否可以引用。
作用域;一个标识符在程序正文中有效的区域。
函数原型中的参数,其作用域始于
"(",结束于 ")"。
例如,设有下列原型声明:
void main()
double Area(double radius);
radius=10.0;
radius 的作用域仅在于此,不能用于程序正文其它地方,因而可有可无。
【 5.2.1函数原形的作用域 】
在块中声明的标识符,其作用域自声明处起,限于块中,例如:
void fun(int a)
{ int b(a);
cin>>b;
if (b>0)
{
int c;
......
}
}
c的作用域
b的作用域
【 5.2.2 块作用域 】
类作用域作用于特定的成员名,类及其对象有特殊的访问和作用域规则。
在所有函数定义之外声明的标识符,具有文件作用域,这样声明的标识符的作用域开始于声明点,结束于文件尾。
【 5.2.3 类和文件作用域 】
可见性是从对标识符的引用的角度来谈的概念
程序运行到某一点能够引用到的标识符,就是该处可见的标识符,也可以说该标识符在这里是可见的。
【 5.2.4 可见性 】
标识符应声明在先,引用在后。
在同一作用域中,不能声明同名的标识符。
如果某个标识符在外层中声明,且在内层中没有同一标识符的声明,则该标识符在内层可见。
对于两个嵌套的作用域,如果在内层作用域内声明了与外层作用域中同名的标识符,则外层作用域的标识符在内层不可见。
#include<iostream.h>
int i,j; //文件作用域
int main( )
{ i=5;j=10;
{ int i; //块作用域
i=7;
cout<<"i="<<i<<endl; //输出 7
cout<<“j="<<j<<endl; //输出 10
}
cout<<"i="<<i; //输出 5
return 0;
}
例 5-2
注 若要使得全局作用域的同名变量在局部作用域范围内可见可在全局变量引用前加上 作用域运算符,:。
例 5.3 使用作用域标识符的情况。
#include<iostream.h>
int avar;
main()
{
int avar;
avar=25; // 局部变量 avar
::avar=10; // 全局变量 avar
cout<<"local avar ="<<avar<<endl;
cout<<"global avar ="<<::avar<<endl;
return 0;
}
程序运行结果如下,
local avar=25
global avar=10
#include<iostream.h>
int i=5; //文件作用域
int main( )
{
cout<<"i="<<i<<endl;
return 0;
}
i具有静态生存期例 5-4
【 5.2.5 对象的态生存期 】
这种生存期与程序的运行期相同。
在文件作用域中声明的对象具有这种生存期。
在函数内部声明静态生存期对象,要冠以关键字 static 。
对象从产生到结束的这段时间就是它的生存期。在对象生存期内,对象将保持它的值,直到被更新为止。
静态生存期动态生存期
块作用域中声明的对象是动态生存期的对象(习惯称局部生存期对象)。
开始于程序执行到声明点时,结束于命名该标识符的作用域结束处。
#include<iostream.h>
void fun( ) ;
void main( )
{ fun( ) ;
fun( ) ;
}
void fun( )
{ static int a=1;
int i=5;
a++;
i++;
cout<<"i="<<i<<",a="<<a<<endl;
}
运行结果:
i=6,a=2
i=6,a=3
i是动态生存期
a是静态生存期例 5-5
#include<iostream.h>
int i=1; // i 为全局变量,具有静态生存期。
void main(void)
{ static int a; // 静态局部变量,有全局寿命,局部可见。
int b=-10; // b,c为局部变量,具有动态生存期。
int c=0;
void other(void);
cout<<"---MAIN---\n";
cout<<" i,"<<i<<" a,"<<a<<" b,"<<b<<" c,"<<c<<endl;
c=c+8; other( ) ;
cout<<"---MAIN---\n";
cout<<" i,"<<i<<" a,"<<a<<" b,"<<b<<" c,"<<c<<endl;
i=i+10; other( ) ;
}
例 5-6
void other( )
{
static int a=2;
static int b;
// a,b为静态局部变量,具有全局寿命,局部可见。
//只第一次进入函数时被初始化。
int c=10; // C为局部变量,具有动态生存期,
//每次进入函数时都初始化。
a=a+2; i=i+32; c=c+5;
cout<<"---OTHER---\n";
cout<<" i,"<<i<<" a,"<<a<<" b,"<<b<<" c,
"<<c<<endl;
b=a;
}
运行结果:
---MAIN---
i,1 a,0 b,-10 c,0
---OTHER---
i,33 a,4 b,0 c,15
---MAIN---
i,33 a,0 b,-10 c,8
---OTHER---
i,75 a,6 b,4 c,15
小结
重载函数函数的定义和调用格式 。
函数的作用域 。
变量的可见性和生存期 。
作业
P47 2.12,2.17