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

C++拷贝构造函数详解

拷贝构造函数的作用

核心作用:通过同类型的已有对象来初始化新对象(成员变量的拷贝初始化)。
与普通构造函数的区别:

  • 普通构造函数:从无到有初始化对象。

  • 拷贝构造函数:从已有对象拷贝初始化。


拷贝构造函数的特性

1. 是构造函数的重载形式
  • 函数名与类名相同,无返回值。

  • 必须接受 同类对象的引用 作为参数(通常是 const 引用)。

2. 参数必须是引用(避免无限递归)

cpp

class MyClass {
public:// 正确:参数是引用MyClass(const MyClass& other) { /*...*/ }// 错误:传值会导致无限递归调用拷贝构造MyClass(MyClass other) { /*...*/ }  // 编译报错
};

原因
传值方式会触发拷贝构造,而拷贝构造又需要传值→无限递归,最终栈溢出。

3. 编译器默认生成
  • 若未显式定义,编译器会生成一个默认拷贝构造函数

  • 默认行为

    • 内置类型:按字节浅拷贝(直接赋值,包括指针变量)。

    • 自定义类型成员:调用该成员的拷贝构造函数(递归处理)。

4. 调用时机

以下情况会调用拷贝构造函数:

  1. 用已有对象初始化新对象

    cpp

    MyClass obj1;
    MyClass obj2(obj1);  // 直接调用拷贝构造
    MyClass obj3 = obj1; // 调用拷贝构造(不是赋值运算符!)
  2. 函数参数传递(按值传参时):

    cpp

    void func(MyClass obj);  // 实参传递时会调用拷贝构造
  3. 函数返回对象(按值返回且未优化时):

    cpp

    MyClass createObj() {MyClass obj;return obj;  // 可能调用拷贝构造(受RVO/NRVO优化影响)
    }

默认拷贝构造的潜在问题

当类中有指针成员时,默认浅拷贝会导致双重释放

解决方法:自定义拷贝构造函数实现深拷贝

http://www.dtcms.com/a/168740.html

相关文章:

  • Wireshark网络抓包工具基础使用教程
  • 4.5 使用busybox制作根文件系统
  • 开源ERP系统对比:Dolibarr、ERPNext与Odoo
  • AI大模型-解决开发环境配置不足问题
  • [FPGA Video] AXI4-Stream Remapper
  • stm32 hal库 SPI使用(二)硬件SPI的HAL库函数调用
  • spring-- 事务失效原因及多线程事务失效解决方案
  • Flutter——数据库Drift开发详细教程(二)
  • Flutter AppBar 详解
  • “会话技术”——Cookie_(2/2)原理与使用细节
  • 【二叉树】java源码实现
  • 中小企业MES系统概要设计
  • 数字智慧方案6213丨智慧园区规划方案(63页PPT)(文末有下载方式)
  • 【学习笔记】第十章:序列建模:递归神经网络(RNN)
  • Python 数据智能实战 (8):基于LLM的个性化营销文案
  • Redis总结及设置营业状态案例
  • 分发饼干之 双数组匹配问题 (双指针 or 二分)
  • 【质量管理】现代TRIZ中问题识别中的功能分析——相互接触分析
  • 【算法题】荷兰国旗问题[力扣75题颜色分类] - JAVA
  • Rust 学习笔记:关于枚举与模式匹配的练习题
  • 从0搭建Transformer
  • 大学之大:瑞典皇家理工学院2025.5.2
  • 纯原生Java实现:获取整个项目中指定接口所有的实现类
  • 柔性超声耦合剂的选择与设计-可穿戴式柔性超声耦合剂面临的难题
  • [面试]SoC验证工程师面试常见问题(三)
  • 冯·诺依曼体系:现代计算机的底层逻辑与百年传承
  • 深度学习框架PyTorch——从入门到精通(YouTube系列 - 4)——使用PyTorch构建模型
  • 实现水平垂直居中的多种方法
  • 多模态RAG演进-MRAG1.0->MRAG2.0->MRAG3.0
  • 【验证技能】VIP项目大总结