打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C/C++中Static的作用详述
userphoto

2012.08.13

关注

C/C++Static的作用详述

 

C++static有两种用法:

面向过程程序设计中的static面向对象程序设计中的static

 

前者应用于普通变量和函数,不涉及类;

后者主要说明static在类中的作用。

 

1>>面向过程程序设计中的static


(a)静态局部变量

该变量在全局数据区分配内存;   

静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;   

静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;  

它始终驻留在全局数据区,直到程序运行结束。

但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束;

(b) )静态全局变量

static修饰全局变量:含义于修饰函数相同,限制变量的引用范围为本模块;

(c) static饰函数

static修饰函数:限制函数的可见范围。

static修饰的函数可被其它模块引用调用,static修饰后限制函数只可以被本模块(本模块:c++中可以理解为.cpp结尾的文件名.

调用,其它模块无法引用

2>>面向对象程序设计中的static

静态成员和静态成员函数
  
如果一个变量是类的一部分,但却不是该类的各个对象的一部分,它就被成为是一个static静态成员。一个static成员只有唯一的一份副本,而不像常规的非static成员那样在每个对象里各有一份副本。

 

同理,一个需要访问类成员,而不需要针对特定对象去调用的函数,也被称为一个static成员函数。

类的静态成员函数只能访问类的静态成员(变量或函数)

 

 

3>>C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条

 static的三条作用做一句话总结。

首先static的最主要功能是隐藏,

其次因为static变量存放在静态存储区,

所以它具备持久性和默认值0.

 (1)先来介绍它的第一条也是最重要的一条:隐藏。

  当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c.

  下面是a.c的内容 char a = 'A'; //global variable

  void msg()

  {

  printf("Hello\n");

  }

  下面是main.c的内容 int main(void)

  {

  extern char a; // extern variable must be declaredbefore use

  printf("%c " a);

  (void)msg();

  return 0;

  }

  程序的运行结果是:

  A Hello

  你可能会问:为什么在a.c中定义的全局变量a和函数msg能在main.c中使用?前面说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的。

  如果加了static,就会对其它源文件隐藏。例如在amsg的定义前加上staticmain.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。

  (2)static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。虽然这种用法不常见,但我还是举一个例子。 #include

  int fun(void){

  static int count = 10; // 事实上此赋值语句从来没有执行过

  return count--;

  }

  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 static

  1 10

  2 9

  3 8

  4 7

  5 6

  6 5

  7 4

  8 3

  9 2

  10 1

  (3)static的第三个作用是默认初始化为0.其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。如果定义成静态的,就省去了一开始置0的操作。再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加'\0’太麻烦。如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是'\0’。不妨做个小实验验证一下。 #include

  int a;

  int main(void)

  {

  int i;

  static char str[10];

  printf("integer: %d; string: (begin)%s(end)" a str);

  return 0;

  }

  程序的运行结果如下integer 0; string (begin)(end)

最后对static的三条作用做一句话总结。

首先static的最主要功能是隐藏,

其次因为static变量存放在静态存储区,

所以它具备持久性和默认值0.

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C语言中,static的作用
变量的作用域和储存类型
c语言中static 用法总结 - imjacob的BLOG - 52RD R&D Blo...
C/C++ 中 static 的用法全局变量与局部变量 | 菜鸟教程
c语言中static关键字用法详解
C语言总结
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服