0

0

c++中const修饰符的用法_c++常量指针与指针常量【详解】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-03-11 17:33:18

|

181人浏览过

|

来源于php中文网

原创

const位置决定语义:左边为指针常量(p不可变),右边为常量指针(*p不可变);const成员函数承诺不修改对象状态,mutable除外;constexpr要求编译期可求值,与const本质不同。

c++中const修饰符的用法_c++常量指针与指针常量【详解】

const 放在 * 左边还是右边,直接决定是「常量指针」还是「指针常量」

很多人被「常量指针」「指针常量」绕晕,其实只看 * 的位置:如果 const 紧挨着 * 左边(比如 int* const p),那指针本身不能改;如果 const* 右边(比如 const int* pint const* p),那它指向的值不能改。

常见错误现象:const int* p = &x; *p = 5; 编译报错 assignment of read-only location;而 int* const p = &x; p = &y; 会报 assignment of read-only variable 'p'

  • const T* pT const* p 等价,都是「指向常量的指针」,p 可变,*p 不可变
  • T* const p 是「常量指针」,p 初始化后不能再指向别处,但 *p 可改
  • const T* const p 是两者叠加:指针和它指向的值都不可变
  • 读法建议:从右往左读 —— int* const p → “p is a const pointer to int”

函数参数里加 const,不只是防改,更是接口契约

void foo(const std::string& s),不是怕自己手抖改了 s,而是告诉调用方:“我不会修改你传来的这个字符串”,也方便编译器做优化(比如省去隐式拷贝)。

容易踩的坑:const 引用参数不能绑定到临时对象(C++11 后放宽,但仅限于 const lvalue 引用延长生命周期,且不适用于所有场景);更隐蔽的是,如果函数内部调用了非 const 成员函数,哪怕参数是 const T&,也会编译失败 —— 因为 T 类型本身没保证 const 正确性。

立即学习C++免费学习笔记(深入)”;

纳米漫剧流水线
纳米漫剧流水线

360推出的国内首个工业级AI漫剧生产平台

下载
  • 基本类型(intdouble)传值时加 const 没意义,编译器通常忽略
  • 大对象(std::vector、自定义类)优先用 const T&,避免拷贝开销
  • 如果函数要修改参数副本,明确写成 T 值传递,而不是 const T& + 内部拷贝
  • 返回 const 引用需谨慎:若引用的是局部变量,就是悬垂引用

const 成员函数里,只能调用其他 const 成员函数

void bar() const 这种写法,表示该函数承诺不修改对象的任何成员变量(mutable 除外)。一旦在其中调用非 const 成员函数,或者给非 mutable 成员赋值,编译器立刻报错,比如 error: passing 'const MyClass' as 'this' argument discards qualifiers

典型使用场景:容器类的 size()empty()at() 都是 const 成员函数;而 push_back()clear() 就不是。如果你有个 const std::vector<int>& v</int>,就只能调用前者。

  • const 成员函数不能修改非 mutable 成员,也不能调用非 const 成员函数
  • mutable 成员可在 const 函数中修改,常用于缓存、计数器等不影响逻辑状态的字段
  • 重载时,const 和非 const 版本可共存:T& operator[](size_t i);const T& operator[](size_t i) const;
  • lambda 表达式默认不能修改捕获的变量,加 mutable 关键字才允许(与成员函数里的 mutable 语义不同,但名字一样)

constexpr 和 const 不是一回事,别混用

const 只表示“运行期不可改”,constexpr 要求“编译期就能算出值”。比如 const int x = rand(); 合法(只要不取地址),但 constexpr int y = rand(); 直接编译失败。

性能影响明显:constexpr 变量可用于模板非类型参数、数组长度、static_assert 条件;而普通 const 变量做不到。但过度追求 constexpr 可能导致编译变慢或失败(尤其涉及复杂计算时)。

  • constexpr 函数必须满足严格条件:函数体只能包含一条 return,且所有操作必须是编译期可求值的(C++14 后放宽,允许循环、局部变量等)
  • const 对象不一定能用于需要常量表达式的地方,例如 int arr[const_int_var]; 中的 const_int_var 必须是 constexpr
  • 类的 constexpr 构造函数要求所有成员都能用常量表达式初始化,且不能有虚函数、虚基类等
  • auto 推导时,constexpr 不会自动传播 —— constexpr int x = 42; auto y = x;y 不是 constexpr

const 的边界感很关键:它不保证线程安全,不阻止 const_cast(虽然那是危险操作),也不影响对象布局。真正难的不是语法,而是判断「哪里该加、哪里不该加、加了之后别人怎么用」——这得靠对数据所有权和接口意图的持续校准。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1010

2023.08.02

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1566

2023.10.24

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

492

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

377

2023.10.25

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

562

2023.09.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1566

2023.10.24

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.1万人学习

C 教程
C 教程

共75课时 | 5.3万人学习

C++教程
C++教程

共115课时 | 21.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号