const左边还是右边?破解C++中最让人抓狂的关键字
大家好啊!我是小康。
今天咱们来聊一个让无数程序员头疼的话题 —— C++中的 const 关键字。不知道你有没有过这种经历:刚开始学C++的时候,看到const int* p和int* const p这两个东西,脑袋瞬间就懵了?"这两个到底有啥区别啊?const 放左边放右边,不都一样吗?"
如果你也有这困惑,那今天这篇文章就是专门为你准备的!咱们用最通俗的语言,把这个"魔鬼"般的关键字彻底搞清楚!
微信搜索 「跟着小康学编程」,关注我,后续还有更多硬核技术文章分享,带你玩转 Linux C/C++ 编程!😆
先别急着背口诀,理解才是王道
网上有很多口诀,什么"靠谁近就修饰谁",但很多人背了半天还是摸不着头脑。今天我不想让你背口诀,我要你真正理解为什么会这样。
让我们把这个问题想象成现实生活中的一个情景:
const就像是一把锁🔒,它锁住的东西就不能改变了。
const的两种基本用法
1. 锁住普通变量 - 最简单的const
const int age = 18;
age = 19;  // 错误!age被const锁住了,不能改变
这种情况很好理解吧?就是告诉编译器:"嘿,这个变量不能变,死锁定在这个值了!"
2. 指针世界的const - 这才是重头戏
在指针世界里,const就变得有趣了,因为指针本身有两层含义:
- 指针变量本身(它存的是一个地址)
- 指针指向的内容(通过这个地址能找到的值)
所以 const 可以锁两种东西:
- 锁住指针本身,使它不能指向其他地方
- 锁住指针指向的内容,使内容不能被修改
现在问题就变得清晰了!
const在左在右,差别大了去了!
情况一:const int* p 或 int 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++ 设计中很贴心的一部分:
- 帮你避免意外修改不该修改的数据
- 让代码更清晰,表达"这个东西不应该被修改"的意图
- 编译器可以做更多优化
小结: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++ 后端技术分享
- 实战项目中的编程技巧和最佳实践
我一直坚信:技术不该是枯燥的,学习可以很有趣。无论你是初学者还是有经验的开发者,我都希望能给你带来那种"原来如此!"的恍然大悟感。
如果你觉得这篇文章对你有帮助,别忘了点赞、收藏、关注哦~ 你的支持是我持续创作的动力!
编程,就像解谜一样有趣。下次,我们一起攻克下一个谜题!
怎么关注我的公众号?
扫码即可关注。

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

 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号