C++/C 常量
1. #define 宏常量为字面常量,编译前就被替换。
2. const常量:
C为值不能修改的变量,因此会分配内存空间,并且默认是外连接的,因此const定义在头文件并被多个c文件包含时,链接会出错。
C对于static const,static const定义在头文件并被多个c文件包含时,每个c文件拥有常量的独立实,缺点:例如const char* a ="aa",此时每个c文件会创建一个字面常量(基础数据类型初始化完后不需要)以及内存拷贝项,浪费空间。
C++对于基本数据类型的常量,会放在符号表中,而ADT对象或extern的基本数据类型则会分配存储空间。
C++对常量类型(包含基本数据类型)的取址,会在内存中创建一个拷贝,地址访问的是拷贝不是常量,因此可以修改值。
C++的const常量默认是内连接的,每个cpp文件编译时会单独对常量分配内存空间,因此const定义在头文件并被多个c文件包含时,链接会进行常量合并,不会出错。
C++编译器会对其作静态类型安全检查。
3. 契约常量:
int b;
int f(const int &a);
f(b); b看作为const
4. 类的常量:
非静态const修饰的数据成员是属于每个对象成员的,生命周期内为常量。因此不能在类声明中初始化非静态const数据成员,只能通过类的构造函数的初始化列表中初始化。
在类中定义常量,如:
class a
{
int k[SIZE];
};
只能通过枚举类型或静态const修饰的数据成员定义,如:
class a
{
enum
{
SIZE = 1;
};
int k[SIZE];
static const int SIZE = 1;
};

浙公网安备 33010602011771号