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;

};

posted @ 2017-08-25 23:00  一种微笑  Views(209)  Comments(0)    收藏  举报