Const
1. const限定符既可以在类型前也可以在类型后
const int a;和int const a;等价
同理const int * p和int const * p等价,都是指向常量的指针
而int * const p才是指向变量的常指针。
Char * const a[],a是一个常数组,指向的地址不可变,但地址上的内容可变,即a[0]不可变,但a[0][0]可变。
2. 类的成员函数声明后加const表示恒态函数,不能改变类的数据成员,不能调用非const成员函数,相当于this指针是const的。
同理const对象也不能调用非const成员函数。
成员变量前加mutable就可以被恒态函数或者const对象访问
3. Const默认是内部连接的,也就是不能被其它文件访问,要在其它程序中访问必须指定为extern。
定义:extern const int SIZE = 10;
声明:extern const int SIZE;
Enum inline union static 类的定义 都是内部连接
4. Const引用,指向const对象的引用
Const int x = 1024;
Const int &r = x;
引用本身就不能修改所绑定的对象,必须在定义时初始化。
5. const int a = 1; int * p = (int *)&a; *p = 2; 修改了const对象的值
此时a和*p的值不相同,因为编译器会把a替换成1。用volatile关键字可以拒绝优化。
Volatile
该值可能在程序未监测到的情况下被改变,编译器不能优化
volatile变量可以是const的,如只读状态寄存器
volatile变量 不能*p * *p 因为值可能中途改变 要先存下当前值
enum
enum 枚举名{ 枚举值表 };
enum weekday{ sun,mon,tue,wed,thu,fri,sat }; 值默认从0开始
enum weekday a,b,c;
枚举变量赋值a=sun; 如果用数字必须强制类型转换a=(enum weekday)2;
static
静态全局变量和静态局部变量都在全局数据区分配内存
静态全局变量和静态函数不能在其它文件中使用(内部连接)
类的静态成员变量不能在类声明中定义 只能在里面声明 然后在外面定义
声明static int x; 定义int A::x = 0; (声明时要static 在类声明外定义时不用再加)而静态成员函数两处都可以
(static const int x = 0;可以在里面初始化,仍要在外面定义)
静态成员变量访问 a.x 或 A::x
静态成员函数没有this指针 所以只能访问静态成员变量和静态函数