当前位置: 首页 > 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优化影响)
    }

默认拷贝构造的潜在问题

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

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

相关文章:

  • 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 学习笔记:关于枚举与模式匹配的练习题
  • 三亚再回应游客骑摩托艇出海遇暴雨:俱乐部未配备足额向导人员,停业整改
  • 家政阿姨如何炼成全国劳模?做饭、收纳、养老、外语样样都会
  • 深交所修订创业板指数编制方案,引入ESG负面剔除机制
  • 黄育奇当选福建惠安县人民政府县长
  • 总书记考察的上海“模速空间”,是一个怎样的空间?
  • 澎湃回声|山东莱州、潍坊对“三无”拖拉机产销市场展开调查排查