C++编程常见错误之-类中的常量

来源:互联网 发布:淘宝c店 职业打假人 编辑:程序博客网 时间:2024/05/07 21:04

1.const与#define的比较

两点:
1.cosnt常量有数据类型,而宏常量没有数据类型,编译器可以对前者进行静态数据类型安全检查,而对后者只进行字符替换,没有安全检查,并且会在字符替换时可能会产生意料不到的错误(边际效应)。

2.有些集成化的调试工具可以对const常量进行调试,但是不对宏常量进行调试。

2.类中的常量
2.1错误用法:

//类中的常量class A{public:    const int SIZE = 100;  //注意,并非期望的全局常量,因为每个类都会会有这样一个常量    int array[SIZE];  //错误,未知的SIZE,因为在类的对象被创建之前,编译器无法知道SIZE的值是什么};

2.2常量正确用法一 类中枚举常量

class A{public:    enum    {        SIZE1 = 100,  //枚举常量        SIZE2 = 200    };    int array1[SIZE1];    int array2[SIZE2];};

提示:枚举常量不会占用对象的存储空间,它在编译时会被全部求值,更何况它定义的是一个匿名枚举类型。
枚举类型的缺点是:不能表示浮点数(如PI=3.14159)和字符串。

2.3常量正确用法二  static const

class A{public:    static const int SIZE1 = 100; //枚举常量    static const int SIZE2 = 200;    int array1[SIZE1];    int array2[SIZE2];};

提示:有的编译器可能会要求必须在类外初始化静态数据成员。

另外3.1
,在C和C++中定义常量是有区别的。
C程序中const符号常量定义的默认连接类型(Linkage)是extern的,即外链接(extern Linkage)就像全局变量一样。如果在源文件中定义定义,除非明确改变它的连接类型为内连接,否则其他编译单元就可以通过extern声明来访问它。

但是在C++程序中,const 符号常量定义的默认连接类型却是static的,即内连接。

3.2
什么常量最浪费空间呢?答案是字符串常量,尤其是较长的字符串常量。
所以我们常常这样定义它们:

const char* const NO_MEMORY="There is no enough memory!";

常量可以在头文件中定义和初始化,也可以在源文件中定义并初始化,但是两者差别较大:
①如果在头文件中定义并初始化,那么包含了头文件的每一个编译单元不仅会为每一个常量指针常量创建一个单独的拷贝项,而且也会为长长的字符串常量创建一个独立的拷贝项,就相当于在每一个编译单元内分别定义和初始化每一个常量一次。

②如果在头文件中声明所有常量指针常量,而在源文件中定义并初始化它们,则每一个包含该头文件的编译单元访问的不仅是常量指针常量的唯一实体,而且字符串常量常量也是唯一实体,这样就大大节省了内存,而且不影响效率。

0 0
原创粉丝点击