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

本文探讨了C++中const与#define的区别,包括数据类型安全检查、调试支持及宏替换可能引发的问题。同时介绍了类中常量的正确使用方法,如枚举常量和static const的使用,并对比了C与C++中const符号常量的不同行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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!";

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值