前言
学习自用,有错麻烦提一下
正文
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虽然不是编译时期常量,也能达到类似效果且;;至于说为什么可以在类内定义