在 C++ 中,**常量(Constant)**是指在程序运行期间其值不会改变的变量或数据。常量可以通过 const
关键字、constexpr
关键字、#define
预处理指令等方式来定义。以下是 C++ 中常量的详细讲解。
1. 使用 const
关键字定义常量
1.1 基本 const
变量
const
关键字用于声明不可修改的变量。例如:
#include <iostream>
using namespace std;
int main() {
const int a = 10;
// a = 20; // 错误,常量不能被修改
cout << "a = " << a << endl;
return 0;
}
特点:
const
变量在定义时必须初始化,否则会报错。const
变量的值在整个程序运行期间不能被修改。
1.2 const
指针
在 C++ 中,const
可以用于指针,有多种不同的用法:
#include <iostream>
using namespace std;
int main() {
int x = 10;
int y = 20;
// 1. 指向常量的指针(指针指向的值不能修改)
const int *p1 = &x;
// *p1 = 20; // 错误
p1 = &y; // 正确,指针本身可以改变指向
// 2. 常量指针(指针本身不能修改,但指向的值可以改)
int *const p2 = &x;
*p2 = 20; // 正确,修改指向的值
// p2 = &y; // 错误,指针本身不能修改
// 3. 指向常量的常量指针(指针和指向的值都不可修改)
const int *const p3 = &x;
// *p3 = 20; // 错误
// p3 = &y; // 错误
return 0;
}
1.3 const
修饰函数参数
const
关键字可以用于修饰函数的参数,以防止参数在函数内部被修改:
#include <iostream>
using namespace std;
void printValue(const int value) {
// value = 20; // 错误,不能修改常量参数
cout << "Value: " << value << endl;
}
int main() {
int num = 10;
printValue(num);
return 0;
}
如果参数是指针或引用,const
可以防止修改指向的对象:
void printArray(const int *arr, int size) {
// arr[0] = 100; // 错误,不能修改
for (int i = 0; i < size; ++i) {
cout << arr[i] << " ";
}
}
1.4 const
修饰类的成员函数
当 const
修饰类的成员函数时,表示该函数不会修改类的成员变量:
class Test {
private:
int value;
public:
Test(int v) : value(v) {}
void show() const { // const 成员函数
// value = 20; // 错误,不能修改成员变量
cout << "Value: " << value << endl;
}
};
2. 使用 constexpr
关键字
2.1 constexpr
介绍
C++11 引入了 constexpr
关键字,表示编译期常量,即它的值在编译时就已经确定。
#include <iostream>
using namespace std;
constexpr int getValue() { return 10; }
int main() {
constexpr int x = getValue(); // 在编译时求值
cout << "x = " << x << endl;
return 0;
}
区别:
const
变量的值可以在运行时确定。constexpr
变量的值必须在编译时确定。
3. 使用 #define
预处理指令
#define
可以用于定义常量,但它不是类型安全的:
#define PI 3.14159
#define SQUARE(x) ((x) * (x))
int main() {
cout << "PI = " << PI << endl;
cout << "SQUARE(5) = " << SQUARE(5) << endl;
return 0;
}
缺点:
#define
不能用于类型检查。#define
不能用于类的成员变量。
4. enum
枚举常量
enum
也可以用于定义一组常量:
enum Color { RED, GREEN, BLUE };
int main() {
Color c = RED;
cout << "Color value: " << c << endl; // 输出 0(枚举的默认值)
return 0;
}
5. const
vs constexpr
vs #define
方式 | 是否类型安全 | 是否可用于类成员 | 何时求值 |
---|---|---|---|
const | 是 | 是 | 运行时或编译时 |
constexpr | 是 | 是 | 编译时 |
#define | 否 | 否 | 预处理阶段 |
6. 总结
const
适用于大多数情况下的常量定义,能保证类型安全。constexpr
适用于编译期常量,性能更高,但要求值在编译期确定。#define
适用于简单的宏替换,但不推荐用于常量定义。enum
适用于定义整数型的常量集合。
这样,在 C++ 中使用常量时,可以根据实际情况选择合适的方式。