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

C++类_移动构造函数

   std::move 的主要用途是在对象所有权转移时,触发移动构造函数或移动赋值运算符,避免不必要的深拷贝,提升性能。
         移动构造函数 和 移动赋值运算符, std::move转换为右值,匹配到移动构造函数和移动赋值运算符。

#include <iostream>
#include <utility>class MyClass {
public:// 构造函数MyClass(size_t size) : size(size), data(new int[size]) {std::cout << "Constructor called" << std::endl;for (size_t i = 0; i < size; ++i) {data[i] = i;}std::cout << data << std::endl;}// 析构函数~MyClass() {delete[] data;}// 拷贝构造函数MyClass(const MyClass& other) : size(other.size), data(new int[other.size]) {std::cout << "Copy constructor called" << std::endl;for (size_t i = 0; i < size; ++i) {data[i] = other.data[i];}}// 拷贝赋值运算符MyClass& operator=(const MyClass& other) {std::cout << "Copy assignment operator called" << std::endl;if (this != &other) {delete[] data;size = other.size;data = new int[size];for (size_t i = 0; i < size; ++i) {data[i] = other.data[i];}}return *this;}// 移动构造函数MyClass(MyClass&& other) noexcept : size(other.size), data(other.data) {std::cout << "Move constructor called" << std::endl;other.size = 0;other.data = nullptr;}// 移动赋值运算符MyClass& operator=(MyClass&& other) noexcept {std::cout << "Move assignment operator called" << std::endl;if (this != &other) {delete[] data;size = other.size;data = other.data;other.size = 0;other.data = nullptr;}return *this;}void printData() const {for (size_t i = 0; i < size; ++i) {std::cout << data[i] << " ";}std::cout << data << std::endl;}private:size_t size;int* data;
};int main() {MyClass obj1(5);// 使用 std::move 调用移动赋值运算符MyClass obj2 = std::move(obj1);obj2.printData();MyClass obj3(std::move(obj2));obj3.printData();return 0;
}    

 // 移动构造函数 MyClass(MyClass&& other)
// 移动赋值运算符 MyClass& operator=(MyClass&& other)
这个两个函数的参数不带const,拷贝构造和拷贝赋值是带const,不能修改成员变量的值。

运行结果:

http://www.dtcms.com/a/169462.html

相关文章:

  • 装饰器@wraps(func)详解
  • MFC自定义控件开发与使用指南
  • (1)大模型的提示词工程实践技巧---LLM输出配置详解
  • 动态功耗与静态功耗
  • WGDI-分析WGD及祖先核型演化的集成工具-文献精读126
  • 【Mytais系列】介绍、核心概念
  • 【自然语言处理与大模型】使用Xtuner进行模型合并与导出
  • Github 2025-05-03 Rust开源项目日报 Top10
  • (即插即用模块-Attention部分) 六十三、(2024 CVPR) MLKA 多尺度大核注意力
  • 我写了一个分析 Linux 平台打开文件描述符跨进程传递的工具
  • 学习黑客网络安全法
  • Docker与WSL2如何清理
  • WebRTC 服务器之Janus架构分析
  • 【JAVA】数组与内存模型:二维数组底层实现(9)
  • 2.2 矩阵
  • NV203NV207SSD固态闪存NV208NV213
  • Maven 实现多模块项目依赖管理
  • neo4j初尝试
  • YOLOv11改进:利用RT-DETR主干网络PPHGNetV2助力轻量化目标检测
  • Excel-CLI:终端中的轻量级Excel查看器
  • 普通IT的股票交易成长史--20250502 突破(2)
  • 硬件工程师面试常见问题(12)
  • ES6/ES11知识点 续一
  • JavaScript性能优化实战之调试与性能检测工具
  • 【Hive入门】Hive与Spark SQL深度集成:通过Spark ThriftServer高效查询Hive表
  • 【Hive入门】Hive与Spark SQL深度集成:执行引擎性能全面对比与调优分析
  • 【Linux】Petalinux驱动开发基础
  • 学习黑客安全基础理论入门
  • Vue3源码学习6-增强鲁棒性?
  • 网络安全:sql注入练习靶场——sqli_labs安装保姆级教程