C++ static关键字详解(全网最全)

1. 全局静态变量

全局变量前加上static,全局变量就成了全局静态变量,存储在全局区即静态存储区,如未初始化则存放在BSS段(Block Started by Sysmbol),初始化为0,全局静态变量在声明它的文件之外是不可见的,准确的来说,从定义之处开始,到文件结尾。

2. 局部静态变量

在局部变量之前加上static,局部变量就变成了一个局部静态变量,存储在静态存储区,如未初始化则存放在BSS段(Block Started by Sysmbol),初始化为0,作用域是该代码块内,代码块外不可见

3. 静态函数

在函数返回类型前加static,函数就定义成了static函数,函数的定义和声明在默认情况下都是extern的,也就是外部可见的,比如外部文件或者外部代码块这种,但是静态函数是外部不可见的,只是在声明他的文件当中可见,函数的实现用static修饰,那么这个函数只能在本cpp中使用,不会和其他cpp中的同名函数引起冲突。

不要在头文件中声明static的全局函数

不要在cpp内声明非static的全局函数

static的函数就不能再叫做全局函数了,外部都使用不了,在cpp内的全局函数声明都最好是static的,避免函数重名的问题,如果想多个cpp文件复用该代码,那就不要在cpp文件内声明了,声明应放到头文件中去。

4. 类的静态成员

类的静态成员可以实现多个对象之间的数据共享,存储在静态存储区,所有对象共用一个静态数据成员,作用域是该类的内部函数。

在C++中为什么一定要先初始化类的静态成员才能使用呢,不是放在静态存储区会自动初始化吗?
  • 这句话“静态成员变量是需要初始化的”是有一定问题的,应该说“静态成员变量需要定义”才是准确的,而不是初始化。
  • 初始化是赋一个初始值,而定义是分配内存
  • 静态成员变量在类中仅仅是声明,没有定义,所以要在类的外面定义,实际上是给静态成员变量分配内存

5. 类的静态函数

类的静态成员函数和类的静态数据成员是一样的,他们都属于类的静态成员,都不是对象成员

类的静态成员函数不能直接访问类的非静态数据成员

为什么类的静态函数不能访问非静态成员?
  • 静态static成员函数不同于非静态函数,它只属于类本身,而不属于每一个对象实例。静态函数随着类的加载而独立存在。与之相反的是非静态成员,他们当且仅当实例化对象之后才存在。也就是说,静态成员函数产生在前,非静态成员函数产生在后,不可能让静态函数去访问一个不存在的东西。
  • 在访问非静态变量的时候,用的是this指针;而static静态函数没有this指针,所以静态函数也确实没有办法访问非静态成员。
用什么方法可以间接访问呢?

使用对象来引用即可,通过传参的方式可以间接调用对象的非静态数据成员

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

USTC暖暖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值