第5单元函数 void maino x=0;//在主函数中为全局变量x赋值 在上面的程序中一共有3个变量x:一个是全局变量,一个是函数 final()的参数, 还有一个是函数func2()中的局部变量。虽然我们说全局变量的作用范围是整个源程序, 但就上面这段程序而言,只有在主函数中才能使用全局变量x,而在其他两个函数中的x 均是它们的参数或局部变量。这种现象可以用“地方保护主义”形象地说明。 也可以在函数内部的变量声明语句之前加上外部说明符 extern说明该函数中用的就是 外部变量,而非一个同名的局部变量。例如 int x =0: //全局变量声明 func o extern int x,y;//变量x,y都是相应的外部变量 与此类似,声明于函数或分程序中的局部变量的作用域是整个函数或分程序,包括其中 嵌套的所有其他分程序。但是,在内层分程序中声明的变量与其外层的函数或分程序中声明 的变量重名时,仍是按上述原则确定各自的作用域,即内层变量声明优先于外层变量声明 不过,为了使程序清晰易读,最好不要在嵌套的分程序中声明重名的变量 自学内容 55内联函数 在调用函数时,系统要做许多工作,主要包括断点现场保护、数据进栈、执行函数体 保存返回值、恢复现场和断点等,开销很大 有些函数的函数体比较简单(如例5-3中的函数max(),在调用时,执行函数体所消 耗的时间与函数调用时的其他时间开销相比就显得微不足道。如果该函数被频繁调用,则附
第 5 单元 函数 - 92 - ... ... } void main() { ... ... x = 0; // 在主函数中为全局变量 x 赋值 ... ... } 在上面的程序中一共有 3 个变量 x:一个是全局变量,一个是函数 func1()的参数, 还有一个是函数 func2()中的局部变量。 虽然我们说全局变量的作用范围是整个源程序, 但就上面这段程序而言,只有在主函数中才能使用全局变量 x,而在其他两个函数中的 x 均是它们的参数或局部变量。这种现象可以用“地方保护主义”形象地说明。 也可以在函数内部的变量声明语句之前加上外部说明符 extern 说明该函数中用的就是 外部变量,而非一个同名的局部变量。例如 int x = 0; // 全局变量声明 ... ... func() { extern int x,y;// 变量 x,y 都是相应的外部变量 ... ... } int y = 0; ... ... 与此类似,声明于函数或分程序中的局部变量的作用域是整个函数或分程序,包括其中 嵌套的所有其他分程序。但是,在内层分程序中声明的变量与其外层的函数或分程序中声明 的变量重名时,仍是按上述原则确定各自的作用域,即内层变量声明优先于外层变量声明。 不过,为了使程序清晰易读,最好不要在嵌套的分程序中声明重名的变量。 自学内容 5.5 内联函数 在调用函数时,系统要做许多工作,主要包括断点现场保护、数据进栈、执行函数体、 保存返回值、恢复现场和断点等,开销很大。 有些函数的函数体比较简单(如例 5-3 中的函数 max()),在调用时,执行函数体所消 耗的时间与函数调用时的其他时间开销相比就显得微不足道。如果该函数被频繁调用,则附
第5单元函数 加的时间开销将大得不容忽视。 C+为了解决这一矛盾,提供了一种称做“内联函数”的机制。该机制通过将函数体的 代码直接插入到函数调用处来节省调用函数的时间开销,这一过程叫做内联函数的扩展。由 于在扩展时对函数的每一次调用均要进行扩展,所以内联函数实际上是一种用空间换时间的 方案 要定义一个内联函数,只需在定义函数时将该函数用关键字 inline修饰即可。 例54将例5-3中的函数max()改写成内联函数 程序 / Example5-4:求两数中的大数 #include < iostream. h> inline int max(int x, int y) return x>y?x:y void main o cout < Please enter two integer: int a, b: cin >>a>> b: cout << "The maximum is"<< max(a, b)<< endl 分析:本例与例5-3的功能完全相同,但它们的执行方式却不同。在本例中不再有 对max()函数的调用,编译器将把该例中的输出语句处理成如下形式: cout <<The maximum is"<< a> b?a: b<< endl 使用内联函数时应注意: 1.在C++程序中,除了在函数体中含有循环、 switch分支和复杂嵌套的if语句的函数 外,所有的函数均可以被声明为内联函数。 2.内联函数的定义必须出现在对该函数的调用之前,如例5-4所示。这是因为编译器 在对函数调用语句进行代换时,必须事先知道代换该语句的代码是什么。如果像例5-3那样, 即使在函数原型和函数定义处均加上关键字 inline也不行 3.由于计算机的资源总是有限的,使用内联函数虽然节省了程序运行的时间开销,但 却增大了代码占用内存的空间开销。因此在具体编程时应仔细地权衡时间开销与空间开销之 间的矛盾,以确定是否采用内联函数。 56带有缺省参数的函数 C++允许在函数声明或函数定义中为参数预赋一个或多个缺省值,这样的函数就叫做带 有缺省参数的函数。在调用带有缺省参数的函数时,如果为相应参数指定了参数值,则参数
第 5 单元 函数 - 93 - 加的时间开销将大得不容忽视。 C++为了解决这一矛盾,提供了一种称做“内联函数”的机制。该机制通过将函数体的 代码直接插入到函数调用处来节省调用函数的时间开销,这一过程叫做内联函数的扩展。由 于在扩展时对函数的每一次调用均要进行扩展,所以内联函数实际上是一种用空间换时间的 方案。 要定义一个内联函数,只需在定义函数时将该函数用关键字 inline 修饰即可。 [例 5-4] 将例 5-3 中的函数 max()改写成内联函数。 程 序: // Example 5-4:求两数中的大数 #include <iostream.h> inline int max(int x,int y) { return x>y?x:y; } void main() { cout << "Please enter two integer:"; int a,b; cin >> a >> b; cout << "The maximum is" << max(a,b) << endl; } 分 析:本例与例 5-3 的功能完全相同,但它们的执行方式却不同。在本例中不再有 对 max()函数的调用,编译器将把该例中的输出语句处理成如下形式: cout << "The maximum is" << a> b?a:b << endl; 使用内联函数时应注意: 1.在 C++程序中,除了在函数体中含有循环、switch 分支和复杂嵌套的 if 语句的函数 外,所有的函数均可以被声明为内联函数。 2.内联函数的定义必须出现在对该函数的调用之前,如例 5-4 所示。这是因为编译器 在对函数调用语句进行代换时,必须事先知道代换该语句的代码是什么。如果像例 5-3 那样, 即使在函数原型和函数定义处均加上关键字 inline 也不行。 3.由于计算机的资源总是有限的,使用内联函数虽然节省了程序运行的时间开销,但 却增大了代码占用内存的空间开销。因此在具体编程时应仔细地权衡时间开销与空间开销之 间的矛盾,以确定是否采用内联函数。 5.6 带有缺省参数的函数 C++允许在函数声明或函数定义中为参数预赋一个或多个缺省值,这样的函数就叫做带 有缺省参数的函数。在调用带有缺省参数的函数时,如果为相应参数指定了参数值,则参数