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

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.xdnf.cn/news/3573.html

相关文章:

  • 使用 Mermaid 在 Markdown 中绘制图表
  • 数字智慧方案6213丨智慧园区规划方案(63页PPT)(文末有下载方式)
  • AI大模型-解决开发环境配置不足问题
  • 【AIStarter苹果版发布】黑苹果部署教程+跨平台AI应用测试指南
  • HCL(HashiCorp Configuration Language)是一种结构化配置语言
  • 13.多边形的三角剖分 (Triangulation) : Triangulation
  • 我的日记杂文
  • 中小企业MES系统详细设计
  • Rain World 雨世界 [DLC 解锁] [Steam Epic] [Windows SteamOS]
  • 新手SEO优化核心步骤
  • 《筑牢防线:全方位守护移动应用免受逆向侵扰》
  • 【JavaScript-Day 1】从零开始:全面了解 JavaScript 是什么、为什么学以及它与 Java 的区别
  • 【云盘】使用阿里云盘托管项目大文件
  • 销售总监求职简历模板
  • ACGRIME:用于全局优化和特征选择的自适应混沌高斯RIME优化器,附完整版免费代码
  • 65. Java 类和对象 - 创建和使用类与对象:摘要
  • [SoC]AXI总线Performance验证方案
  • 一天学完JDBC!!(万字总结)
  • 机器学习中的学习率及其衰减方法全面解析
  • 值此五一劳动节来临之际,
  • Java 入门:自定义标识符规则解析
  • ECMAScript 2(ES2):标准化的微调与巩固
  • STM32MP157开发板设置静态IP地址
  • stm32 HAI库 SPI(一)原理
  • spring-- 事务失效原因及多线程事务失效解决方案
  • spring中的@PostConstruct注解详解
  • 如何用Python绘制两个圆之间的8条公切线
  • 从原理到实战讲解回归算法!!!
  • FastAPI 与数据库交互示例
  • 集成Langfuse和Langchain:简化开发,增强自然语言理解能力