const左边还是右边?破解C++中最让人抓狂的关键字

大家好啊!我是小康。

今天咱们来聊一个让无数程序员头疼的话题 —— C++中的 const 关键字。不知道你有没有过这种经历:刚开始学C++的时候,看到const int* pint* const p这两个东西,脑袋瞬间就懵了?"这两个到底有啥区别啊?const 放左边放右边,不都一样吗?"

如果你也有这困惑,那今天这篇文章就是专门为你准备的!咱们用最通俗的语言,把这个"魔鬼"般的关键字彻底搞清楚!

微信搜索 「跟着小康学编程」,关注我,后续还有更多硬核技术文章分享,带你玩转 Linux C/C++ 编程!😆

先别急着背口诀,理解才是王道

网上有很多口诀,什么"靠谁近就修饰谁",但很多人背了半天还是摸不着头脑。今天我不想让你背口诀,我要你真正理解为什么会这样。

让我们把这个问题想象成现实生活中的一个情景:

const就像是一把锁🔒,它锁住的东西就不能改变了。

const的两种基本用法

1. 锁住普通变量 - 最简单的const

const int age = 18;
age = 19;  // 错误!age被const锁住了,不能改变

这种情况很好理解吧?就是告诉编译器:"嘿,这个变量不能变,死锁定在这个值了!"

2. 指针世界的const - 这才是重头戏

在指针世界里,const就变得有趣了,因为指针本身有两层含义:

  • 指针变量本身(它存的是一个地址)
  • 指针指向的内容(通过这个地址能找到的值)

所以 const 可以锁两种东西:

  1. 锁住指针本身,使它不能指向其他地方
  2. 锁住指针指向的内容,使内容不能被修改

现在问题就变得清晰了!

const在左在右,差别大了去了!

情况一:const int* pint const* p(两种写法等价)

这种情况下,const锁的是指针指向的内容(即*p)。

int num = 10;
const int* p = #  // 或者写成 int const* p = #

*p = 20;  // 错误!不能通过p修改它指向的内容
p = &other_num;  // 正确!p本身可以改变,指向别的地方

我们可以这样记:const和*挨着,锁定的就是内容

想象成:"你可以换手机(p可以变),但不能修改里面的通讯录(*p不能变)"。

情况二:int* const p

这种情况下,const锁的是指针变量本身(p)。

int num = 10;
int other_num = 20;
int* const p = #

*p = 30;  // 正确!可以通过p修改它指向的内容
p = &other_num;  // 错误!p本身被锁住了,不能指向别处

这里可以记作:const和变量名挨着,锁定的就是指针本身

想象成:"你不能换手机(p不能变),但可以修改里面的通讯录(*p可以变)。"

情况三:const int* const p

这是终极形态,两个 const 都有,指针和内容都被锁住了!

int num = 10;
const int* const p = #

*p = 20;  // 错误!
p = &other_num;  // 错误!

想象成:"你不能换手机,也不能修改里面的通讯录,只能看看而已。"

实用小技巧:从右往左读

如果你还是觉得复杂,有一个小技巧:从右往左读声明

  • const int* p → p是一个指针,指向 const int
  • int* const p → p是一个 const 指针,指向 int
  • const int* const p → p是一个 const 指针,指向 const int

真实案例:const在函数参数中的应用

为什么要用const?不仅仅是为了折磨你,它确实有重要作用。

防止函数内部修改外部数据

// 不安全的函数,可能修改你的数据
void process(int* data) {
    *data = 0;  // 哎呀,你的数据被我改了
}

// 安全的函数,保证不会修改你的数据
void safeProcess(const int* data) {
    *data = 0;  // 编译错误!这样就防止了意外修改
}

传引用时提高效率又保证安全

// 这是最常见的const用法
void printBigObject(const BigObject& obj) {
    // 通过引用避免了复制大对象(提高效率)
    // 通过const确保函数不会修改对象(保证安全)
    cout << obj.toString() << endl;
}

真相了:const其实很友好

学会了const,你会发现它其实是 C++ 设计中很贴心的一部分:

  1. 帮你避免意外修改不该修改的数据
  2. 让代码更清晰,表达"这个东西不应该被修改"的意图
  3. 编译器可以做更多优化

小结:const记忆口诀

如果你看了前面的解释还是觉得绕,那就记住这一句话:

const和谁在一起(挨着谁),就锁定谁

  • const int* p:const和*挨着,锁定的是内容
  • int* const p:const和p挨着,锁定的是指针本身

看到没?就这么简单!

啥?你说还有int const* p这种写法?这个其实等价于const int* p,因为 const 和 * 都挨着,不管const在前还是在后,都是修饰 int 的。

好了,const这个"拦路虎"就这样被我们轻松拿下了!是不是感觉豁然开朗?快去试试吧!如果你有任何问题,欢迎在评论区留言讨论~


学会一个const,还不够!

说实话,看到这里,你已经比很多程序员对 const 有更深的理解了!但 C++ 的江湖远不止这么简单。const只是我们踏入 C++ 大门的第一块石头而已。

想继续提升你的C++功力?不妨关注我的公众号「跟着小康学编程」。在那里,我用同样的清晰风格,分享更多编程干货:

  • 从入门到进阶的C/C++核心概念解析
  • 大厂面试常见陷阱和解决方案
  • Linux C/C++ 后端技术分享
  • 实战项目中的编程技巧和最佳实践

我一直坚信:技术不该是枯燥的,学习可以很有趣。无论你是初学者还是有经验的开发者,我都希望能给你带来那种"原来如此!"的恍然大悟感。

如果你觉得这篇文章对你有帮助,别忘了点赞、收藏、关注哦~ 你的支持是我持续创作的动力!

编程,就像解谜一样有趣。下次,我们一起攻克下一个谜题!

怎么关注我的公众号?

扫码即可关注

哦对了,我还建了个技术交流群,大家一起聊技术、解答问题。卡壳了?不懂的地方?随时在群里提问!不只是我,群里还有一堆技术大佬随时准备帮你解惑。一起学,才有动力嘛!

posted @ 2025-05-08 19:29  江小康  阅读(58)  评论(0)    收藏  举报