七、过程(功能)抽象 一一函数 (深入话题
七、过程(功能)抽象 --函数 (深入话题)
主要内容 ■标识符的作用域 ■变量的生存期 ·内联函数 ·带缺省值的形式参数 ■函数名重载
主要内容 ◼ 标识符的作用域 ◼ 变量的生存期 ◼ 内联函数 ◼ 带缺省值的形式参数 ◼ 函数名重载
标识符的作用域概述 不同的程序实体一定要取不同的名字吗? 为了对程序中的实体的名字进行管理,引进 了标识符的作用域的概念: 一个定义了的标识符的有效范围(能被访问的程 序段 。标识符的作用域与它的定义位置有关。 作用域不相交的两个标识符(标识不同的实 体)可以相同,即,在一些情况下,可以用 相同的标识符来标识不同的程序实体
标识符的作用域概述 ◼ 不同的程序实体一定要取不同的名字吗? ◼ 为了对程序中的实体的名字进行管理,引进 了标识符的作用域的概念: • 一个定义了的标识符的有效范围(能被访问的程 序段)。 • 标识符的作用域与它的定义位置有关。 ◼ 作用域不相交的两个标识符(标识不同的实 体)可以相同,即,在一些情况下,可以用 相同的标识符来标识不同的程序实体
C++标识符的作用域 ■ C++把标识符的作用域分成若干类,其中 包括: ·局部作用域 全局作用域 。结构/类作用域 文件作用域 函数作用域 函数原型作用域 名空间作用域
C++标识符的作用域 ◼ C++把标识符的作用域分成若干类,其中 包括: • 局部作用域 • 全局作用域 • 结构/类作用域 • 文件作用域 • 函数作用域 • 函数原型作用域 • 名空间作用域
局部作用域 ■局部作用域是指 在函数定义或复合语句中、从标识符的定义点开 始到函数定义或复合语句结束之间的程序段。 以下标识符具有局部作用域: ·局部变量名 ·局部常量名 ·函数的形参名
局部作用域 ◼ 局部作用域是指 • 在函数定义或复合语句中、从标识符的定义点开 始到函数定义或复合语句结束之间的程序段。 ◼ 以下标识符具有局部作用域: • 局部变量名 • 局部常量名 • 函数的形参名
void f(intn)/n的有效范围从此开始一直到f函数体结束 x++;//Error n++: int×=0;/x的有效范围从此开始一直到f函数体结束 X++; n++; 111”111 } int main() {intx;/x的有效范围从此开始一直到main函数体结束 intn;/n的有效范围从此开始一直到main函数体结束 ×=10; cin > n f(n); 函数f和main中的变量x、n是不同的变量,只是 名字相同而已!
void f(int n) //n的有效范围从此开始一直到f函数体结束 { x++; //Error n++; int x=0; //x的有效范围从此开始一直到f函数体结束 x++; n++; ....... } int main() { int x; //x的有效范围从此开始一直到main函数体结束 int n; //n的有效范围从此开始一直到main函数体结束 x = 10; cin >> n; f(n); ...... } ◼ 函数f和main中的变量x、n是不同的变量,只是 名字相同而已!
局部作用域有时是一个潜在作用域,如果在一个标识 符的局部作用域中包含内层复合语句,并且在该内层 复合语句中定义了一个同名的不同实体,则外层定义 的标识符的真正作用域应该是扣除内层同名标识符的 作用域之后所得到的作用域 void f() {intx;/外层x的定义 …×…/外层的x while(..x.)/外层的x {..X./外层的X, double x;/内层x的定义 不提倡这样用! .×../内层的× x../外层的x
◼ 局部作用域有时是一个潜在作用域,如果在一个标识 符的局部作用域中包含内层复合语句,并且在该内层 复合语句中定义了一个同名的不同实体,则外层定义 的标识符的真正作用域应该是扣除内层同名标识符的 作用域之后所得到的作用域。 void f() { int x; //外层x的定义 ... x ... //外层的x while ( ... x ...) //外层的x { ... x ... //外层的x, double x; //内层x的定义 ... x ... //内层的x } ... x ... //外层的x } 不提倡这样用!
全局作用域 ▣全局作用域是指 ·构成C++程序的所有模块(源文件)。 以下标识符具有全局作用域: ·全局变量名/对象名 。全局函数名(区别于类的成员函数) 全局类名(区别于在类中定义的类》 具有全局作用域的标识符能在程序的任何地方访 问。 使用全局标识符时,若该标识符的定义点在其它源文 件中或在本源文件中使用点之后,则在使用前需要声 明它们
全局作用域 ◼ 全局作用域是指 • 构成C++程序的所有模块(源文件)。 ◼ 以下标识符具有全局作用域: • 全局变量名/对象名 • 全局函数名(区别于类的成员函数) • 全局类名(区别于在类中定义的类) ◼ 具有全局作用域的标识符能在程序的任何地方访 问。 • 使用全局标识符时,若该标识符的定义点在其它源文 件中或在本源文件中使用点之后,则在使用前需要声 明它们
如果在某个局部作用域中定义了与某个全局标识 符同名的标识符,则该全局标识符的真正作用域 应该从其潜在作用域中扣掉与之同名的局部标识 符的作用域。 intx;/全局x的定义 void f() {.X.…/全局的x double x;/局部x的定义 ..×../局部的x
◼ 如果在某个局部作用域中定义了与某个全局标识 符同名的标识符,则该全局标识符的真正作用域 应该从其潜在作用域中扣掉与之同名的局部标识 符的作用域。 int x; //全局x的定义 void f() { ... x ... //全局的x double x; //局部x的定义 ... x ... //局部的x }
■ 在局部标识符的作用域中若要使用与其同名的全 局标识符,则需要用全局域选择符(:)对全局 标识符进行修饰(受限) double x;/外层x的定义 void f() {.…X.…/外层x的定义 intx;/内层x的定义 .×…/内层的x .:×.…/外层的x
◼ 在局部标识符的作用域中若要使用与其同名的全 局标识符,则需要用全局域选择符(::)对全局 标识符进行修饰(受限)。 double x; //外层x的定义 void f() { ... x ... //外层x的定义 int x; //内层x的定义 ... x ... //内层的x ... ::x ... //外层的x }