5.4 变量的作用域
变量的作用域是指该变量的作用范围。在具体讲解作用域相关概念前,读者应对程序的内存区域有一些了解。一个程序将操作系统分配给其运行的内存块分为4个区域:
●代码区,存放程序的代码,即程序中各个函数中的代码块。
●全局数据区,存放程序全局数据和静态数据。
●堆区,存放程序的动态数据。
●栈区,存放程序的局部数据,即各个函数中的数据。
正因为变量要实现的存储功能不一样,因此其在内存块的区域也不同。在C++中,根据变量的作用域可将变量划分为局部变量和全局变量。
5.4.1 局部变量
在一个函数内部说明的变量是内部变量,其只在该函数范围内有效。也就是说,只有在包含变量说明的函数内部,才能使用被说明的变量,在此函数之外就不能使用这些变量了。因此,这些内部变量被称为局部变量。
前面介绍的代码清单5-4中定义了一个函数swap,该函数中声明了整型变量t,该变量就是一个局部变量,其只在swap函数中起作用。
【范例5-7】局部变量的应用。该范例对代码5-4做一些修改,读者仔细观看局部变量的作用范围,代码如代码清单5-7所示。
代码清单5-7
【运行结果】上述程序在Visual C++中的运行结果如图5-13所示。
图5-13 使用局部变量
【范例解析】在范例5-7代码中,在swap()函数中定义了变量t,用于交换两个数的中间变量,而在main()函数中也定义了一个变量t,并给其赋初值0。从上述程序读者可以看出,main()函数和swap()函数中的变量t都是局部变量,其都有自身的作用范围。
注意
在C++中,主函数main()中定义的内部变量,只能在主函数中使用,其他函数不能使用。同时,主函数中也不能使用其他函数中定义的内部变量。因为主函数也是一个函数,与其他函数是平行关系。
在上述代码中,如果主函数main()要使用swap()函数中定义的变量t,将main()函数中的变量t的声明语句即第6行注释掉,这是不允许的,Visual C++编译程序将给出变量没有定义的错误,如图5-14所示。
图5-14 错误信息
此外,在使用局部变量时需注意如下几个事项:
●形参变量也是内部变量,属于被调用函数;实参变量,则是调用函数的内部变量。
●允许在不同的函数中使用相同的变量名,但它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。
●在复合语句中也可定义变量,其作用域只在复合语句范围内。
5.4.2 全局变量
与局部变量相对应,C++中也有全局变量的概念。全局变量又被称为外部变量,其是在函数外部定义的变量。
提示
全局变量不属于任何一个函数,可被作用域内的所有函数直接引用,其作用域从外部变量的定义位置开始,到本文件结束为止。
【范例5-8】全局变量的应用。该范例声明了3个全局变量s1、s2和s3,用于接收用户输入的长方体的长(l)、宽(w)、高(h),求长方体体积及正、侧、顶三个面的面积,实现代码如代码清单5-8所示。
代码清单5-8
【运行结果】该程序在Visual C++中的运行结果如图5-15所示。
图5-15 使用全局变量
【范例解析】在上述代码中,程序一开始就声明了三个变量s1、s2和s3,这三个都是全局变量,其作用域为该文件内所有函数。因此,在函数vs()中使用到了,而在主函数main()中同样使用到了。
读者可以看出,使用全局变量能够很方便地完成某些功能,能够简化程序。然而,这也使得函数之间的独立性降低了,这并不符合结构化程序设计的思想。因此,在使用全局变量时,如果可用其他方法实现,则尽量少用全局变量实现。
此外,对于全局变量还有以下几点说明:
●外部变量可加强函数模块之间的数据联系,但又使这些函数依赖这些外部变量,从而使得这些函数的独立性降低。
●在同一源文件中,允许外部变量和内部变量同名。在内部变量的作用域内,外部变量将被屏蔽而不起作用。
●全局变量的作用域是从定义点到本文件结束。如果定义点之前的函数需要引用这些外部变量时,需要在函数内对被引用的外部变量进行说明。
外部变量说明的一般形式为:
提示
全局变量的定义和外部变量的说明是不一样的。全局变量的定义,其必须在所有的函数之外定义,且只能定义一次。而外部变量的说明,一般出现在要使用该外部变量的函数内,而且可以出现多次。