1.const
-
它是一个类型修饰符,可以给任何对象附加上“只读”属性,保证安全;
-
const修饰的还是变量,是运行期的,不是编译期的。编译时并不知道该变量的值。
-
它可以修饰引用和指针,“const &”可以引用任何类型,是函数入口参数的最佳类型;
-
它还可以修饰成员函数,表示函数是“只读”的,const 对象只能调用 const 成员函数。
2.volatile
-
它表示变量可能会被“不被察觉”地修改,禁止编译器优化(替换成常数),影响性能,应当少用。
-
多线程下的volatile:该关键字的作用是防止优化编译器把变量从内存装入CPU寄存器中。如果变量被装入寄存器,那么两个线程有可能一个使用内存中的变量,一个使用寄存器中的变量,这会造成程序的错误执行。volatile的意思是让编译器每次操作该变量时一定要从内存中真正取出,而不是使用已经存在寄存器中的值。
3.mutable
- 它用来修饰成员变量,允许 const 成员函数修改,mutable 变量的变化不影响对象的常量性,但要小心不要误用损坏对象。
4.static
对于一个完整的程序,在内存中的分布情况如下:
- 栈区: 由编译器自动分配释放,像局部变量,函数参数,都是在栈区。会随着作用域退出而释放空间。
- 堆区:程序员分配并释放的区域,像malloc©,new(c++)
- 全局数据区(静态区):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束释放。
- 代码区
1.静态局部变量:用于函数体内部修饰变量,这种变量的生存期长于该函数。
总结一下,静态局部变量的特点(括号内为note:2,也就是局部变量的对比):
(1)该变量在全局数据区分配内存(局部变量在栈区分配内存);
(2)静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化(局部变量每次函数调用都会被初始化);
(3)静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0(局部变量不会被初始化);
(4)它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,也就是不能在函数体外面使用它(局部变量在栈区,在函数结束后立即释放内存);
2.静态全局变量 :定义在函数体外,用于修饰全局变量,表示该变量只在本文件可见。
静态全局变量不能被其它文件所用(全局变量可以( 通过extern)),实现文件隔离(当然通过#include可以);
3.静态函数:准确的说,静态函数跟静态全局变量的作用类似:
1.静态函数不能被其它文件所用;
2.其它文件中可以定义相同名字的函数,不会发生冲突;
4.静态数据成员: 用于修饰 class 的数据成员,即所谓“静态成员”。
这种数据成员的生存期大于 class 的对象(实体 instance)。静态数据成员是每个 class 有一份,普通数据成员是每个 instance 有一份,因此静态数据成员也叫做类变量,而普通数据成员也叫做实例变量。
静态数据成员存储在全局数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义(在类外初始化)。
对于非静态数据成员,每个类对象(实例)都有自己的拷贝。而静态数据成员被当作是类的成员,由该类型的所有对象共享访问,对该类的多个对象来说,静态数据成员只分配一次内存。
5.静态成员函数:用于修饰 class 的成员函数。
静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
非静态成员函数可以任意地访问静态成员函数和静态数据成员;
静态成员函数不能访问非静态成员函数和非静态数据成员;