前言
学习自用,有错麻烦提一下
正文
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虽然不是编译时期常量,也能达到类似效果且;;至于说为什么可以在类内定义static const符号呢?因为它实际上就是constexpr,即编译期常量;也就是说,虽然可以在class内部初始化一个const/constexpr static 数据成员,但是这个初始化并不是我们所理解的常规“初始化”。它只是会在编译期间用该成员的值做替换,比如在用到该const/constexpr static成员的地方,在编译期间就替换成实际的值,比如class Test中定义了成员static const a=10有语句: min(Test::a); //compile time 替换为min(10);
参考资料
- https://zhuanlan.zhihu.com/p/37439983用法总结,涉及到一点点实现原理
- https://www.zhihu.com/question/397086631很多讲到static成员为什么要在类内初始化
- https://zhuanlan.zhihu.com/p/138721801为什么static const可以在类内初始化,cpp primer plus中说了
- https://www.zhihu.com/question/410796312被声明为static const的类成员有什么作用
TODO
为什么static const就可以在类内初始化为什么static不能在类内初始化,而java的static可以如果没有static const,从前只能用enum来模拟这个功能,或者用#define是啥\C++中被声明为static const的类成员有什么作用?- const为什么也不能在类中初始化,
- static变量只能在初始化列表中初始化?
本文详细探讨了C++中的static关键字,包括static成员变量、成员函数、全局变量和局部变量的用法及特点。强调了static成员变量的访问限制和内存分配区域,static成员函数无法访问非静态成员,以及static全局变量的作用域限制。同时讨论了static为什么不能在类内初始化,但static const成员变量却可以,并解释了其背后的编译原理。最后提出了待解决的问题,如Java中static的处理方式与C++的差异。

608

被折叠的 条评论
为什么被折叠?



