对象切割与临时对象
1、判断是copy构造还是copy赋值,不是看是否有赋值操作符=,而是看对象当前是否已经有值了。如果没有值,就是copy构造。如果已经有值了,就是copy赋值。
2、对象赋值的时候,源端与目标端类型不吻合,肯定要进行一次适配(而且只能是一次),中间产生一个临时对象。
3、比如:Person p; p = 6; copy赋值的时候,要求rhs是个const Person&,显然6不是。因此,这里适配一下,用6构造一个临时对象,然后rhs指向这个临时对象。
那么接着思考,子类对象赋值给父类对象,会造成对象切割。那么这个过程是否产生临时对象呢?Person p; Student s; p=s;
那我们分析一下,copy赋值的时候,类型是否吻合。Person& operator=(const Person& rhs) ,显然,rhs可以指向s,类型吻合,因此不产生临时对象。
4、思考一下,copy构造中的形参为什么是引用?Person (const Person& rhs);
引用可以避免复制对象,这只是表面原因。还有更深层次的原因。考虑,如果copy构造为Person(const Person rhs);
Person p1 = p2; 调用copy构造,用p2构造rhs,而这个过程有需要调用copy构造,这将导致无限递归下去。
如果copy构造的形参是指针呢?引用要求右端是个对象,而指针要求右端是个对象地址,copy构造的形参使用指针,它就不是copy构造方法了,而是一个普通的构造方法。
5、注意:传递参数只有两种类型:传值与传引用。传指针本质上也是传值,因为指针本身也是一个类型。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理