C++常见面试题(七)——static关键字
1.先来介绍它的第一条也是最重要的一条:隐藏。(static函数,static变量均可)
当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。
举例来说明。同时编译两个源文件,一个是a.c,另一个是main.c。
//a.c
char a = 'A'; //全局变量
void msg()
{printf("Hello\n");
}//main.cint main()
{extern char a; // 声明变量a是在其他的文件中定义的printf("%c ", a);extern void msg();//声明函数msg是在其他的文件中定义的msg();return 0;
}
程序的运行结果是:A Hello
为什么在a.c中定义的全局变量a和函数msg能在main.c中使用?前面说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的。但是使用前要加上extern关键字进行声明,这是在其他文件中定义的。
如果加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏。
2.static的第二个作用是保持变量内容的持久。(static变量中的记忆功能和全局生存期)
存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。虽然这种用法不常见。
PS:如果作为static局部变量在函数内定义,它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。即作用域和变量的生命周期没有必然的联系。
#include <stdio.h>int fun(){static int count = 10; //在第一次进入这个函数的时候,变量a被初始化为10!并接着自减1,以后每次进入该函数,areturn count--; //就不会被再次初始化了,仅进行自减1的操作;在static发明前,要达到同样的功能,则只能使用全局变量: }int count = 1;int main(void)
{printf("global\t\tlocal static\n");for(; count <= 10; ++count)printf("%d\t\t%d\n", count, fun());return 0;
}
结果:
global local static1 102 93 84 75 66 57 48 39 210 1
基于以上两点可以得出一个结论:把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。
3.static的第三个作用是默认初始化为0(static变量)
4.static的第四个作用:C++中的类成员声明static(有些地方与以上作用重叠)
在类中声明static变量或者函数时,初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员,这样就出现以下作用:
(1)类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致 了它仅能访问类的静态数据和静态成员函数。
C++常见面试题(七)——static关键字相关推荐
- 七天玩转Redis 第七天打卡 Redis常见面试题及课程总结
七天玩转Redis 第七天打卡 Redis常见面试题及课程总结 主要总结点: 截止到今天,七天玩转Redis课程就马上结束了,学以致用,那么学会了Redis,在找工作时会有哪些面试官爱问的问题呢? 一 ...
- iOS常见面试题总结
1.objective-c常见面试题: 1.OC 语言的基本特点 OC 语言是 C 语言的一个超集,只是在 C 的基础之上加上了面向对象(oop) 的特性; OC 与 Java 语言相同都是单继承,这 ...
- 测试开发岗 - 常见面试题
目录 1. 什么是软件测试, 谈谈你对软件测试的了解 2. 我看你简历上有写了解常见的开发模型和测试模型, 那你跟我讲一下敏捷模型 3. 我看你简历上还写了挺多开发技能的, 那你给我讲讲哈希表的实现流 ...
- Java常见面试题 Java面试必看 (一)
本篇博客是本人收集网上Java相关的资料整理所得,仅供参考. 一.Java基础 1.JDK 和 JRE区别 JDK(Java Development Kit)是针对Java开发员的产品,是整个Java ...
- 测试开发工程师常见面试题
1. CPU 和 GPU的区别 CPU 力气大啥P事都能干,还要协调. GPU 上面那家伙的小弟,老大让他处理图形,这方面处理简单,但是量大,老大虽然能处理,可是老大只有那么几个兄弟,所以不如交给小弟 ...
- 面试1:Java、微服务、架构常见面试题(持续更新中)
Java.微服务.架构常见面试题(持续更新中) 文章目录 Java.微服务.架构常见面试题(持续更新中) ==**Java**== 1.Java概述 (1)JVM.JRE和JDK (2)Java特点 ...
- javaspring框架教程,netty常见面试题
前言 现在刷抖音经常可以看到一些老外街坊,问他们最想把什么带回自己的国家,我听过很多的回答都是:淘宝,支付宝,美食,微信,外卖,高铁等等. 确实如此,随着国家的快速发展吸引了不少国际上羡慕的目光,更让 ...
- Java常见面试题(持续更新)
文章目录 transient 关键字作用 final 关键字作用 封装的作用 HashMap,HashTable,ConcurrentHashMap HashMap不是线程安全的示例 HashMap常 ...
- java多线程常用面试_java的多线程常见面试题
并行和并发有什么区别? (推荐学习:java常见面试题) 并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔发生. 并行是在不同实体上的多个事件,并发是在同一实体上的多个事 ...
- Unity3D常见面试题
Unity3D常见面试题 目录 C#问题 4 1.在类的构造函数前加上static会报什么错?为什么? 4 2.C# StringBuilder类型比string类型的优势是什么? 4 3.C# 函数 ...
最新文章
- 家长会:我的发言稿,女儿的信
- python pyOpenGL安装
- 卷积滤波 英文_《信号与系统》专业术语中英文对照表
- shiro整合ehcache
- 「递归」的正确打开方式,看不懂你打我~
- flex自定义更新UI
- 滴滴App突发Bug:滴滴一下,千元出发
- 利用Node.js为Node.js生成HttpStatusCode辅助类并发布到npm
- 80)PHP,扩展工具类
- JMeter入门教程
- 电视无线dns服务器,电信电视dns遭到劫持,无线网络DNS被劫持了,怎么解决
- 黑盒测试方法(五)正交实验设计方法
- [HNOI 2015]落忆枫音
- Android 开发的五大开源网站
- 免费混合虚拟化OVM数据中心解决方案
- 住宅IP和机房IP有什么区别,爬虫用哪种好?
- 索尔维会议记录软件测试,科学史上的今天:10/30|索尔维会议创立,史上最强科学梦幻明星队...
- win10卸载WSL2记录
- MySql函数 - FIND_IN_SET函数
- 九宫山自驾露营二日游
热门文章
- 苹果数据记录之详细让人不寒而栗
- win10搭建本地文件服务器,windows10本地服务器
- java时间戳计算_java 时间戳 、时间差计算(秒、分钟、小时、天数、月份、年)...
- java中异常处理try块的说法正确的是_下面关于Java中异常处理try块的说法正确的是( )?...
- 从作用域到作用域链,思维脑图+代码示例让知识点一目了然!系列(三)
- 【小白入门】超详细的OCRnet详解(含代码分析)
- JavaWeb(三层构架)
- 黄金受避险影响大涨,但加息前多头难持续
- LeetCode 黑名单中随机数(图解)
- jdk,tomcat安装和配置