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分析的更多相关文章

  1. const,static,extern 简介

    const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...

  2. 李洪强iOS经典面试题155 - const,static,extern详解(面试必备)

    李洪强iOS经典面试题155 - const,static,extern详解(面试必备) 一.const与宏的区别(面试题): const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽 ...

  3. [C语言 - 6] static & extern

    A. extern函数 一个c文件生成一个obj文件   外部函数:允许其他文件访问.调用的函数(默认函数为外部函数),不允许存在同名的外部函数   my.c //define a extern fu ...

  4. 【语法】修饰符 static extern const

    转载自:http://my.oschina.net/u/2560887/blog/552683 一.C语言中的static的作用 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有 ...

  5. 存储类型auto,static,extern,register的区别 <转>

    变量和函数的属性包括数据类型和数据的存储类别,存储类别指数据在内存中存储方式(静态和动态),包含auto,static,register,extern四种. 内存中.具体点来说内存分为三块:静态区,堆 ...

  6. const define static extern

    const const意味着"只读",欲阻止一个变量被改变,可以使用const关键字 const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p) define #define ...

  7. 【VS开发】static、extern分析总结

    引用请注明出处:http://blog.csdn.net/int64ago/article/details/7396325 对于写了很多小程序的人,可能static和extern都用的很少,因为sta ...

  8. C语言中的static 详细分析

    转自:http://blog.csdn.net/keyeagle/article/details/6708077/ google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大 ...

  9. C语言static 具体分析

    google在最后三页C语言static内容,可找到的资料非常少.无论是长篇大论不知所云的话,在关键位置或跳过,习的人来说參考性不是非常大.所以.我这篇博文博採众家之长,把互联网上的资料整合归类,并亲 ...

随机推荐

  1. Shell习题100例(2)

    找文件差异 grep -f 选项可以匹配到文件a在文件b中所有相关的行(取a中有b中有的) [root@centos-04 tmp]# vim b.txt vvvv root [root@centos ...

  2. Python cos() 函数

    描述 cos() 返回x的弧度的余弦值. 语法 以下是 cos() 方法的语法: import math math.cos(x) 注意:cos()是不能直接访问的,需要导入 math 模块,然后通过 ...

  3. appium操作微信公众号H5 web页面

    安卓微信公众号的H5页面是webview,一般操作需要切换context. 在执行如下步骤,就能直接像识别native样识别webview 1.代码追加: ChromeOptions options ...

  4. mysql-5.7 innodb_file_per_table 详解

    一.innodb_file_per_table 的简要说明: 在很久很久以前也就是说还没有innodb_file_per_table 的那个年代,所有的innodb表的数据都是保存在innodb系统表 ...

  5. 创建Hive/hbase相关联的表异常

    hive> CREATE TABLE hperson(id string, name string,email string) STORED BY 'org.apache.hadoop.hive ...

  6. canvas相关api

    1.线性径变:ctx.createLinearGradient(): var grd=ctx.createLinearGradient(0,0,170,0); grd.addColorStop(0,' ...

  7. ubuntu文件夹默认列表显示

    编辑-->首选项-->视图-->列表视图

  8. Http请求中Content-Type讲解

    http://blog.csdn.net/weichuang_1/article/details/50451496 ****************************************** ...

  9. vi-vim :删除、撤销、恢复删除、复制删除

    删除 1 删除命令 vi命令 操作键 x 删除当前光标处的字符 X 删除光标左边的字符 D 删除从当前光标到本行末尾的字符 J 删除两行之间的换行符 (亦可用于合并两行) dmove 删除从当前光标到 ...

  10. win7语言设置为英语

    控制面板,地区和语言 可以设置格式 键盘和语言 安装显示的语言 选择“可选更新包”,选择语言的语言