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

C++ 移动构造与移动赋值:类成员变量处理方式

移动构造与移动赋值中类成员变量处理方式相同,此处以移动构造为例子。首先写一个类,包含类中所有可能的成员变量类型:

  1. 基础值(int、float、bool、char…)
  2. 裸指针(T*)
  3. 类(std::string、vector、自己写的类…)
  4. 智能指针(unique_ptr、shared_ptr)
  5. 左值引用(T&)

首先我们创建一个类,并且包含上述所有类型的成员变量:

classMyClass{// (自定义类,包含移动构造函数,这里省略了)......};classTestClass{public:TestClass(int&ref_num):num_{1},ptr_{newint(10)},vec_{1,2,3},my_class_{MyClass()},u_ptr_{std::make_unique<int>(20)},s_ptr_{std::make_shared<int>(30)},ref_num_{ref_num}{std::cout<<"default constructor\n";}// 移动构造TestClass(TestClass&&other)noexcept{std::cout<<"move constructor\n";}~TestClass(){deleteptr_;// 裸指针需要手动释放ptr_=nullptr;std::cout<<"destructor\n";}private:intnum_;// 基础类型int*ptr_;// 裸指针std::vector<int>vec_;// 标准库容器类MyClass my_class_;// 自定义类std::unique_ptr<int>u_ptr_;// 独占智能指针std::shared_ptr<int>s_ptr_;// 共享智能指针int&ref_num_;// 左值引用};

其中移动构造函数我们先保持什么都不做,下面分别给出每种类型处理方式。


1. 基础值(int、float、bool、char…)

基础值类型没有移动的概念,只能直接拷贝数据。

// 移动构造TestClass(TestClass&&other)noexcept:num_{other.num_}// 基础数据类型:直接拷贝值{std::cout<<"move constructor\n";// 把原对象置为安全状态other.num_=0;}

2. 裸指针(T*)

对于裸指针,不需要拷贝指针指向的数据,直接拷贝指针地址。

// 移动构造TestClass(TestClass&&other)noexcept:ptr_{other.ptr_}// 裸指针:直接拷贝指针地址,不拷贝指向的数据{std::cout<<"move constructor\n";// 把原对象置为安全状态other.ptr_=nullptr;}

3. 类(string、vector、自定义类)

无论是标准库中的类还是自定义的类,使用std::move直接交给类本身的移动构造函数,转移内部资源,类成员变量处理方式和本文相同。

// 移动构造TestClass(TestClass&&other)noexcept:vec_{std::move(other.vec_)},// 标准库容器(vector):调用vector的移动构造,高效转移内部内存my_class_{std::move(other.my_class_)},// 自定义类:调用自定义类的移动构造,转移其内部资源{std::cout<<"move constructor\n";}

4. 智能指针(unique_ptr /shared_ptr)

不论是unique_prt(独占指针)还是shared_prt(共享指针)都使用std::move转移所有权,当然shared_prt虽然转移了所有权,但是本身不改变引用计数。本质仍然是调用了其内部的移动构造函数。

// 移动构造TestClass(TestClass&&other)noexcept:u_ptr_{std::move(other.u_ptr_)},// unique_ptr:独占智能指针,转移所有权s_ptr_{std::move(other.s_ptr_)},// shared_ptr:转移所有权,但移动不改变引用计数{std::cout<<"move constructor\n";}

5. 左值引用(T&)

引用类型只能拷贝,不能移动和重新绑定。

// 移动构造TestClass(TestClass&&other)noexcept:ref_num_{other.ref_num_}// 左值引用:引用无法移动/重新绑定,只能拷贝{std::cout<<"move constructor\n";}

这里贴出完整代码,大家可以打断点调试查看资源转移情况:

#include<iostream>#include<vector>#include<memory>classMyClass{// (自定义类,包含移动构造函数,这里省略了)......};classTestClass{public:TestClass(int&ref_num):num_{1},ptr_{newint(10)},vec_{1,2,3},my_class_{MyClass()},u_ptr_{std::make_unique<int>(20)},s_ptr_{std::make_shared<int>(30)},ref_num_{ref_num}{std::cout<<"default constructor\n";}// 移动构造TestClass(TestClass&&other)noexcept:num_{other.num_},// 基础数据类型:直接拷贝值ptr_{other.ptr_},// 裸指针:直接拷贝指针地址,不拷贝指向的数据vec_{std::move(other.vec_)},// 标准库容器(vector):调用vector的移动构造,高效转移内部内存my_class_{std::move(other.my_class_)},// 自定义类:调用自定义类的移动构造,转移其内部资源u_ptr_{std::move(other.u_ptr_)},// unique_ptr:独占智能指针,转移所有权s_ptr_{std::move(other.s_ptr_)},// shared_ptr:转移所有权,但移动不改变引用计数ref_num_{other.ref_num_}// 左值引用:引用无法移动/重新绑定,只能拷贝{std::cout<<"move constructor\n";// 把原对象置为安全状态other.ptr_=nullptr;other.num_=0;}~TestClass(){deleteptr_;// 裸指针需要手动释放ptr_=nullptr;std::cout<<"destructor\n";}private:intnum_;// 基础类型int*ptr_;// 裸指针std::vector<int>vec_;// 标准库容器类MyClass my_class_;// 自定义类std::unique_ptr<int>u_ptr_;// 独占智能指针std::shared_ptr<int>s_ptr_;// 共享智能指针int&ref_num_;// 左值引用};intmain(){intnum{1};TestClass test_default{num};// 默认构造TestClass test_move{std::move(test_default)};// 移动构造std::cout<<"Program finished!\n";return0;}
http://www.jsqmd.com/news/603651/

相关文章:

  • DFS:带重复项的全排列,程序运行全流程解析
  • 【研报287】小马智行深度报告:Robotaxi赛道的竞争格局
  • 212_视觉处理的基石:深入浅出卷积层(Convolutional Layer)
  • IBM V3700控制器更换实战:从503错误到系统恢复的全过程解析
  • 原木全屋定制工厂:优质厂商选择标准深度解析
  • 从LevelDB到自研PoolEngine:金融C++内存池测试演进史(2003–2024,12次重大架构迭代中的3次致命教训)
  • Venera开源漫画管理工具:从环境搭建到高级功能应用全指南
  • 关于对RNN,LSTM,BiLSTM算法的初步认识
  • XUnity.AutoTranslator:高性能Unity游戏实时翻译架构解析
  • 原型与原型链、原型属性学习笔记
  • STM32定时器级联功能实战:如何构建64位定时器
  • python boto3
  • Win11Debloat:轻松打造极速、纯净Windows 11的终极指南
  • 4大维度掌握AI音乐源分离:Demucs的技术突破与实践指南
  • 告别理论推导!用《有源滤波器的快速实用设计》手把手搞定1kHz带通滤波器(附Multisim仿真)
  • Kubernetes网络入门003篇【20260407】
  • 2026执医考试备考优质机构最新推荐_零基础、在职高效通过首选 - 医考机构品牌测评专家
  • npm国内镜像加速之使用 nrm 工具(灵活切换,适合多环境)
  • Linux新手必看:fdisk磁盘分区从入门到精通(含常见问题解决)
  • 19米LS型螺旋输送机设计【说明书+CAD图纸+开题报告+外文翻译】
  • 为什么92%的Python MCP项目在CI/CD阶段突然报错?揭秘被官方文档隐藏的4个环境依赖雷区
  • BallonsTranslator:基于深度学习的智能漫画翻译与排版解决方案
  • 2026执业药师考试机构全景测评:零基础、在职、二战考生高效备考优选 - 医考机构品牌测评专家
  • 云原生环境中的AI推理服务部署
  • 蓝桥杯单片机第12届省赛2满分(西风)
  • AI辅助开发新思路:让快马AI智能分析你的谷歌浏览器下载习惯
  • 探索 Z 源逆变器的多种 SPWM 仿真模型
  • ESP32智能股票监控系统:实时价格触发电话提醒(附完整代码)
  • 2026执业药师网课测评:零基础、在职、二战考生如何选择备考方案 - 医考机构品牌测评专家
  • 四旋翼姿态解算实战:MahonyAHRS算法中的初始姿态角优化策略