第5章程序结构 H 第5章程序结构 5.1作用域与可见性 5.,2生存期 53局部变量和全局变量 5.4静态成员 55友元 5.6常类型 5.7多文件结构 5.8编译预处理 BACK
第5章 程序结构 第5章 程序结构 5.1 作用域与可见性 5.2 生存期 5.3 局部变量和全局变量 5.4 静态成员 5.5 友元 5.6 常类型 5.7 多文件结构 5.8 编译预处理
第5章程序结构 H 5.1作用域与可见性 5.1.1作用域 作用域是一个标识符在程序正文中有效的区域。 C++的作用域有函数原型作用域、块作用域(亦称局 部作用域)和文件作用域。 1.函数原型作用域 函数原型作用域是C+程序中最小的作用域。前面 介绍过,在函数原型的声明中一定要包含参数的类型 声明
第5章 程序结构 5.1 作用域与可见性 5.1.1 作用域 作用域是一个标识符在程序正文中有效的区域。 C++的作用域有函数原型作用域、块作用域(亦称局 部作用域)和文件作用域。 1. 函数原型作用域 函数原型作用域是C++程序中最小的作用域。前面 介绍过,在函数原型的声明中一定要包含参数的类型 声明
第5章程序结构 H 这里参数的声明就属于函数原型作用域,它开始于 函数原型声明的左括号“(”,结束于右括号“)”。 例如,有如下函数声明 double area( double length double width) 由于形参 length和wdth只在括号之内有效,在程序 的其它地方无法引用这个标识符,如果要引用,必须重 新定义。例如: double area( double length; double width);/函数声明 length=10 width=5
第5章 程序结构 这里参数的声明就属于函数原型作用域,它开始于 函数原型声明的左括号“(” ,结束于右括号“)” 。 例如,有如下函数声明: double Area(double length,double width); 由于形参length和width只在括号之内有效,在程序 的其它地方无法引用这个标识符,如果要引用,必须重 新定义。例如: double Area(double length,double width); //函数声明 length=10; width=5;
第5章程序结构 H 这段代码会引起无定义的标识符编译错误。所以, 对于这种情况,标识符 length和 width实际上是可有可无 的,省去它,也决不会影响到程序的编译和运行结果。 例如 double area( double, double) 但是,考虑到程序的可读性,还是要在函数原型声 明时,给形参指定一个有意义的标识符,而且一般总 是与该函数定义时声明的参数标识符一致
第5章 程序结构 这段代码会引起无定义的标识符编译错误。所以, 对于这种情况,标识符length和width实际上是可有可无 的,省去它,也决不会影响到程序的编译和运行结果。 例如: double Area(double,double); 但是,考虑到程序的可读性,还是要在函数原型声 明时,给形参指定一个有意义的标识符,而且一般总 是与该函数定义时声明的参数标识符一致
H 第5章程序结构 例如 double area( double length, double width);∥函数声明 double area( double length, double width) )/-数定义
第5章 程序结构 例如: double Area(double length,double width); //函数声明 //... double Area(double length,double width) //函数定义 { //... }
H 第5章程序结构 2.块作用域 块作用域又称局部作用域。当标识符的声眀出现 在由一对花括号“{}"所括起来的程序(块)内时,则 此块中声明的标识符的作用域从声明处开始,一直到 块结束的花括号为止。为了理解块作用域,我们来看 一个例子: #include void mal int n
第5章 程序结构 2.块作用域 块作用域又称局部作用域。当标识符的声明出现 在由一对花括号“{}”所括起来的程序(块)内时,则 此块中声明的标识符的作用域从声明处开始,一直到 块结束的花括号为止。为了理解块作用域,我们来看 一个例子: #include void main( ) { int n;
H 第5章程序结构 for(int i=0; 1<5; 1++) Int m if(192) m作用域}i作用域〉n作用域 n++ m=n/2;∥错误,m未定义
第5章 程序结构 for(int i=0;i<5;i++) { int m; if(i%2) m作用域 i作用域 n作用域 n++; } m=n/2; //错误,m未定义 n=i; }
H 第5章程序结构 在这个例子中,函数体main()是一个块,for语句 之后的循环体又是一个较小的块。变量n和i的作用域 从声明处开始,到它所在的块,即整个函数体main() 结束处为止。变量m的作用域从声明处开始到它所在 的块,即循环体结束为止。因此,编译时m=n/2会出错, 因为它试图在m作用域之外引用m。而n=i是允许的, 因为此时还在i的作用域内。如果在上面的程序中加入 一个函数finl(),情况会怎么样呢?
第5章 程序结构 在这个例子中,函数体main( )是一个块,for语句 之后的循环体又是一个较小的块。变量n和i的作用域 从声明处开始,到它所在的块,即整个函数体main( ) 结束处为止。变量m的作用域从声明处开始到它所在 的块,即循环体结束为止。因此,编译时m=n/2会出错, 因为它试图在m作用域之外引用m。而n=i是允许的, 因为此时还在i的作用域内。如果在上面的程序中加入 一个函数fun1( ),情况会怎么样呢?
H 第5章程序结构 #include void main void fun1() /fun1()函数声明 n for(int 1=0; 1<5; 1++) int m if(192) n++
第5章 程序结构 #include void main( ) { void fun1( ); //fun1( )函数声明 int n; for(int i=0;i<5;i++) { int m; if(i%2) n++;
第5章程序结构 H m-n ∥错误,m未定义 fun1() /fnl()函数调用 void fun1() cout<<i="<<i<<endl ∥错误,i未定义
第5章 程序结构 } m=n/2; //错误,m未定义 fun1( ); //fun1( )函数调用 n=i; } void fun1( ) { cout<<"i="<<i<<endl; //错误,i未定义 }