static、extern分析
1.extern
extern在变量声明中有这样一个作用:你要在demo2.cpp中引用demo1.cpp中的一个全局变量,就要在demo2.h中用extern来声明这个全局变量(或者在demo1.h中声明,demo2.cpp中引入demo1.h)。
demo1.h代码:
demo1.cpp代码:
demo2.cpp代码:
2.static
static的最主要功能是隐藏,其次因为static变量存放在静态存储区,它具备持久性和默认值0。
1.静态全局变量
在声明它的整个文件是可见的,而在文件之外是不可见的。
上述extern的例子中已经表明,demo1.cpp中 static 修饰的全局变量 g_sniii,即便是在 demo1.h 中加了extern声明,在demo2.cpp中仍然无法使用。
2.静态局部变量
在上述demo1.cpp中的printStr()中定义一个静态局部变量,和一个局部变量
在demo2.cpp中如下调用:
运行结果:
这是因为:
1.静态局部变量被编译器放在全局存储区,所以它虽然是局部的,但是在程序的整个生命周期中存在。
2.静态局部变量如果没有被用户初始化,则会被编译器自动初始化赋值0,以后每次调用该静态局部变量的时候,都从全局存储区读取上次修改之后的值,而不会每次都初始化。
所以上述例子,两次调用printStr()之后,静态局部变量siii值为2。
3.static函数
问:
多个对象会共享一组成员函数,编译器不会为每个对象都存储一个成员函数,而是将类的成员函数存储在某个单独的空间。(注意:逻辑上成员函数是属于对象的,因为虽然函数体相同,但是其中访问的数据成员是不同的,故为了节约空间所以才采取了这种物理实现)这种存储策略就会带来一个问题,当对象调用成员函数时,若此成员函数访问了对象的数据成员,成员函数如何知道该数据成员属于哪个对象?
答:
//编译器为每个成员函数隐性地添加一个类的指针类型的参数(如A * this),当对象在成员函数中调用成员函数时,编译器会将该对象的首地址传递给该成员函数,这样下面的调用
A a;
a.fun()
{
cout<<value<<endl;
}
//实际上就成了
a.fun()
{
cout<<this->value<<endl;
}
//那this指针又和静态成员函数有什么联系呢?
//静态成员函数和静态数据成员的性质相似,它们都是独立于对象而属于类的。静态成员函数不属于对象,所以它没有this指针,没有了this指针那么静态成员函数也就无法访问类的非静态数据成员。
下面是中兴通讯2012校招笔试题的一道问答题:
1. static全局变量与普通的全局变量有什么区别 ?
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。
这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
static全局变量只初使化一次,防止在其他文件单元中被引用
2. static局部变量和普通局部变量有什么区别 ?
把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
static局部变量只被初始化一次,下一次依据上一次结果值
3. static函数与普通函数有什么区别?
static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static修饰的函数),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件.
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
static、extern分析的更多相关文章
- const,static,extern 简介
const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...
- 李洪强iOS经典面试题155 - const,static,extern详解(面试必备)
李洪强iOS经典面试题155 - const,static,extern详解(面试必备) 一.const与宏的区别(面试题): const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽 ...
- [C语言 - 6] static & extern
A. extern函数 一个c文件生成一个obj文件 外部函数:允许其他文件访问.调用的函数(默认函数为外部函数),不允许存在同名的外部函数 my.c //define a extern fu ...
- 【语法】修饰符 static extern const
转载自:http://my.oschina.net/u/2560887/blog/552683 一.C语言中的static的作用 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有 ...
- 存储类型auto,static,extern,register的区别 <转>
变量和函数的属性包括数据类型和数据的存储类别,存储类别指数据在内存中存储方式(静态和动态),包含auto,static,register,extern四种. 内存中.具体点来说内存分为三块:静态区,堆 ...
- const define static extern
const const意味着"只读",欲阻止一个变量被改变,可以使用const关键字 const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p) define #define ...
- 【VS开发】static、extern分析总结
引用请注明出处:http://blog.csdn.net/int64ago/article/details/7396325 对于写了很多小程序的人,可能static和extern都用的很少,因为sta ...
- C语言中的static 详细分析
转自:http://blog.csdn.net/keyeagle/article/details/6708077/ google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大 ...
- C语言static 具体分析
google在最后三页C语言static内容,可找到的资料非常少.无论是长篇大论不知所云的话,在关键位置或跳过,习的人来说參考性不是非常大.所以.我这篇博文博採众家之长,把互联网上的资料整合归类,并亲 ...
随机推荐
- win7 64 安装scikit-learn
1. scikit-learn简单介绍 scikit-learn是一个基于NumPy.SciPy.Matplotlib的开源机器学习工具包.採用Python语言编写.主要涵盖分类. 回归和聚类等算法, ...
- python中杂乱问题
1 字符串格式化中的格式指定 format_spec ::= [[fill]align][sign][#][][width][,][.precision][type] fill ::= <any ...
- javascript限定输入textarea输入长度
<textarea id="content" onkeyup="limitLength(this.value,'512','content')"> ...
- 测试使用Word发布博客
Word发布地址:http://www.cnblogs.com/xwgli/services/metablogapi.aspx
- 在线升级java的版本
真接rpm包安装javaxxxx.rpm 然后调整/etc/profile 如下: # tail -n /etc/profile JAVA_HOME=/usr/java/jdk1..0_45 PATH ...
- angular学习笔记(十七)-路由和切换视图
本篇介绍angular中如何通过判断url的hash值来显示不同的视图模板,并使用不同的控制器: 下面,通过一个例子,来一步一步说明它的用法: 我们要做一个邮箱应用,打开的时候显示的是邮件列表: 然后 ...
- div,contenteditable编辑器之ctrl+enter换行,enter发送
//回车发消息 $scope.keyDownSend = function ($event) { var keycode = window.event?$event.keyCode:$event.wh ...
- 安装Tomcat配置环境变量
我是从官网下载的zip,没有用installer. 从目前的情况来看,只要你配置好了JAVA_HOME, CLASSPATH, PATH,那么剩下的,目前看来,就只要配置好CATALINA_HOME即 ...
- java面试2
1.面向对象的特征有哪些方面 1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽 ...
- 【火狐FireFox】同步失败后,书签被覆盖,如何恢复书签
问题场景: 使用公司的电脑,下载安装火狐,登录个人帐号后,火狐会自动开始同步书签.但有时候会同步失败,比如登录之前选的是[本地服务],而最新的书签都是在[全球服务]理,那么很有可能同步到的是N久之前的 ...