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

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. 移动语义避免不必要的资源复制,提高性能。

相关文章:

  • C#最佳实践:为何要统一命名
  • 「Flink」Flink项目搭建方法介绍
  • 音频水印——PerTh Watermarker
  • 从MVC到MVVM:从过程式走向声明式
  • 鸿蒙系统备份恢复
  • Activiti初识
  • C++:编译和链接拓展
  • 前端资源帖
  • JAVA-了解网络编程
  • LeetCode - 153. 寻找旋转排序数组中的最小值
  • 2025年渗透测试面试题总结-字节跳动[实习]安全研究员(题目+回答)
  • 代码随想录算法训练营第三十二天 |【动态规划1-13】
  • 嵌入式PADS中敷铜与过孔阵列操作与实现
  • Python Flask 框架学习笔记
  • DAY 31 文件的规范拆分和写法
  • 人工智能学习24-BP激活函数
  • 【专业数据库探索 05】ArangoDB多模数据库革命:一个数据库解决文档图关系三大数据模型
  • uni-app项目loading显示方案
  • 第五章 决策树
  • 同旺科技 USB TO SPI / I2C适配器(专业版)--EEPROM读写——C
  • 网站建设一般字体多大/站长统计是什么意思
  • 深圳正规网站建设/广州seo全网营销
  • 企业vi设计的作用与意义/兴安盟新百度县seo快速排名
  • 多少钱英语怎么说/百度seo优化方法
  • 深圳网站建设公司排行榜/临沂森工木业有限公司
  • 墙绘做网站推广有作用没/淘宝联盟怎么推广