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

C++三大默认成员函数详解

C++ 类的默认成员函数

在 C++ 中,类有六个特殊的默认成员函数。其中构造函数析构函数拷贝构造函数是最基础且最常用的三个。若未显式定义,编译器会自动生成默认版本,但特定场景需手动实现以正确管理资源。


1.构造函数 (Constructor)
  • 作用:在对象创建时初始化成员变量,分配资源。
  • 特点
    • 函数名与类名相同,无返回值。
    • 可重载(多个不同参数的构造函数)。
    • 默认构造函数无参数;若未定义任何构造函数,编译器自动生成空实现的默认构造函数。
  • 示例
    class MyClass { public: int a; double b; // 默认构造函数 MyClass() : a(0), b(0.0) {} // 带参构造函数 MyClass(int x, double y) : a(x), b(y) {} }; // 使用 MyClass obj1; // 调用默认构造函数 MyClass obj2(10, 3.14); // 调用带参构造函数

2.析构函数 (Destructor)
  • 作用:在对象销毁时释放资源(如堆内存、文件句柄)。
  • 特点
    • 函数名为~类名,无参数和返回值。
    • 每个类仅有一个析构函数,不可重载。
    • 若未显式定义,编译器生成空实现的默认析构函数(可能引发资源泄漏)。
  • 示例
    class ResourceHolder { public: int* data; // 构造函数中分配资源 ResourceHolder(int size) { data = new int[size]; } // 析构函数中释放资源 ~ResourceHolder() { delete[] data; // 避免内存泄漏 } }; // 使用 { ResourceHolder obj(100); // 构造函数调用 } // 离开作用域时,析构函数自动调用

3.拷贝构造函数 (Copy Constructor)
  • 作用:用同类型对象初始化新对象(深拷贝场景必需)。
  • 特点
    • 函数签名:类名(const 类名& other)
    • 调用场景:对象初始化(如MyClass obj2 = obj1;)、传参、返回值。
    • 默认拷贝构造函数执行浅拷贝(直接复制指针地址),深拷贝需手动实现。
  • 示例
    class StringContainer { public: char* str; // 构造函数 StringContainer(const char* s) { str = new char[strlen(s) + 1]; strcpy(str, s); } // 拷贝构造函数(深拷贝) StringContainer(const StringContainer& other) { str = new char[strlen(other.str) + 1]; strcpy(str, other.str); } ~StringContainer() { delete[] str; } }; // 使用 StringContainer s1("Hello"); StringContainer s2 = s1; // 调用拷贝构造函数

关键注意事项

  1. 资源管理

    • 若类涉及动态内存或外部资源,必须手动实现析构函数和拷贝构造函数(或禁用拷贝)。
    • 默认浅拷贝会导致重复释放内存(双重释放错误)。
  2. 编译器默认行为

    • 未定义时,编译器生成默认版本:
      • 构造函数:无操作。
      • 析构函数:无操作。
      • 拷贝构造函数:逐成员浅拷贝。
  3. 现代 C++ 改进

    • 使用= default显式要求编译器生成默认函数:
      MyClass() = default; // 显式生成默认构造函数
    • 使用= delete禁用函数:
      MyClass(const MyClass&) = delete; // 禁用拷贝

掌握这三个函数是理解 C++ 对象生命周期和资源管理的基础,尤其在涉及动态内存时需谨慎设计。

http://www.cnnetsun.cn/news/2143186.html

相关文章:

  • TMD Matlab Toolbox v2.5:潮汐模型驱动的技术深度解析与架构剖析
  • Awesome Free Software的许可证解析:MIT、GPL、Apache的完整对比
  • c->c++(二):class
  • 看AI如何“火眼金睛”:实时口罩检测-通用模型案例效果图集
  • ROS2机器人实战:如何为你的奥比中光AstraPro相机选择合适的3D建图方案(rtabmap vs. 其他)
  • 终极指南:简单三步永久免费使用Cursor Pro的完整解决方案
  • 互联网大厂 Java 求职面试:音视频应用的技术挑战
  • 渗透测试新手必看:如何用V2.0工具快速上手20款主流OA系统的漏洞检测(附实战避坑指南)
  • DDrawCompat完整指南:在Windows 11上轻松修复经典老游戏兼容性问题
  • 凌晨2点,我的Agent把代码改崩了:从单点失控到专业团队协作的工程化思维
  • 从TAGE到TAGE-SC-L:一篇看懂现代CPU分支预测器的演进史
  • Ledger 官方授权经销商名单(含秘语盾认证渠道)
  • pfetch自定义开发:添加新的系统信息检测模块完整指南
  • Omron Subnet安全连接与证书验证:防止恶意攻击的完整方案
  • FPGA网络协议栈设计避坑指南:从ARP表管理到UDP校验和计算
  • 免费风扇控制终极指南:用Fan Control实现完美散热与静音平衡
  • Nest CLI 开发服务器工作原理:实时重载和热模块替换的实现机制
  • Bootstrap-Form-Builder拖放交互实现原理:事件处理与DOM操作
  • 日日升华(深圳)影视传媒有限公司与八佰里影业达成战略合作
  • 企业级字体革命:IBM Plex 零成本部署的完整实施路线图
  • 保姆级教程:用Windows/Mac电脑搞定乐高WeDo软件下载、汉化与蓝牙连接
  • 保姆级教程:手把手教你给vCenter 7.0配置SNMP代理,把告警精准推送到Zabbix
  • KubeDOOM架构剖析:Socket通信、VNC显示和Kubectl命令的完美融合
  • 深度解析microeco:如何构建高可信度微生物共现网络
  • 边缘AI轻量级神经网络STResNet架构解析与应用实践
  • SAM 3应用实战:电商商品图自动抠图,提升工作效率的利器
  • 高效文档格式转换方案:基于Spire.PDF的OFD到PDF转换技术实现
  • Python的__getattribute__方法实现属性访问追踪与调试在复杂系统的辅助
  • SWOT项目性能优化:10个技巧提升域名验证速度300%
  • 如何快速搭建个人媒体中心:Tsukimi播放器完整安装与使用指南