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

c++移动构造和赋值的样例

#include <iostream>class MyResource {
public:// 默认构造函数MyResource(size_t size = 0) : m_size(size), m_data(size ? new int[size] : nullptr) {std::cout << "Default constructor called\n";}// 析构函数~MyResource() {delete[] m_data;std::cout << "Destructor called\n";}// 拷贝构造函数MyResource(const MyResource& other) : m_size(other.m_size), m_data(other.m_size ? new int[other.m_size] : nullptr) {std::copy(other.m_data, other.m_data + m_size, m_data);std::cout << "Copy constructor called\n";}// 拷贝赋值运算符MyResource& operator=(const MyResource& other) {if (this == &other)return *this;delete[] m_data;m_size = other.m_size;m_data = other.m_size ? new int[other.m_size] : nullptr;std::copy(other.m_data, other.m_data + other.m_size, m_data);std::cout << "Copy assignment operator called\n";return *this;}// 移动构造函数MyResource(MyResource&& other) noexcept : m_size(other.m_size), m_data(other.m_data) {other.m_size = 0;other.m_data = nullptr;std::cout << "Move constructor called\n";}// 移动赋值运算符MyResource& operator=(MyResource&& other) noexcept {if (this == &other)return *this;delete[] m_data;m_size = other.m_size;m_data = other.m_data;other.m_size = 0;other.m_data = nullptr;std::cout << "Move assignment operator called\n";return *this;}// 获取大小size_t size() const {return m_size;}// 检查数据指针const int* data() const {return m_data;}private:size_t m_size;  // 存储大小int* m_data;    // 指向资源的指针
};int main() {MyResource res1(10);          // 调用默认构造函数MyResource res2 = std::move(res1); // 调用移动构造函数MyResource res3;              // 调用默认构造函数res3 = std::move(res2);     // 调用移动赋值运算符return 0;
}
  • 默认构造函数: 初始化资源(如果有大小)。
  • 析构函数: 释放动态分配的资源。
  • 拷贝构造函数: 深拷贝资源。
  • 拷贝赋值运算符: 先删除已有资源再深拷贝新资源。
  • 移动构造函数: 转移资源所有权,将源对象的资源指针置空。
  • 移动赋值运算符: 先删除已有资源,接着转移新资源的所有权并将源对象的资源指针置空。

http://www.lryc.cn/news/357183.html

相关文章:

  • 静态测试---基于WorkList的活跃变量分析
  • Oracle 证书的重要性
  • 【Go专家编程——并发控制——Mutex】
  • SRE视角下的DevOps构建之道
  • 小白如何如何理解滑动窗口最大值问题python
  • Linux--进程间通信(2)(有名管道)
  • window自动启动bat文件
  • 2024年蓝桥杯Web开发【大赛大纲】15届
  • 【vue-cli搭建vue项目的过程2.x】
  • Android 生成正式版密钥库 KeyStore
  • POLARDB:新零售用户MySQL上云最佳选择
  • PHP MySQL图解学习指南:开启Web开发新篇章
  • uniapp一些问题解决
  • 数字经济讲师培训师教授唐兴通谈新质生产力数字化转型高质量发展AI人工智能大模型大数据经信委大数据管理局
  • 关于APM32F407配置串口DMA收发没有数据的问题记录
  • 基于python实现的深度学习web多格式纠错系统
  • UE5文件操作
  • element plus 去掉select选择框的边框,并修改右侧图标
  • Ceph KernelFuse GetSet Quota
  • JVM学习-字节码指令集(二)
  • 解密网络流量监控:优化IT运维的利器
  • oracle 分区表常用语句(2)
  • Python函数式编程进阶:用函数实现设计模式
  • Ingress controller:Kubernetes 的瑞士军刀
  • uniapp tabBar app页面滚动闪屏的问题
  • 【计算机毕业设计】388微信小程序足球赛事及队伍管理系统
  • 监控易监测对象及指标之:华为FusionInsight Kafka服务全方位监控
  • Python装饰器的应用
  • 【数据结构与算法 | 基础篇】力扣232, 225
  • 内网(极空间)搭建gitlab跳板机转发端口及域名配置