static与const

C++中变量的存储类型仅有auto,static,extern,register四种类型。

static:

  1. 修饰普通变量,修改变量的存储区域和生命周期,使变量存储在静态区,在main函数运行前就分配了空间,如果有初始值就用初始值初始化它,如果没有初始值系统用默认值初始化它。
  1. 修饰普通函数,表明函数的作用范围,仅在定义该函数的文件内才能使用。在多人开发项目时,为了防止与他人命令函数重名,可以将函数定位为static。
  2. 修饰成员变量,修饰成员变量使所有的对象只保存一个该变量,而且不需要生成对象就可以访问该成员。
  3. 修饰成员函数,修饰成员函数使得不需要生成对象就可以访问该函数,但是在static函数内不能访问非静态成员。
解释

static 修饰的局部变量

在编译的时候,变量会从栈空间分配到静态堆区。影响局部变量生命周期。本质是改变了局部变量的存储位置,为整个生命周期。静态局部变量储存到进程的全局数据区。

静态成员的所有者是类本身和对象,要满足这个要求,就必然会出现一些规则。比如静态成员函数没有this指针,因为this指针实质是调用成员函数的的对象本身,而静态成员函数也可以通过类本身调用,所以这一块相当于削弱了。还有静态成员不能在类内定义初始化,因为类内只能通过类对象访问。 从这里也可以看出来静态成员不属于类的对象,只是被类对象所共享(可以访问但不占为所有)

举例子:声明一个学生类,定义一个静态成员变量学生总数,通过类对象(学生个体A、B、C......)实现统计学生总数。

静态函数成员必须通过对象名来访问非静态数据成员。

静态成员函数的几个特点:

1.静态成员需要在类外定义,这是因为静态成员不属于类对象,程序运行时,编译器根据static为静态成员变量或函数分配一块静态数据区。这和为类对象分配的对象空间毫无相关。

2.同时引出第二点,静态成员不能访问非静态成员函数和非静态成员对象。因为这些只能通过类对象进行访问。

3.静态成员之间可以相互访问,比如静态成员函数访问静态成员变量和访问静态成员函数

4.非静态成员函数可以任意访问静态成员函数和静态成员变量

总结

隐藏性,在变量或函数用static修饰,或缩小使用范围,将此变量或函数只在本文件中使用,其他文件看不到 比如静态局部变量、静态全局变量

持久性(变量内容)程序一开始就初始化,变量存在静态数据段上,只有程序结束时,变量才会销毁。

在c++中,static可以修饰成员变量,只在该类中可见,也可修饰成员方法。

静态成员方法归类所有,不归对象所有。静态对象成员方法调用不依赖对象,无this指针,不用实例化对象。

static强调变量重复使用同一份,以及在变量在函数体内、变量在模块内函数体在模块内的作用域;

const强调所修饰对象的不可更改,得到常量和常函数。