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

C++的几种特殊函数:拷贝构造函数,拷贝赋值函数,移动构造函数,移动赋值函数,析构函数

目录

1、前言

2、拷贝构造函数

2.1 什么是拷贝构造函数

2.2 拷贝构造函数签名

2.3 拷贝构造函数定义

2.4 拷贝构造函数的使用场景

2.5 拷贝构造函数的注意事项

3、拷贝赋值函数

3.1 什么是拷贝赋值函数

3.2 拷贝赋值函数签名

3.3 拷贝赋值函数定义

3.4 拷贝构造函数的触发时机

4、移动构造函数

4.1 什么是移动构造函数

4.2 移动构造函数签名

4.3 移动构造函数定义

4.4 移动构造函数的使用场景

4.5 为什么移动构造通常要 noexcept?

5、移动赋值函数

5.1 什么是移动赋值函数?

5.2 移动赋值函数签名

5.3 移动赋值函数定义

5.4 移动赋值函数调用场景

5.5 移动构造和移动赋值的区别

6、析构函数

6.1 什么是析构函数

6.2 析构函数签名

6.3 析构函数定义

7、一个包含这些函数的完整示例

8、总结

9、参考链接


 

非AI生成,觉得有用,就请您帮忙点赞转发收藏吧,您的鼓励是我创作的动力,多谢看官。
由于能力水平有限,文中的错误或不严谨的地方,还请批评指正。

1、前言

这五个函数共同构成 C++ 的对象生命周期管理核心,合称“五法则(Rule of Five)”。它们控制对象拷贝、移动、销毁时的资源行为,尤其对堆内存、文件句柄、锁等资源类至关重要。

2、拷贝构造函数

2.1 什么是拷贝构造函数

C++ 拷贝构造函数是一种‌特殊的构造函数‌,用于‌用一个已存在的同类型对象初始化新对象‌,其‌第一个参数必须是本类对象的引用‌(通常加const),由编译器在特定场景下自动调用 。‌‌

2.2 拷贝构造函数签名

ClassName(const ClassName& other)

2.3 拷贝构造函数定义

    MyString(const MyString& other) {
        m_Size = other.m_Size;
        m_Data = new char[m_Size + 1]; // 重新分配内存
        std::memcpy(m_Data, other.m_Data, m_Size + 1);
        std::cout << "拷贝构造函数被调用" << std::endl;
    }

2.4 拷贝构造函数的使用场景

初始化新对象‌:A b(a);A b = a;(声明时)

值传递参数‌:函数参数为类类型对象(按值传入)

值返回对象‌:函数返回类类型对象(按值返回)


MyClass a;
MyClass b = a;   // 拷贝构造
MyClass c(a);    // 拷贝构造
func(a);         // 传值,拷贝构造
return a;        // 返回对象,拷贝构造(可能被NRVO优化掉)

2.5 拷贝构造函数的注意事项

如果没有定义任何拷贝函数,编译器会生成一个默认的拷贝构造函数。

默认拷贝构造函数的行为:

逐成员拷贝(member-wise copy)

对类类型成员:调用它们的拷贝构造函数

对内置类型成员:直接按位复制

当类中管理了资源(尤其是裸指针)时,由于默认拷贝是浅拷贝,会出严重问题,出现双重释放的可能性比较大。

3、拷贝赋值函数

3.1 什么是拷贝赋值函数

C++中的拷贝赋值函数(Copy Assignment Operator)是通过重载operator=实现的‌非静态成员函数‌,用于将‌已存在‌的同类型对象数据深拷贝给另一个‌已存在‌的对象 。‌‌

3.2 拷贝赋值函数签名

ClassName& operator=(const ClassName& other)

3.3 拷贝赋值函数定义

    MyString& operator=(const MyString& other) {
        std::cout << "拷贝赋值运算符被调用" << std::endl;
        if(this != &other) { // 1. 检查自赋值
            delete[] m_Data; // 2. 释放旧内存

            m_Size = other.m_Size;
            m_Data = new char[m_Size + 1]; // 3. 分配新内存
            std::memcpy(m_Data, other.m_Data, m_Size + 1);
        }
        return *this;
    }

http://www.jsqmd.com/news/1204599/

相关文章:

  • C++智能指针std::unique_ptr:独占所有权与零开销内存管理实践
  • 卡地亚中国官方售后服务中心|官方地址及售后热线电话权威信息通告(2026年7月更新) - 卡地亚官方售后中心
  • Claude推理瓶颈全曝光(隐藏层激活轨迹首次公开):从数学证明到代码生成的5类失效模式详解
  • C++共享内存动态库封装:跨平台高性能进程间通信实战指南
  • JWT身份验证全解析:原理、Java实现与安全实践
  • 亨得利官方钟表服务中心|全新地址与官方电话权威信息通告(2026年7月最新) - 亨得利官方博客
  • JuiceFS v1.4 元数据 Changelog 功能详解与应用实践
  • 《级联年度选择》二、CustomDialog使用指南
  • 信用账户高阶指南:分享五大两融技巧!融资融券利率最低是多少?
  • Sora技术架构解析:Diffusion与Transformer的融合创新
  • Havenlon|AI 时代的执行安全语言体系(四):执行权与权力分离 Part 2
  • 江诗丹顿中国官方售后服务中心|地址与客服服务热线权威信息声明(2026年7月最新) - 江诗丹顿服务中心
  • TensorRT深度学习推理优化:核心技术解析与实践指南
  • 优惠券营销工具哪个好?新人礼、满减券和复购活动怎么选
  • Win10系统优化:8项必做设置提升性能与流畅度
  • 蓝桥杯国赛题解:基于GCD与哈希的线段整点覆盖算法
  • 最新融资融券攻略!两融利率最低是多少?
  • 英伟达:动态双焦RoPE高效长文扩展
  • Windows系统自动安装程序清理与优化指南
  • 基于C11线程池模型 - 缓冲式线程池
  • C++标准库算法实战指南:从迭代器到并行编程的现代C++高效编程
  • Python+Selenium自动化刷题工具:从原理到实战的完整实现
  • C++跨平台开发实战:从架构设计到工具链的完整解决方案
  • 卡地亚中国官方售后服务中心|官方电话和详细地址权威信息公示(2026年7月最新) - 卡地亚服务中心
  • Visual C++数字图像模式识别:从环境搭建到SVM分类实战
  • Linux内核内存布局与泄漏诊断实战指南
  • Ubuntu命令行高效管理与运维实战指南
  • 2026年7月最新泉州欧米茄官方售后服务热线与网点地址查询 - 欧米茄官方服务中心
  • ppt模板_0174_绿色蜡画
  • 2026 年新消息:吉隆有实力的进口电地暖供货厂家哪家可靠,打破暖气焦虑:这套系统如何彻底改变你的居住体验? - 企业推荐管【认证】