第四章存储分类符和作用域 31 /∥j声明为静态变量 static int j: sumO; cout<<"Inside main(),j is<<j"n"; cout<<"Inside main()," void num(void) static int i: i=1+l: cout<<"Inside sum()j isj" } 编译运行该程序会得到如下输出结果: Inside sum()j is 1 nside main(),j is0 Inside sum()j is 2 Inside main(),j is j在主函数ain()和sus()中均被声明为一个静态变量.在sm()中,j被加 1,然后进程返回到主函数a()中,我们看到这时的j是0,这是因为在主函数 main()中的变量j已经超出了函数sum()的作用域,静态变量被赋值为O.因此在主 函数a()中0作为j的值输出;接着,控制又回到sum(),这时j保持着原先 的值1(因为j是静态变量),现在j变为2,但在主函数ai()中j的值仍然是 在C+艹中,类(c1ass)的静态成员也有与之相联系的特殊规则。当我们讲到类时再 详细讨论。 4.4外部变量声明 ·外部变量不同于静态变量和自动变量,它的作用威是全局的而不是局部的. 外部变量在函数的内外都能存在,并且对于同一文件内的所有函数均可用(这叫做文 件作用域,File Scope) ■外部变量的值象静态变量一样可以保持, ■在没有明确的初始值时,外部变量也会自动初始化为0或空(U), 请看下面的程序 //test4-3.cpp
32 第四章存储分类符和作用城 #include <iostream h> 1/声明ⅰ是全程外部变量 int i; /下面是函数原型 void fu void function-2(void); main( cout<<"i inside main()isI" function-10; void function-1(void) ii* cout<<"i inside function-1()is"<<I<<"n"; function-2(); 1 void function-2(void) i-i+l; cout<<"i inside function-2()is"<<I<<n"; 编译运行该程序得到如下输出结果: i inside main()is0 i inside function-1()is 1 i inside function-2()is 2 在main()中i的输出值是0,因为i没有明确地初始化;在函数function.l() 中,i的输出值是1.i在函数function.1()中不必声明,因为1已经在主函数 ain()的外部声明为全局变量了.在函数functi0n20中,1的输出值又为2, 因为函数function.l()中得到的i的值被保持下来了. 在函数内使用的外部变量可以用cxt©rn来声明.下面是对原始程序的修改,编译器 样会接受,输出结果不变
第四章存储分类符和作用域 33 void function-1(void) extern int i; void function-2(void) extern int i; 必须遵守的规则是,一定要在引用外部变量的函数的外部和前面进行exterr声明, 并且必须放在同一个源代码文件内。对于下面的程序,编译器会产生错误信息: //test4-4.cpp #include <iostream.h> /i声明为外部变量 int i; main() [ i-5; cout<<'i is"<<i<<"\n"; cout<<'j is"<<j<<"\n'; 1 /j在被引用之后声明 int i: Error:Undefined symbolj in function main( 解决这一问题只需把j的声明语句椰到1的声明语句的后面。另外一种修改的办法 是保留程序最初的代码不变,在主函数ain0中,用cxtern来声明i和j
第四章存储分类符和作用城 int i; main(】 extern int i; extern int j; int i: 编译运行该程序会得到如下输出结果: i is 5 在后面的章节里,我们将会学到在C+怎样对数据私有这个概念进行应用。我们建 议读者只在绝对必要时才使用外部变量.因为其作用域是全程的,在整个程序运行期间都 占用存储空间,因此就失去了数据的私有性.在一个相当长的程序中,对于不同时刻,不 同函数中存储在这些全局变量中的值都很难跟踪。 4.5寄存器变量声明 寄存器变量类似于自动变量,它也是局部变量,只在其作用域内有效.但是当变量声 明前面加上关键字register时,就意味着请求编译器在有可用的寄存器时将这一变量存 储在寄存器中。 ■寄存器变量的使用能有利于缩减程序的大小,改进程序的性能。因为对寄存器操作比 对内存中的变量操作要快 下面是合法的寄存器变量声明: register int a;/寄存器变量声明 register char b;//寄存器变量声即 4.6变量期间 ■变量期间是指变量被分配存储空间的那段时间。 按照前面的说法
第四章存储分类符和作用域 静态变量和外部变量在整个程序期间内分配内存。 。自动变量和寄存器变量只在它们所属的程序块或函数内部分配内存。 ■可以通过使用neW操作符和delete操作符来给变量动态地分配内存. 这些操作符将在以后的章节中讲到.。我们现在提到它们是为了让您知道有这些操作。 4.7小 结 本章我们讲述了存储分类符。表4.1说明了讲过的主要概念 表4.1C+中的存储分类符 存储分类符 作用歧 存储器分配 偏译器认初始 值 auto 在声明它的程序块,子程作用城内 无 块或函数内都有效,值不保 在声明它的程序块,子程整个程序翔间 块或函数内部有效,值保持 xtern 只要在所有的函数外部或上整个程序期间 面声明,对于同一文件的 有函数全局可用,值保持 ogister 在声明它的程序块,子程序作用域内 块或函数内部有效,值不伤 持