static关键字的作用

单例模式


1.静态变量和全局变量

在某函数体内的静态局部变量作用域为该函数体内,但是退出该函数时,该静态变量继续存在,但不能够被使用。

全局变量为整个程序所使用,静态全局变量只能在定义该变量的.cpp或.c文件中使用,不能被外部使用。修饰变量为全局变量,会破坏C++面向对象的封装性。

★ 修饰变量为局部或全局变量

★ static修饰的变量在函数体内为局部变量 


PS:同全局变量相比,使用静态数据成员有两个优势: 

1.  静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性; 
2.  可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能;

 

2.C++中的类数据成员声明为static

对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员,无论定义多少个该类的对象,静态数据成员只分配一次内存,在程序中也只有一份拷贝,被所有类对象共享访问,而不是属于某个类对象。即,静态数据“成员唯一且共享”。静态数据成员主要用在各个类对象拥有某种共同属性的场合。无论创建多少类对象,都共享一份静态数据成员,节省存储空间,而且方便修改,比如银行存款类的利息可定义为静态数据,一旦利息需要改变,只需修改一次。


PS:静态数据成员的初始化和访问
• 与一般数据成员初始化不同,静态数据成员是静态存储,必须对其初始化(定义),不然在链接时会报错,而且定义时要分配内存,因此静态数据成员必须在类内声明,在类外定义。静态数据成员初始化的格式为:
<数据类型><类名>::<静态数据成员名>=<值> 
• 类的静态数据成员有两种访问形式:
<类对象名>.<静态数据成员名>或 <类名>::<静态数据成员名>

3.C++中的类函数成员声明为static

 在类中声明static变量或者函数时,初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员,这样就出现以下作用:

(1) 类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致了它仅能访问类的静态数据和静态成员函数。而非静态成员函数既可以访问普通成员数据,也可以访问静态数据成员。 

(2) 静态成员函数不可为虚函数。为了防止父类的影响,可以在子类定义一个与父类相同的静态变量,以屏蔽父类的影响。这里有一点需要注意:我们说静态成员为父类和子类共享,但我们有重复定义了静态成员,这会不会引起错误呢?不会,我们的编译器采用了一种绝妙的手法:name-mangling 用以生成唯一的标志

(3) 由于静态成员声明于类中,操作于其外,所以对其取地址操作,就多少有些特殊 ,变量地址是指向其数据类型的指针 ,函数地址类型是一个“nonmember函数指针”。

(4) 由于静态成员函数没有this指针,所以就差不多等同于nonmember函数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值