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

03 构造与析构

C++构造函数与析构函数详解总结

一、构造函数(Constructor)

  1. 基本概念
    构造函数是类的特殊成员函数,用于在对象创建时初始化数据成员。
    • 必须与类名同名,无返回值(包括void)。

    • 支持重载、默认参数,可隐式调用(如类型转换)。

    • 若未显式定义,编译器生成缺省构造函数,但不会初始化成员(值为随机)。

  2. 定义与调用

    class A {
    public:A() { /* 无参构造 */ }          // 缺省构造函数A(int a, int b) { /* 带参构造 */ } // 重载构造函数A(int a, int b = 10) { /* 默认参数 */ } 
    };A a1;          // 调用缺省构造
    A a2(1, 2);    // 调用带参构造
    A a3 = 5;      // 隐式构造(单参数构造函数)
    
  3. 注意事项
    • 缺省构造函数冲突:若定义无参构造或全缺省参数构造,编译器不再生成缺省版本。

    • 必须唯一:对象实例化时必须有唯一匹配的构造函数。

    • 初始化列表(补充):推荐用初始化列表初始化成员,提高效率。

    A(int a, int b) : x(a), y(b) {}
    

二、析构函数(Destructor)

  1. 基本概念
    析构函数用于对象生命周期结束时释放资源(如动态内存)。
    • 命名:~ClassName(),无参数和返回值。

    • 每个类只能有一个析构函数,不可重载。

    • 若未显式定义,编译器生成缺省析构函数(不处理动态内存)。

  2. 动态内存管理

    class Str {char* sp;
    public:Str(const char* s) { sp = new char[strlen(s)+1]; strcpy(sp, s); }~Str() { delete[] sp; } // 必须显式释放动态内存
    };Str* s = new Str("Hello");
    delete s; // 调用析构函数释放内存
    
  3. 对象数组与delete[]

    A* arr = new A[3]; // 调用3次构造函数
    delete[] arr;      // 调用3次析构函数
    

三、拷贝构造函数(Copy Constructor)

  1. 作用
    用同类对象初始化新对象,实现深拷贝(避免指针成员浅拷贝问题)。

    class A {
    public:A(const A& other) { x = other.x; y = other.y; } // 显式拷贝构造
    };
    
  2. 默认行为与问题
    • 默认拷贝构造函数逐个复制成员(浅拷贝)。

    • 指针成员陷阱:浅拷贝导致多个对象指向同一内存,需手动深拷贝。

    // 错误示例:默认拷贝构造导致重复释放
    class Str {char* sp;
    public:Str(const Str& s) : sp(s.sp) {} // 浅拷贝~Str() { delete[] sp; }
    };
    
  3. 正确实现深拷贝

    Str(const Str& s) {sp = new char[strlen(s.sp)+1];strcpy(sp, s.sp);
    }
    

四、其他关键点

  1. 隐式类型转换
    • 单参数构造函数支持隐式转换(可用explicit禁止):

    explicit B(int a) { /* 禁止 B b = 10; */ }
    
  2. 对象存储类型与构造/析构顺序
    • 全局对象:程序启动构造,结束析构。

    • 局部对象:进入作用域构造,离开时析构。

    • 静态局部对象:首次定义时构造,程序结束析构。

    • 动态对象:new时构造,delete时析构。

  3. 临时对象与赋值

    a1 = A(3, 30); // 创建临时对象,赋值后立即析构
    

五、总结
• 构造函数:初始化对象,支持重载、默认参数,注意缺省构造冲突。

• 析构函数:释放资源,必须处理动态内存,避免泄漏。

• 拷贝构造:深拷贝解决指针问题,避免默认浅拷贝的陷阱。

• 动态内存:new/delete配对使用,数组需delete[]

• 隐式转换:单参构造支持=赋值,可用explicit限制。

正确使用构造与析构函数是C++资源管理(RAII)的核心,确保对象生命周期内资源安全高效使用。

http://www.xdnf.cn/news/2688.html

相关文章:

  • 【OSG学习笔记】Day 13: 事件处理——响应键盘与鼠标
  • 12前端项目----添加购物车1.0
  • 计算机视觉——通过 OWL-ViT 实现开放词汇对象检测
  • Dockerfile 编写根据需求阶段而出现
  • Android wifi开发调试总结
  • 【ACL系列论文写作指北08-图表设计规范】-让数据与结构一目了然
  • STM32的SysTick
  • 9. 使用Gazebo和Rviz显示机器人(包括运动控制,雷达,摄像头仿真以及显示)
  • 【强化学习系列】贝尔曼最优方程
  • C语言-函数的嵌套调用,链式访问,函数的声明和函数的定义
  • Python数据结构与算法(5)——动态规划
  • CUDA 编程相关的开源库
  • 【深度学习】评估模型复杂度:GFLOPs与Params详解
  • 人脑、深思考大模型与其他大模型的区别科普
  • Kubernetes》》k8s》》Taint 污点、Toleration容忍度
  • 香橙派打包qt文件报错“xcb 插件无法加载”与“QObject::moveToThread”线程错误的解决方案
  • ElasticSearch深入解析(五):如何将一台电脑上的Elasticsearch服务迁移到另一台电脑上
  • 【Spark入门】Spark RDD基础:转换与动作操作深度解析
  • vr全景相机如何选择?
  • Android Studio学习记录1
  • Python(15)迭代器和生成器
  • IP SSL证书常见问题:快速实现HTTPS加密
  • 使用Docker安装Harbor
  • MCP 模型上下文协议配置MCP Server开发实践
  • android录音生成wav
  • Spring Boot定时任务
  • 深入浅出JavaScript常见设计模式:从原理到实战(2)
  • 一文读懂Tomcat应用之 CentOS安装部署Tomcat服务
  • rabbitmq-集群部署
  • 当所有人都用上先进ai,如何保持你的优势?