关于 C++ const关键字的使用

const 的作用

用于修饰变量、指针、引用、成员函数。
被它修饰的值不能改变,是只读变量。必须在定义的时候就给它赋初值。

常量指针

是指定义了⼀个指针,这个指针指向⼀个只读的对象,不能通过常量指针来改变这个对象的值。
常量指针强调的是指针对其所指对象的不可改变性。

即:指向的内容不可变,但指针可以指向其他地址

形式:

  1. const 数据类型 * 指针变量 = 变量名
  2. 数据类型 const * 指针变量 = 变量名

代码示例:

1
2
3
4
5
6
7
8
int a = 10, b = 20;

// 1. 常量指针
const int* ptr1 = &a;

*ptr1 = 30; // ❌ 错误:不能通过ptr1修改a的值

ptr1 = &b; // 正确:可以改变ptr1的指向

指针常量

指针常量是指定义了⼀个指针,这个指针的值只能在定义时初始化,其他地⽅不能改变。
指针常量强调的是指针本身的不可改变性。

即:指针的指向不可变,但可以修改指向的内容

形式:

  • 数据类型 * const 指针变量 = 变量名

代码示例:

1
2
3
4
5
6
7
int a = 10, b = 20;

int* const ptr2 = &a;

ptr2 = &b; // ❌ 错误:不能改变ptr2的指向

*ptr2 = 30; // 正确:可以通过ptr2修改a的值

指向常量的指针常量

指针的指向不能改变,也不能通过指针修改所指向的值。
指向常量的指针常量强调的是指针本身 与其所指对象的不可改变性。

形式:

  • const 数据类型 * const 指针变量 = 变量名

代码示例:

1
2
3
4
5
6

const int* const ptr3 = &a;

*ptr3 = 40; // ❌ 错误:不能通过ptr3修改a的值

ptr3 = &b; // ❌ 错误:不能改变ptr3的指向

常见应用场景

常量指针的典型用途

1
2
3
4
5
6
void printString(const char* str) {
// 函数承诺不会通过str修改字符串内容
while (*str) { // 当指向的字符不是结束符'\0'时循环
std::cout << *str++; // 输出当前字符,然后指针向后移动一位
}
}

指针常量的典型用途

1
2
3
4
5
6
int configValue = 100;
int* const configPtr = &configValue; // 配置指针固定指向configValue

// 在整个程序中,configPtr始终指向configValue
// 但允许通过它修改配置值
*configPtr = 200; // 允许修改配置值

指针常量的典型用途

常用于定义不会改变的系统常量

1
2
const int MAX_SIZE = 100;
const int* const maxPtr = &MAX_SIZE; // 固定指向不可修改的值

与引用的关系

引用在行为上类似于一个自动解引用的指针常量:

1
2
3
int a = 10;
int& ref = a; // 类似于 int* const ptr = &a;
ref = 20; // 类似于 *ptr = 20;

总结对比表

类型 声明格式 指针可变 指向内容可变 类似引用类型
普通指针 int* ptr -
常量指针 const int* ptr -
指针常量 int* const ptr int&
指向常量的指针常量 const int* const ptr const int&