cpp的static的实现

前言

学习自用,有错麻烦提一下

正文

static成员变量

static修饰的值会在静态区分配空间,是在编译时期就分配了空间,(那么在没运行时就占用了可执行文件的大小吧),

可以把static与全局变量作比较,实际上的实现也是像全局变量一样额外放一个地方,全局变量放在全局区,静态变量放在静态区局区,不同之处就在于static的类成员是指定只能类来访问的,相当于static成员变量做了访问限制的全局变量

static成员函数

不同于static的成员变量,static修饰的成员函数在代码区分配内存(函数都是在代码区分配的吗?),另外静态成员函数是不能访问类的非静态成员的,这个和全局变量一个意思,可能是因为生命周期不同的考虑,而编译器故意做的限制,

static全局变量

static如果修饰全局变量,会把作用域限制到单个文件中,且此声明会放在静态区中(好像有全局区的情况?),(它是怎么限制到只有单个文件的啊,阻止ld的链接吗?)

对于static全局函数,也是同一个道理,只给当前文件使用

static局部变量

在局部变量定义static,也相当于是一个全局变量,但是只有这局部作用域可以访问,这个static局部变量是分配在全局区的(为什么不是静态区呢)

static为什么不能类内初始化

类内初始化static变量就算编译能通过,链接不能通过??任何include了这个类的定义的文件里都会包含这个全局变量,linker会出错的,换句话说,类的static变量像全局变量可以看成全局变量,如果被多个文件包含了这个定义了这个类的头文件会导致重复定义的链接保存,,看参考资料2,不过C++17好像就不需要这样了

static const成员变量

作用是类的内部常数,const不可修改,enum也能达成此效果,即像static一样在编译时期分配,或者说叫编译器常量,,用#define虽然不是编译时期常量,也能达到类似效果且;;至于说为什么可以在类内定义

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值