static关键字

Static关键字

Static名为静止的,静态的,C++中的static关键字可以修饰变量、函数和类的成员或方法,并且分别有不同的作用,这篇文章准备总结下static的用法。

Static修饰变量

  • 全局变量:static修饰全局变量,表示全局静态变量。
  1. 未初始化时储存在.bss段,初始化后储存在.data段,全局静态变量必须在程序开始运行时就存在,因此定义全局静态变量的声明必须在main()函数前。
  2. Static修饰的全局变量,只能在本文件中访问,即使通过extern外部声明也无法访问其他文件中的静态全局变量,否则会在编译的链接阶段报错。如果必须访问,可以通过include头文件来访问。
  • 局部变量:static修饰局部变量,表示静态局部变量。
  1. 静态局部变量在声明时初始化,储存在.data段,当离开局部变量作用域时,静态局部变量不会被销毁,但也无法访问,下一次进入静态局部变量的作用域时,依然访问的是这个静态局部变量。
  2. C++11以后规定,同一个静态局部变量被多个线程同时初始化时,只能有一个线程初始化这个静态局部变量,其他线程会阻塞在入口处等待初始化完成,完成后被阻塞的线程可以继续访问该静态局部变量。这在懒汉单例模式中得到了很好的应用,极大地简化了代码。

Static修饰函数

Static修饰函数,只能在本文件中访问,其他文件无法使用这个函数。即使通过extern外部声明也无法访问,否则会在编译的链接阶段报错。如果必须访问,可以通过include头文件来访问。

Static修饰类成员变量

Static修饰类的成员变量,表示该成员变量是属于类的,而不是属于类的某个实例的,未初始化时储存在.bss段,初始化后储存在.data段。也就是说,即使一个类被实例化了多次,每个实例在访问静态成员变量的时候,访问的都是同一个静态成员变量,并且即使类未被实例化,也可以访问静态成员变量。
静态成员变量和静态全局变量一样,需要在程序开始运行时就存在,因此其声明的位置会收到限制,通常在以下三个位置声明:

  1. Main()函数之前;
  2. 类外初始化;
  3. 类内const初始化

Static修饰类成员方法

Static修饰类的成员方法,表示该成员方法是属于类的,而不是属于类的某个实例的。对类的非静态成员方法,调用时参数中都隐式地传入了this指针,而静态成员方法则不会传入this指针,因此在静态成员方法中,无法访问实例的成员变量,只能访问静态成员变量。静态成员方法由于不需要访问this指针,因此不需要实例化类就可以访问。

不能被static修饰的函数

由于static的特殊性质,并不是所有的函数都可以被static修饰,这里总结下不能被static修饰的函数类型:

  1. 构造函数和析构函数。构造函数和析构函数都是对类实例进行操作,而static修饰的类成员方法是属于类的,显然不能修饰构造函数和析构函数。
  2. 虚函数。虚函数是一种运行时多态,在运行时通过类实例头部的vptr指针才能确定调用的函数,而类静态成员方法不依赖于实例。
  3. Const修饰的函数。Const指针修饰函数,作用是保证类成员变量不被修改,实质是修饰this指针,而类静态成员方法是没有this指针的。
    以上几种函数,在编译阶段的语法检查时均会报错。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值