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

c++ 右值引用移动构造函数

测试代码:

// 测试移动构造函数
class MyStr {
private:char* data;size_t size;
public:MyStr() : data(nullptr), size(0) {}MyStr(const char* str) :size(strlen(str)) {data = new char[size + 1];strcpy_s(data, size + 1, str);}// 移动构造函数(参数为右值引用) , 直接浅拷贝,等于将资源原封不动接管过来。MyStr(MyStr&& other) noexcept : data(other.data), size(other.size) {cout << "调用移动构造函数。 字符串:" << other.data << endl;other.data = nullptr; // 转移后置空原对象指针other.size = 0;}// 移动赋值运算符MyStr& operator=(MyStr&& other) noexcept {cout << "调用移动赋值。 字符串: " << other.c_str() << endl;if (this != &other) {delete[] data;    // 释放当前资源data = other.data; // 接管资源size = other.size;other.data = nullptr;other.size = 0;}return *this;}// 析构函数~MyStr() {cout << "析构: " << (data ? c_str() : "null") << endl;delete[] data;}const char* c_str() const { return data; }
};MyStr createString() {MyStr tmp("空洞派, 峨嵋派, 华山派, 武当派, 恒山派, 泰山派, 嵩山派"); // 构造了临时对象,属于右值return tmp; // 可能触发移动语义。除非编译器优化(RVO, 返回值优化, 直接在函数调用处构造该对象)
}// 测试代码:
void testYouZhiRef() {int num = 1;//int&& a = num; // 编译报错: 无法将右值引用绑定到左值int&& a = 9527; // 右值引用a = 250;cout << a << endl << endl;MyStr s1("我的战斗力有6000,他的起码有1万");std::cout << "s1: " << (s1.c_str() ? s1.c_str() : "null") << "\n\n";// 显式调用移动构造函数. 会将左值强制转化为右值。当使用右值对象(临时对象)初始化同类对象时,编译器优先选择调用移动构造函数。// 移动构造优先于拷贝构造MyStr s2 = std::move(s1);// 编译器报警:使用已移动的from对象:s1std::cout << "s1: " << (s1.c_str() ? s1.c_str() : "null") << "\n";std::cout << "s2: " << s2.c_str() << "\n\n";MyStr s3;s3 = createString(); // 函数返回值触发移动赋值std::cout << "s3: " << s3.c_str() << "\n"; 
}

打印:

ok. 移动语义避免不必要的资源复制,提高性能。

http://www.xdnf.cn/news/14228.html

相关文章:

  • 功能安全实战系列10-英飞凌TC3xx_SRI总线监控开发
  • 动态代理选择:JDK vs CGLIB
  • 2.6 激光雷达消息格式
  • ESP32开发-ESP32P4环境配置
  • 【AD笔记】嘉立创元件导入到AD中(原理图-pcd-3D模型)
  • std::ifstream file(filename);详细解释
  • 十字滑台是否可以进行自动化控制?
  • window11等禁止系统更新的设置
  • 【数梦工场】【智慧航空AI大赛】比赛分享 阅读笔记
  • Hugging face 和 魔搭
  • 【论文阅读】Qwen2.5-VL Technical Report
  • Unity 对象层级处理小结
  • UI前端与大数据:如何构建实时数据分析系统?
  • 13_算法链与管道
  • 用于生成式新颖视图合成的密集 3D 场景完成
  • Hashcat使用教程:快速上手密码恢复工具
  • AUTOSAR图解==>AUTOSAR_SRS_OCUDriver
  • 力扣面试150题--添加与搜索单词 - 数据结构设计
  • Java延时
  • python中的模块化编程:日期模块、math算术模块、random模块
  • 温度对IO通信的影响
  • pythonday46
  • Python 标准库之 math 模块
  • 智慧水利可视化:水利水电工程数智化
  • 快速排序C++实现
  • IO扩展的一种简易方法
  • ECharts 图表生成示例
  • CentOS7报错:Cannot find a valid baseurl for repo: base/7/x86_64
  • day034-rsync异地容灾
  • org.springframework.cloud.openfeign 组件解释