在C++编程过程中,定义常量可以避免魔法数字的出现,提升代码的可读性和可维护性,同时还能减少因数值修改带来的错误。C++提供了多种定义常量的方式,不同方式的特性和适用场景各有不同。

使用const关键字定义常量
const是C++中定义常量最常用的方式,它可以修饰变量、指针、引用等,被修饰的对象在初始化后无法被修改,编译器会对修改操作进行报错提示。
定义普通常量
定义普通常量的语法为const 数据类型 常量名 = 初始值;,常量必须在定义时完成初始化,后续不能重新赋值。
#include <iostream>
using namespace std;
int main() {
// 定义int类型的常量
const int MAX_SIZE = 100;
// 定义double类型的常量
const double PI = 3.1415926;
// 定义字符串常量
const string APP_NAME = "测试程序";
cout << "最大尺寸: " << MAX_SIZE << endl;
cout << "圆周率: " << PI << endl;
cout << "应用名称: " << APP_NAME << endl;
// 以下操作会编译报错,常量不能被修改
// MAX_SIZE = 200;
return 0;
}
定义常量指针和指针常量
const修饰指针时有两种常见情况,一种是常量指针,即指针指向的内容是常量,不能修改指向的内容,但指针本身可以指向其他地址;另一种是指针常量,即指针本身是常量,不能指向其他地址,但可以修改指向的内容。
#include <iostream>
using namespace std;
int main() {
int a = 10;
int b = 20;
// 常量指针:指向的内容不可修改,指针可以改指向
const int* ptr1 = &a;
// *ptr1 = 30; // 报错,不能修改指向的内容
ptr1 = &b; // 正确,指针可以指向其他地址
// 指针常量:指针不可修改指向,指向的内容可以改
int* const ptr2 = &a;
*ptr2 = 30; // 正确,可以修改指向的内容
// ptr2 = &b; // 报错,不能修改指针指向
return 0;
}
使用define宏定义常量
define是C语言延续下来的宏定义方式,它在预处理阶段进行文本替换,没有类型检查,也不是真正的变量。
#include <iostream>
using namespace std;
// 宏定义常量,没有分号,预处理阶段直接替换
#define MAX_AGE 18
#define MESSAGE "未成年"
int main() {
cout << "最大年龄: " << MAX_AGE << endl;
cout << "提示信息: " << MESSAGE << endl;
// 宏定义没有作用域限制,也不占用内存空间
return 0;
}
define定义常量的缺点是没有类型检查,容易出现替换错误,而且在调试时无法看到宏对应的名称,只能看到替换后的数值,因此C++中更推荐使用const替代define定义常量。
使用枚举定义常量
枚举类型适合定义一组相关的整数常量,默认情况下枚举值从0开始递增,也可以手动指定每个枚举值。
#include <iostream>
using namespace std;
// 定义枚举类型,包含三个相关常量
enum WeekDay {
MONDAY = 1,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY
};
int main() {
WeekDay today = WEDNESDAY;
cout << "今天是周" << today << endl; // 输出3
// 枚举常量不能被修改
// MONDAY = 10; // 报错
return 0;
}
不同常量定义方式对比
以下是几种常量定义方式的核心差异对比:
| 定义方式 | 类型检查 | 作用域 | 内存占用 | 适用场景 |
|---|---|---|---|---|
| const | 有 | 遵循变量作用域规则 | 可能占用(视编译器优化) | 大多数常量定义场景 |
| define | 无 | 从定义处到文件结束 | 无 | 兼容C代码、简单文本替换场景 |
| 枚举 | 有(整数类型) | 遵循枚举作用域规则 | 无(编译期常量) | 一组相关的整数常量场景 |
常量定义注意事项
- const常量必须初始化,否则会编译报错
- 类中的const成员变量需要在构造函数的初始化列表中完成初始化
- define宏定义没有分号,且容易引发运算符优先级问题,使用时建议给参数加括号
- 如果常量需要被多个文件共享,需要在头文件中用
extern const 类型 常量名;声明,在源文件中定义
// 头文件 constant.h extern const int GLOBAL_MAX; // 源文件 constant.cpp #include "constant.h" const int GLOBAL_MAX = 500; // 其他文件包含constant.h后就可以使用GLOBAL_MAX