|
|
|
|
移动端

1.9.3 static

《程序员面试笔试真题与解析》本书针对当前各大 IT企业面试笔试中特性与侧重点,精心挑选了 3年以来近百家典型 IT企业的面试笔试真题,这些企业涉及业务包括系统软件、搜索引擎、电子商务、手机 APP、安全关键软件等,面试笔试真题非常具有代表性与参考性。本节为大家介绍static。

作者:猿媛之家来源:机械工业出版社|2017-12-06 17:07

有奖调研 | 1TB硬盘等你拿 AI+区块链的发展趋势及应用调研


1.9.3 static

【真题 115】 static关键字的作用是什么? static全局变量与普通全局变量的区别是什么? static局部变量与普通变量的区别是什么? static函数与普通函数的区别是什么?答案:static关键字是 C/C++语言中都存在的关键字,中文译为静态的,它具有以下特性:

1)static全局变量的作用域范围是有限制的,即如果一个变量被声明为静态的,那么该变量可以被模块内所有函数访问,但不能被模块外其他函数访问,它是一个本地的全局变量。而普通全局变量能被其他模块访问。

2)在函数体内,静态变量具有“记忆”功能,即一个被声明为静态的变量在这一函数调用结束后,它的值仍然被保存着,当这个函数下一次被调用的时候,这个静态变量的值仍然是上次调用后的结果(需要注意的是,函数中的静态变量只初始化一次),而函数体内的普通变量没有记忆功能。如下例所示。

  1. #include<stdio.h> 
  2. void fun1(int i)  
  3. {  
  4. static int value = i;  
  5. value+=1;  
  6. printf("%d ", ++value);  
  7. }  
  8. void fun2(int i)  
  9. {  
  10. int value = i;  
  11. printf("%d ", ++value);  
  12. }  
  13. int main()  
  14. {  
  15. printf("fun1:");  
  16. fun1(0);  
  17. fun1(4);  
  18. fun1(7);  
  19. printf("\nfun2:");  
  20. fun2(0);  
  21. fun2(4);  
  22. fun2(7);  
  23. return 0;  

程序的运行结果为:

  1. fun1:2 7 15  
  2. fun2:1 5 8 

函数 fun1中把 value定义为静态变量,因此,它会在第一次调用的时候初始化为 0,由于其具有记忆功能,只会被初始化一次。因此,在调用函数 fun1(0)的时候,函数 fun1内部的 value被初始化为 0,语句 printf("%d ",++value);输出结果为 2;当调用函数 fun1(4)的时候,语句 static int value=i;不会再被执行(只能初始化一次),此时 value的值为 2,因此,打印语句 printf("%d  ",++value)的输出结果为 2+4+1=7,同理,第三次调用函数 fun1(7)时,输出的结果为 15。

而对于普通变量而言,没有记忆功能,每次被调用的时候都需要初始化。调用 fun2函数的时候, value每次都会被初始化为传入的参数,因此,每次输出 ++value的值就是实参 +1。

3)如果一个函数被声明为静态的,那么该函数与普通函数的作用域不同,静态函数的作用域仅在本文件中,它只能被这一模块内的其他函数调用,不能被模块外的其他函数调用,也就是说,这个函数被限制在声明它的模块的本地范围内使用。而普通函数可以被其他模块使用。

【真题 116】下面程序的输出结果是()。

  1. #include<iostream> 
  2. using namespace std;  
  3. int i = 0;  
  4. int fun(int n)  
  5. {  
  6. static int a = 2;  
  7. a++;  
  8. return a*n;  
  9. }  
  10. int main()  
  11. {  
  12. int k = 5;  
  13. {  
  14. int i = 2;  
  15. k += fun(i);  
  16. }  
  17. k += fun(i);  
  18. cout << k;  
  19. return 0;  

A.13 B.14 C.15 D.11答案:D。本题中,整型变量 k首先被初始化为 5,紧接着在一个大括弧的范围内, k的值执行了一次与 fun(i)

的求和操作,由于函数 fun中存在一个静态变量 a,而静态变量的生命周期贯穿整个程序的运行过程,它只初始化一次,因此,第一次调用函数 fun后,a值变为了 3,k的值变为了 5+6=11。由于大括号限定了 int i = 2 的作用域,因此,当第 2次调用函数 fun时,变量 i 是全局变量, int i = 0,此时 k的值与 0相加,仍然为 11,所以,程序输出为 11。所以,选项 D正确。

【真题 117】以下关于类中的 static成员和对象成员的描述中,正确的是()。

A.static成员变量在对象构造时候生成 B.static成员函数在对象成员函数中无法调用

C.虚成员函数不可能是 static成员函数 D.static成员函数不能访问 static成员变量答案:C。对于选项 A,类的 static成员变量属于该类(而非对象),需要在类定义时初始化,不可以在对象的

构造函数中初始化。所以,选项 A错误。对于选项 B,static成员函数在对象成员函数中可以调用,同属于一个类作用域。所以,选项 B错误。对于选项 C,static成员函数不可以声明为 const和 virtual。所以,虚成员函数不可能是 static成员函

数。所以,选项 C正确。对于选项 D,static成员函数只能够访问 static 成员变量。所以,选项 D错误。

【真题 118】在一个 cpp文件里面,定义了一个 static类型的全局变量,下面描述正确的是()。

A.只能在该 cpp所在的编译模块中使用该变量

B.该变量的值是不可改变的

C.该变量不能在类的成员函数中引用

D.这种变量只能是基本类型(例如 int,char),不能是 C++类型答案:A。在 C/C++语言中,static表示静态的意思,由 static修饰的变量通常存放在内存空间的堆上,它不会

因为函数的执行完毕而被销毁。本题中,定义了一个 static类型的全局变量,该变量只能在该 cpp所在的编译模块中被使用。所以,

选项 A正确。对于选项 B,只有 const变量是不可以改变的,而 static变量是可以改变的。所以,选项 B错误。对于选项 C,该变量可以在类的成员函数中引用。所以,选项 C错误。对于选项 D,static既可以修饰基本数据类型,例如 int、char,也可以修饰结构体类型、对象类型。

所以,选项 D错误。

【真题 119】声明常量时通常会用关键字 const和 static,下面关于两者的区别中,说法正确的是()。

A.static表示这个变量可以在其他文件中使用

B.static变量连接期被分配到了 data段,即使是在函数调用中定义也不会在栈中产生,而是在程序加载期就被加入了内存

C.const表面含义是个常量,但实际上还是占据一个内存位置的变量,但是它的值一般是在编译时期就决定了

D.上面说法都不正确

答案:B、C。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

Struts 2权威指南:基于WebWork核心的MVC开发

本书所介绍的Struts 2已经完全超出了Struts 1框架原有的高度,Struts 2建立在Struts 1和WebWork两个框架整合的基础之上,因此提供了更多优...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊