const是C++中非常重要的关键字,用于定义不可修改的常量,合理使用时可以避免意外的变量修改,提升代码的安全性和可维护性。它的用法覆盖普通变量、指针、引用、函数参数等多个场景,其中指针相关的用法是最容易混淆的部分。

const修饰普通变量
const修饰普通变量时,变量的值在初始化后无法被修改,必须显式初始化,否则会编译报错。
#include <iostream>
using namespace std;
int main() {
const int a = 10; // 定义整型常量a,初始化为10
// a = 20; // 编译报错,const修饰的变量不可修改
cout << a << endl; // 输出10
return 0;
}
const修饰指针
const修饰指针时,根据const位置的不同,分为常量指针和指针常量两种类型,二者核心区别在于不可修改的内容不同。
常量指针(指向常量的指针)
常量指针的定义是const 类型* 指针名,特点是:指针指向的内容是常量,不可通过指针修改指向的值,但指针本身可以指向其他地址。
#include <iostream>
using namespace std;
int main() {
int num1 = 10;
int num2 = 20;
const int* p = &num1; // 定义常量指针p,指向num1
// *p = 30; // 编译报错,不能通过常量指针修改指向的内容
p = &num2; // 合法,指针本身可以修改指向
cout << *p << endl; // 输出20
return 0;
}
指针常量(指针本身是常量)
指针常量的定义是类型* const 指针名,特点是:指针本身是常量,初始化后不能指向其他地址,但可以通过指针修改指向的内容(前提是指向的内容本身不是常量)。
#include <iostream>
using namespace std;
int main() {
int num1 = 10;
int num2 = 20;
int* const p = &num1; // 定义指针常量p,必须初始化
*p = 30; // 合法,可以修改指向的内容
// p = &num2; // 编译报错,指针本身不能修改指向
cout << num1 << endl; // 输出30
return 0;
}
二者对比
可以通过一个口诀区分:const在*左边是常量指针,const在*右边是指针常量。二者的核心差异如下:
| 类型 | 定义格式 | 能否修改指向内容 | 能否修改指向地址 |
|---|---|---|---|
| 常量指针 | const 类型* 指针名 | 不能 | 能 |
| 指针常量 | 类型* const 指针名 | 能(指向内容非常量时) | 不能 |
const修饰引用
const修饰引用时,称为常引用,特点是引用的对象不可被修改,常用于函数参数传递,避免拷贝开销的同时防止修改入参。
#include <iostream>
using namespace std;
void printNum(const int& num) { // 常引用作为参数,避免拷贝且防止修改
// num = 100; // 编译报错,常引用不可修改
cout << num << endl;
}
int main() {
int a = 50;
printNum(a); // 输出50
return 0;
}
const修饰函数参数和返回值
函数参数使用const修饰,既可以保护入参不被修改,也可以接受常量作为实参;函数返回值为const修饰的指针或引用时,返回值不可被修改。
#include <iostream>
using namespace std;
const int* getConstPtr() { // 返回常量指针
static int num = 100;
return #
}
int main() {
const int* p = getConstPtr();
// *p = 200; // 编译报错,返回的常量指针指向内容不可修改
cout << *p << endl; // 输出100
return 0;
}
总结
const关键字的核心作用是限制变量的可修改性,不同场景下的用法差异主要体现在修饰位置的不同。常量指针和指针常量的核心区别在于const和*的相对位置,掌握这个规律就能快速区分二者。在实际开发中,合理多用const可以提升代码的安全性,减少不必要的错误。