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!";
常量可以在头文件中定义和初始化,也可以在源文件中定义并初始化,但是两者差别较大:
①如果在头文件中定义并初始化,那么包含了头文件的每一个编译单元不仅会为每一个常量指针常量创建一个单独的拷贝项,而且也会为长长的字符串常量创建一个独立的拷贝项,就相当于在每一个编译单元内分别定义和初始化每一个常量一次。
②如果在头文件中声明所有常量指针常量,而在源文件中定义并初始化它们,则每一个包含该头文件的编译单元访问的不仅是常量指针常量的唯一实体,而且字符串常量常量也是唯一实体,这样就大大节省了内存,而且不影响效率。
- C++编程常见错误之-类中的常量
- C语言编程中的常见错误总结
- c编程常见错误
- 数组编程中的常见错误
- 原创:常见C编程错误
- c/c++常见编程错误
- 网络编程中的常见陷阱之 0x十六进制数(C++字面值常量)
- C/C++高质量编程之常量
- 列举编程中的常见错误和解决方案
- 编程面试中的十个常见错误
- 编程面试中的十个常见错误
- 编程面试中的十个常见错误
- 编程面试中的十个常见错误
- 编程面试中的十个常见错误
- web编程中的几种常见错误
- R语言编程中的常见错误
- c语言编程的常见错误
- C语言编程中常见的错误
- 给Java程序员的几条建议
- 三大链表之struct list_head
- 【未完待续.....】C++字符串流 istringstream 和 ostringstream 的用法
- JavaFX Controller通信解决方案
- arm-linux-gcc -v 查看不了版本号 没有那个文件或目录
- C++编程常见错误之-类中的常量
- HDOJ 3787 A+B(字符串数模拟)
- 集合划分问题
- ubuntu 安装VTK
- Android Studio Rename the Project
- 快速排序
- Android真机测试访问本地服务器
- Java初级笔记-第二章
- BZOJ P1001 [BeiJing2006]狼抓兔子