C++ 常量

本文探讨了C和C++语言中常量的重要性及其定义方式,对比了宏常量与const常量的区别,并介绍了如何在类中正确使用常量。

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

常量是一种标识符,它的值在运行期间恒定不变。C语言用 #define来定义常量(称为宏常量)。 
C++ 语言除了 #define外还可以用const来定义常量(称为const常量)。 
1 为什么需要常量  
如果不使用常量,直接在程序中填写数字或字符串,将会有什么麻烦? 
(1)程序的可读性(可理解性)变差。程序员自己会忘记那些数字或字符串是什么意思, 
用户则更加不知它们从何处来、表示什么。 
(2)在程序的很多地方输入同样的数字或字符串,难保不发生书写错误。 
(3)如果要修改数字或字符串,则会在很多地方改动,既麻烦又容易出错。 
【规则1】 尽量使用含义直观的常量来表示那些将在程序中多次出现的数字或字符串。 
例如: 
#define            MAX   100     /*  C语言的宏常量  */  
const int          MAX = 100;        //  C++ 语言的const常量 
const float     PI = 3.14159;    //  C++ 语言的const常量 
2 const 与 #define的比较 
C++ 语言可以用const来定义常量,也可以用 #define来定义常量。但是前者比后者有更多的优点: 
(1) const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换 
可能会产生意料不到的错误(边际效应)。 
(2) 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。 
【规则2】在C++ 程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。 
3 常量定义规则 
【3-1】需要对外公开的常量放在头文件中,不需要对外公开的常量放在定义文件的头部。为便于管理 ,可以把不同模块的常量集中存放在一个公共的头文件中。 
【规则3-2】如果某一常量与其它常量密切相关,应在定义中包含这种关系,而不应给出一些孤立的值。 

例如: 
const  float   RADIUS = 100; 
const  float   DIAMETER = RADIUS * 2; 
4 类中的常量 
    有时我们希望某些常量只在类中有效。由于#define定义的宏常量是全局的,不能达到目的,于是想当然地觉得应该用const修饰数据成员来实现。const数据成员的确是存在的,但其含义却不是我们所期望的。 
const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的,因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。 
    不能在类声明中初始化const数据成员。以下用法是错误的,因为类的对象未被创建时,编译器不知道SIZE的值是什么。 
    class A 
    {… 
        const int SIZE = 100;     // 错误,企图在类声明中初始化const数据成员 
        int array[SIZE];        // 错误,未知的SIZE 
    }; 
const数据成员的初始化只能在类构造函数的初始化表中进行,例如 
    class A 
    {… 
        A(int size);      // 构造函数 
        const int SIZE ;  
    }; 
    A::A(int size) : SIZE(size)    // 构造函数的初始化表 
    { 
      … 
    } 
    A  a(100); // 对象 a 的SIZE值为100 
    A  b(200); // 对象 b 的SIZE值为200 
    怎样才能建立在整个类中都恒定的常量呢?别指望const数据成员了,应该用类中的枚举常量来实现。例如 
    class A 
    {… 
        enum { SIZE1 = 100, SIZE2 = 200}; // 枚举常量 
        int array1[SIZE1];   
        int array2[SIZE2]; 
    }; 
    枚举常量不会占用对象的存储空间,它们在编译时被全部求值。枚举常量的缺点是:它的隐含数据类型是整数,其最大值有限,且不能表示浮点数(如PI=3.14159)。 


========================================

PS: 使用整个类中都恒定的常量的方法:把常量定义成全局的。例如:
const int DEFAULT_CONN_NUM =3;
DBLoader::DBLoader(){}
不过目前看只能本文件有效,因为别的要引用必须还赋值才行,如下:
       extern const int DEFAULT_CONN_NUM =3;
修改变量值不方便。
### C++常量的定义与使用 在C++中,`const`关键字用于定义类型安全的常量,编译器会对这些常量执行严格的类型检查[^1]。相比之下,宏定义(如 `#define`)仅实现简单的文本替换而不涉及任何类型的验证。 #### 定义常量的方法 通过`const`定义的常量不仅限于基本数据类型;还可以应用于指针、对象以及其他复杂的数据结构。下面是一个利用`const`创建浮点数π作为常量的例子: ```cpp #include <iostream> using namespace std; int main() { const double pi = 3.14159; int radius; cout << "请输入圆的半径 "; cin >> radius; double area = radius * radius * pi; cout << "圆的面积是:" << area << endl; return 0; } ``` 上述程序展示了如何声明并初始化一个名为pi的双精度浮点型常量,并将其应用到计算圆形区域的操作之中[^5]。 对于整数值或其他简单类型来说,也可以采用相同方式设置不可变属性: ```cpp const int MAX_SIZE = 100; // 数组最大尺寸限制 ``` 值得注意的是,一旦被赋予初始值之后,就不能再改变由`const`修饰符所限定的对象或变量的内容了。 #### 文本替换式的宏定义 尽管如此,在某些情况下仍然可以看到人们倾向于运用预处理器指令来进行类似的设定工作——即所谓的符号常量(`#define`)。然而这种方法缺乏灵活性以及安全性保障,因为它本质上只是一次性的字符串替代过程而已[^2]。 例如,可以这样定义PI: ```cpp #define PI 3.14159 ``` 但是这种做法并不推荐,因为这可能会引发潜在的风险,尤其是在大型项目里维护代码时容易出现问题。 综上所述,在现代编程实践中更建议优先考虑基于`const`的关键字来构建具有固定特性的实体实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值