C++中的static关键字

原创 2016年08月30日 18:55:51

static:是C++中一个常见的修饰符,它被用来控制变量的存储方式和可见性,下面从static的几个用法中来谈论static
1.修饰变量
1)修饰全局变量
修饰全局变量时,表明一个全局变量只对定义在同一文件中的函数可见
2)修饰局部变量
修饰局部变量时,表明该变量的值不会因为函数终止而丢失
注意:如果作为static局部变量在函数内定义,它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它

static的影响:把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。

存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。虽然这种用法不常见

2.修饰函数
1)修饰普通函数
修饰函数时,表明该函数只在同一文件中调用
2)修饰数据成员
修饰类的数据成员,表明对该类所有对象这个数据成员都只有一个实例。即该实例归 所有对象共有
3)修饰类成员函数
修饰类成员函数,和修饰数据成员一样

3.在类中使用static
需要一个数据对象为整个类而非某个对象服务,同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见
1)静态数据成员
1、静态数据成员在定义或说明时前面加关键字static
2、静态成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式如下:
 <数据类型><类名>::<静态数据成员名>=<值>
这表明:
(1) 初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆。
(2) 初始化时不加该成员的访问权限控制符private,public等。
(3) 初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员。
3、静态数据成员是静态存储的,它是静态生存期,必须对它进行初始化。
4、引用静态数据成员时,采用如下格式:
  <类名>::<静态成员名>
如果静态数据成员的访问权限允许的话(即public的成员),可在程序中,按上述格式来引用静态数据成员

在类中,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。
使用静态数据成员可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率。
2)静态成员函数
静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。因此,对静态成员的引用不需要用对象名

在类中声明static变量或者函数时,初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员,这样就出现以下作用
(1)类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致 了它仅能访问类的静态数据和静态成员函数。
(2)不能将静态成员函数定义为虚函数。
(3)由于静态成员声明于类中,操作于其外,所以对其取地址操作,就多少有些特殊 ,变量地址是指向其数据类型的指针 ,函数地址类型是一个“nonmember函数指针”。
(4)static并没有增加程序的时空开销,相反她还缩短了子类对父类静态成员的访问 时间,节省了子类的内存空间。
(5)静态数据成员是静态存储的,所以必须对它进行初始化。 (程序员手动初始化,否则编译时一般不会报错,但是在Link时会报错误)
(6)为了防止父类的影响,可以在子类定义一个与父类相同的静态变量,以屏蔽父类的影响。这里有一点需要注意:我们说静态成员为父类和子类共享,但我们有重复定义了静态成员,这会不会引起错误呢?不会,我们的编译器采用了一种绝妙的手法:name-mangling 用以生成唯一的标志

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

C++中static关键字总结

  • 2014年09月24日 15:05
  • 120KB
  • 下载

C++的static关键字.doc

  • 2012年04月28日 14:08
  • 41KB
  • 下载

C/C++中static关键字作用总结

1.先来介绍它的第一条也是最重要的一条:隐藏。(static函数,static变量均可)当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。举例来说明。同时编译两个源文件,...

C/C++的static关键字

static主要有三个作用: (1)局部静态变量 (2)外部静态变量/函数 (3)静态数据成员/成员函数  前两种C和C++都有,第三种仅在C++中有,下面分别作以下介绍: 一、局部静态...

C++关键字static,你必须知道的语义

1.所有被static修饰的变量都被存储到全局存储区,因为static数据的生命周期与全局函数一样,拥有一样的“static enduration”。注意,被static修饰的常量并没有这个性质,比如...

浅谈C/C++中的static和extern关键字

static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性。extern, "C"是使C++能够调用C写作的库文件的一个手段,如果要对编译器提示使用C的方式来处理函数的话,那么就要使用ex...
  • z_l_l_m
  • z_l_l_m
  • 2014年04月16日 10:01
  • 503

C++ 之 static 关键字

三大作用: 1)在函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变(该变量存放在静态变量区)。 2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但...

C++关键字static的用法

1、cpp文件中的全局静态变量 全局内的声明: static int a=0; 这样的静态全局变量就只能被该cpp文件所用,不能被其他cpp文件共享。 若不声明static: int a=0...

C/C++中static关键字及变量存储位置总结

static关键字及变量存储位置总结 今天看博文时,看到了c++的static关键字的一些总结,还涉及到了一些代码的存储位置,为了有时间的时候能够看一下,还是自己把它给摘抄下来吧。 C...

C++中的static 关键字

C++中的static 关键字
  • ljx0305
  • ljx0305
  • 2011年05月04日 14:03
  • 588
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++中的static关键字
举报原因:
原因补充:

(最多只允许输入30个字)