
1.默认成员函数C 类会自动生成6 大默认成员函数C11 用 default / delete 精准控制这些函数。1.默认构造函数2.析构函数3.拷贝构造函数4.拷贝赋值运算符5.移动构造函数C116.移动赋值运算符C11关键字作用典型场景default让编译器生成默认实现手动写构造后恢复默认构造delete显式禁用该函数禁止类被拷贝单例模式代码示例#include iostream using namespace std; class Test { public: // 1. 强制生成默认构造函数 Test() default; // 2. 禁用拷贝核心单例模式必用 Test(const Test) delete; Test operator(const Test) delete; // 3. 强制生成默认移动函数 Test(Test) default; Test operator(Test) default; }; int main() { Test t1; // Test t2(t1); 报错拷贝被禁用 Test t3(std::move(t1)); // 正常移动可用 return 0; }1.移动构造函数核心定义作用用一个右值临时对象初始化新对象时调用语法类名(类名 源对象) noexcept;右值引用专门绑定临时对象noexcept告诉编译器无异常STL 容器强制要求核心逻辑接管资源 → 把源对象的指针 / 内存拿过来源对象置空2. 手写实战最能理解原理我们写一个带动态内存的 String 类对比拷贝构造和移动构造#include iostream #include cstring using namespace std; class String { private: char* _str; // 动态内存深拷贝核心 public: // 构造函数 String(const char* str ) { _str new char[strlen(str) 1]; strcpy(_str, str); cout 构造函数: _str endl; } // 1. 拷贝构造函数深拷贝复制一份 String(const String s) { _str new char[strlen(s._str) 1]; strcpy(_str, s._str); cout 拷贝构造(深拷贝): 复制 - _str endl; } // 2. 移动构造函数核心转移资源不拷贝 String(String s) noexcept { _str s._str; // 直接接管临时对象的内存 s._str nullptr; // 源对象置空防止析构时释放资源 cout 移动构造(转移资源): 接管 - _str endl; } // 析构函数 ~String() { if (_str) { delete[] _str; cout 析构函数 endl; } } // 打印 const char* c_str() const { return _str; } }; // 测试函数返回临时对象右值 String getTempString() { return String(临时对象); } int main() { // 调用移动构造用临时对象初始化新对象 String s1 getTempString(); cout s1内容: s1.c_str() endl; return 0; }运行结果✅ 没有执行拷贝构造直接转移资源性能拉满2、移动赋值运算符核心定义作用用一个右值给已经存在的对象赋值时调用语法类名 operator(类名 源对象) noexcept;核心逻辑1.释放自己当前的资源2.接管源对象的资源3.源对象置空4.返回自身引用手写实战接上 String 类在上面的类中添加移动赋值运算符// 3. 拷贝赋值运算符深拷贝 String operator(const String s) { if (this s) return *this; // 防止自赋值 delete[] _str; // 释放旧资源 _str new char[strlen(s._str) 1]; strcpy(_str, s._str); cout 拷贝赋值(深拷贝) endl; return *this; } // 4. 移动赋值运算符核心转移资源 String operator(String s) noexcept { if (this s) return *this; // 1. 防止自赋值 delete[] _str; // 2. 释放当前对象的旧资源 _str s._str; // 3. 接管临时对象资源 s._str nullptr; // 4. 源对象置空 cout 移动赋值(转移资源) endl; return *this; }测试移动赋值int main() { String s2(已存在的对象); // 调用移动赋值临时对象赋值给已存在对象 s2 getTempString(); cout s2内容: s2.c_str() endl; return 0; }运行结果2.右值引用C11性能优化核心解决临时对象拷贝浪费资源的问题。1. 基础概念左值有名字、能取地址、持久存在如变量int a10右值临时对象、不能取地址、用完即销毁如10、函数返回的临时值右值引用专门绑定右值实现移动语义。2. 核心作用移动语义不拷贝数据直接接管临时对象的资源比如字符串的字符数组、容器的内存性能提升巨大。3. 关键std::move ()将左值强制转为右值引用触发移动操作。代码示例#include iostream #include string using namespace std; int main() { string s1 hello world; string s2 std::move(s1); // 移动s1把内存交给s2无拷贝 cout s2: s2 endl; // hello world cout s1: s1 endl; // 空资源被移走 return 0; }扩展完美转发std::forwardT()保留参数的左 / 右值属性用于通用模板函数避免类型丢失。谢谢