当前位置: 首页 > news >正文

const 类名 rp 形参深度理解

const 类名& rp 形参深度理解
核心记住三件事:

  1. const ClassA& rp:引用,不传值,不会发生对象拷贝;rp 是实参对象的别名,同一块内存。
  2. const:通过 rp 不能修改源对象;但源对象本身可以被外面修改。
  3. const& 既能接收普通左值,也能接收临时对象(右值),这是它和普通 ClassA& rp 最大区别。

对比三个签名:

  1. 值传递:ClassA rp → 会拷贝,生成新对象
  2. 非const引用:ClassA& rp → 不拷贝,只能接收左值,不能接临时对象
  3. const引用:const ClassA& rp → 不拷贝,可读不可改,左值、临时对象都能接。
Person::Person(string n):name(n){cout<<"构造对象:"<<name<<endl;}Person::Person(const Person&other){name=other.name;cout<<"=====执行拷贝构造!生成副本====="<<endl;}void func_value(Person p){cout<<"func_value 内部 p.name = "<<p.name<<endl;}void func_const_ref(const Person&p){cout<<"func_const_ref 内部 p.name = "<<p.name<<endl;// p.name="xxx";// ?编译报错!const引用,不能修改p的成员}int main(){Person ps("tom");func_value(ps);func_const_ref(ps);return0}

输出:
构造对象:tom
=执行拷贝构造!生成副本=
func_value 内部 p.name = tom
func_const_ref 内部 p.name = tom

func_ref (Person (“临时对象”) ) ,为啥说传入的是临时变量,什么是临时变量

什么是临时对象(临时变量)
func_ref( Person(“临时对象”) );
Person(“临时对象”) 这一整句,没有名字、没有变量名、写在函数实参位置,用完马上销毁,这就是临时对象(右值)。

  1. 普通对象(左值,有名字)
    Person p(“jack”); // p 是具名变量,有变量名p,存在栈上;
    func_ref ( p ); // 传变量p,p还活着,后续代码还可以继续用p.

p:有名字,可以取地址 &p;生命周期由大括号作用域控制,出大括号才销毁。
👉 左值:可以出现在赋值号左边。p = Person(“xxx”); 合法。

  1. 临时对象(临时变量,右值,没有名字)
    func_ref( Person(“临时对象”) );
    Person(“临时对象”):

//

  1. 没有变量名字,没有标识符接收这个对象;
  2. 在这一行语句创建;
  3. 语句结束,立刻就要销毁;
  4. 你拿不到它的变量名,虽然可以取地址&Person(“xxx”),但生命周期极短。

临时对象不一定只在函数参数出现,下面这些全部都是临时对象:
// 1.函数返回值,临时对象
Person getPerson(){ return Person(“aa”); }
getPerson(); // 返回出来的Person是临时对象

//2.表达式产生临时对象
Person a(“a”),b(“b”);
Person c = a + b; // a+b运算结果产生临时对象,再拷贝给c.

关键:语句执行时序
func_ref( Person(“临时对象”) );
执行步骤:
调用构造函数,创建Person(“临时对象”)→临时对象,没有名字
把这个临时对象传给函数参数
函数调用结束,分号 ;,这整条语句执行完毕,临时对象马上调用析构销毁。

回到之前的语法问题:为什么 void func_ref(Person& rp) 不能接收临时对象?

void func_ref(Person&rp){}func_ref(Person("临时对象"));// ❌编译报错

C++ 设计规则:

非 const 左值引用 T&,不能绑定临时对象

为什么要有这个规则?(设计初衷)
假设语法允许写:

void func_ref(Person&rp){rp.name="修改名字";// 企图修改传入的对象}func_ref(Person("临时对象"));

传入的是临时对象,函数执行完,这条语句结束,临时对象马上销毁。
你在函数内部修改了 rp,但是外面没有任何变量能看到这个修改,修改完全没有意义,属于逻辑 bug。
C++ 直接在编译层面阻止这件事:不让临时对象绑定到普通引用T&,防止你做无意义的修改。
那为什么 const Person& rp 就可以绑定临时对象?

void func_const_ref(const Person&rp){}func_const_ref(Person("临时对象"));// ✅允许

const代表:函数内不能修改 rp 对象。既然不让修改,就不会出现上面那种 “修改临时对象,结果直接销毁丢失” 的 bug,C++ 允许这种绑定。

额外特性:当临时对象绑定到const T&引用参数的时候,临时对象生命周期被延长,直到函数结束才销毁,而不是语句分号立刻销毁。

区分:左值 / 右值通俗记忆
左值:有名字、有持久生命周期,可以取地址;能放在赋值号=左边。
Person p; p = xxx; → p 是左值。
右值:临时对象,没有名字,用完就要销毁;不能放在赋值号左边。
Person(“abc”)、函数返回临时值,都是右值。

http://www.jsqmd.com/news/1351042/

相关文章:

  • HarmonyOS手表开发:传感器与ArkUI实现抬腕亮屏个性化交互
  • 协作Diff查看器:实时审查如何重塑代码评审流程与团队协作
  • 编程游戏软件深度评测:从零基础到硬核的十款实战指南
  • EASTL高性能C++模板库:游戏与实时系统开发者的性能优化利器
  • 2026年最新教程:毕业证照片发给公司怎么加水印才安全 - 图片处理研究员
  • 从零到一:基于Coze平台构建企业级AI智能体的完整实践指南
  • FlowReasoner:自动化查询级 Multi-Agent 系统
  • 从24BYJ-48到42闭环步进电机:原理、驱动与应用全解析
  • Android 11分区存储适配指南:MediaStore API与权限申请实战
  • 2026年石家庄高价电缆回收怎么选?专业金属回收服务如何避坑? - 优质品牌商家
  • Flutter共享轴过渡在OpenHarmony的适配与优化
  • 正规的医用防滑PVC地板、手术室PVC地板、四川EPDM户外运动地板怎么选?2026年采购指南 - 优质品牌商家
  • 从OpenAI安全事件看AI应用防护:提示词注入防御与代码实践
  • 生产环境Java 8手动安装指南:从下载、验证到多版本管理
  • 2026 年更新:吕梁热门的单向活动盆式支座生产商电话,别再只纠结桥梁承重了,它才是让大桥稳当又能“动”的隐形功臣? - 行业推荐官[官方】--
  • Django模板语法与请求响应全流程实战指南
  • MyBatis动态SQL核心标签详解与Spring Boot集成实战
  • 2026年成都靠谱的水泥烟道厂家怎么选?预制水泥烟道与公园水泥仿木栏杆生产地址全解析 - 优质品牌商家
  • 浙江高复学校哪家好?高三复读补习班怎么选才靠谱? - 优质品牌商家
  • C++哈希表底层原理与性能优化实战:从std::unordered_map到高效数据结构设计
  • 从同质化竞争到利润增长:构建数字化服务增值体系的技术实践
  • 2026亲测有效教程:证件照宽高比例不对怎么办 - 效率工具研究所
  • RT-Thread与ROS 2融合:嵌入式实时系统连接机器人生态的实践指南
  • 户口本照片发出去怎么加水印 2026亲测有效教程 - 图片处理研究员
  • 2026 年更新:安国高性价比PID气体检测仪批发厂家联系电话,别再花冤枉钱买气体检测仪!它才是精准测挥发性气体的关键-索正自动化仪表 - 行业推荐官【认证】
  • 泰州瓷砖空鼓检测修复维修_2026长江下游北岸瓷砖空鼓维修与多少钱 - 雨婺虹修缮
  • K-POP粉丝内容管理:使用yt-dlp与FFmpeg高效处理官方视频与字幕
  • 2026年 即热型开水器厂家**单,电热开水器,蒸汽开水桶,商用电热开水器品牌实力与选购指南 - 卓企推荐
  • ANSYS Workbench入门实战:从悬臂梁到多物理场仿真的完整指南
  • Element UI el-table横向滚动条固定底部实现方案详解