You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于C++拷贝构造函数与引用的概念理解疑问

理解拷贝构造函数中引用参数的作用

你提的这个问题非常关键,很多刚接触C++拷贝构造的开发者都会在这里卡壳。咱们结合你的代码一步步拆解:

首先看你的拷贝构造函数签名:Person(const Person &p),这里的引用参数有三个核心作用,一个都不能少:


1. 彻底避免无限递归调用

如果咱们把参数写成值传递const Person p(不用引用),那当你执行Person Person2 = Person1;时,编译器需要把Person1复制一份传给拷贝构造函数的形参p——而复制对象的过程又会调用拷贝构造函数!这就陷入了“调用拷贝构造→复制参数→调用拷贝构造→...”的无限循环,程序直接崩溃。

用引用参数的话,p只是Person1的一个别名,不需要复制整个对象,自然不会触发额外的拷贝构造调用,完美解决递归问题。

2. 大幅提升效率,避免不必要的内存开销

假设你的Person类里有更多大成员(比如超大的字符串、动态数组),值传递会把整个原对象完整复制一遍,既浪费内存又拖慢运行速度。而引用只是指向原对象内存地址的“别名”,不需要任何额外的复制操作,直接复用原对象的内存,效率拉满。

3. 用const保证原对象的安全性

加上const修饰引用,是为了确保在拷贝构造函数里绝对不会意外修改原对象Person1。比如你不小心写了p.age = 30;,编译器会直接报错,这是一种非常重要的安全防护——毕竟拷贝的目的是复制一个新对象,原对象应该保持原样。


回到你的例子:Person Person2 = Person1;,这里编译器会自动把Person1绑定到拷贝构造函数的引用参数p上,此时p就是Person1的“替身”。你在拷贝构造函数里写name = new string(*p.name);,本质上就是读取Person1的name指针指向的字符串内容,然后给Person2的name指针分配新内存、复制内容,这才是真正的深拷贝——两个对象的name指向不同的内存地址,修改其中一个不会影响另一个。

内容的提问来源于stack exchange,提问作者user9158336

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:35:25