在 C 面向对象编程中缺省函数也叫默认函数是编译器自动生成的特殊成员函数。C98 提供 6 个缺省函数C11 新增 2 个合计 8 个。这些函数在对象创建、拷贝、赋值、销毁等核心生命周期中自动调用是理解 C 对象机制的基石。本文带你一次性吃透8 个缺省函数的作用、生成时机、调用场景、底层逻辑彻底搞懂对象生命周期。一、核心概念什么是缺省函数定义当你没有手动编写这些函数时C 编译器会自动生成的成员函数称为缺省函数。作用管理对象的创建、拷贝、赋值、移动、销毁全生命周期。规则手动实现后编译器不再生成默认版本C986 个C11新增 2 个移动相关函数合计 8 个。二、8 个缺省函数总览62第一部分C98 6 个传统缺省函数默认构造函数析构函数拷贝构造函数拷贝赋值运算符函数取址运算符函数const 取址运算符函数第二部分C11 新增 2 个移动缺省函数移动构造函数移动赋值运算符函数三、C98 6 个缺省函数 逐⼀详解1. 默认构造函数格式类名() {}生成时机没有手动写任何构造函数时编译器自动生成。作用创建对象时调用无参初始化对象。特点内置类型成员不初始化随机值自定义类型成员调用其默认构造函数。调用场景类名 对象名;class Test{ // 没写构造函数 → 编译器自动生成默认构造 }; Test t; // 调用默认构造2. 析构函数格式~类名() {}生成时机没有手动写析构函数时自动生成。作用对象销毁时自动调用释放资源。特点无参、无返回值、唯一默认析构仅释放非堆资源不会释放指针指向的堆内存有指针必须手动写析构。调用场景对象出作用域、delete 对象。3. 拷贝构造函数格式类名(const 类名){}生成时机没有手动写拷贝构造时自动生成。作用用旧对象初始化新对象。特点浅拷贝逐字节拷贝有指针成员会造成重复释放内存。调用场景Test t1; Test t2 t1; // 调用拷贝构造4. 拷贝赋值运算符函数格式类名 operator(const 类名){}生成时机没有手动写重载时自动生成。作用对象之间赋值不是初始化。特点默认浅拷贝有指针必须手动重载实现深拷贝。调用场景Test t1, t2; t2 t1; // 调用拷贝赋值5. 普通取址运算符重载函数格式类名* operator() { return this; }作用对对象取地址对象时调用。特点直接返回对象地址几乎不需要手动重载。6. const 取址运算符重载函数格式const 类名* operator() const { return this; }作用对 const 对象取地址const对象时调用。特点返回 const 指针默认生成无需手动实现。四、C11 新增 2 个移动缺省函数重点C11 引入移动语义目的是提升效率对临时对象将亡值不拷贝数据直接窃取资源所有权。7. 移动构造函数格式类名(类名){}生成时机✅ 没有手动写拷贝构造、拷贝赋值、析构、移动构造、移动赋值✅ 且编译器认为可以安全移动。作用用临时对象初始化新对象窃取资源不拷贝数据。效率远高于拷贝构造。调用场景Test func(){ return Test(); } // 返回临时对象 Test t func(); // C11调用移动构造8. 移动赋值运算符函数格式类名 operator(类名){}生成时机和移动构造一致。作用临时对象给另一个对象赋值窃取资源。调用场景Test t; t func(); // 调用移动赋值五、8 个缺省函数 完整声明格式class Test { public: // 1. 默认构造函数 Test() default; // 2. 析构函数 ~Test() default; // 3. 拷贝构造函数 Test(const Test) default; // 4. 拷贝赋值运算符 Test operator(const Test) default; // 5. 普通取址运算符 Test* operator() default; // 6. const取址运算符 const Test* operator() const default; // 7. 移动构造函数C11 Test(Test) default; // 8. 移动赋值运算符C11 Test operator(Test) default; }; default显式让编译器生成默认版本比自动生成更清晰。六、生成规则编译器什么时候不自动生成面试高频这是最容易踩坑的点必须牢记1. 只要手动写了构造函数→ 不生成默认构造2. 手动写了析构函数→ C11 不生成移动构造 移动赋值3. 手动写了拷贝构造→ 不生成移动构造 移动赋值4. 手动写了拷贝赋值→ 不生成移动构造 移动赋值5. 手动写了移动构造 / 移动赋值→ 不生成拷贝构造 拷贝赋值一句话口诀写析构 / 拷贝 / 赋值C11 就不帮你生成移动函数写移动函数拷贝函数就不再自动生成。七、浅拷贝 vs 深拷贝 vs 移动语义终极对比表格函数操作资源处理适用场景效率拷贝构造浅拷贝共享内存无指针中拷贝赋值浅拷贝共享内存无指针中手动拷贝深拷贝独立内存有指针低移动构造移动语义窃取资源临时对象极高移动赋值移动语义窃取资源临时对象极高八、总结8 个缺省函数核心记忆点总数C98 有 6 个C11 新增 2 个移动函数共8 个。最常用 4 个默认构造、析构、拷贝构造、拷贝赋值。C11 最重要 2 个移动构造、移动赋值提升性能。默认行为都是浅拷贝 / 浅移动有指针必须手动实现深拷贝。生成规则手动写析构 / 拷贝 / 赋值编译器就不生成移动函数。生命周期创建构造 / 移动构造拷贝 / 赋值拷贝构造 / 拷贝赋值移动移动构造 / 移动赋值销毁析构掌握这 8 个缺省函数你就彻底掌握了 C 对象从诞生到销毁的全部底层逻辑总结C 面向对象共8 个缺省函数C98 提供 6 个C11 新增 2 个移动函数核心 4 个默认构造、析构、拷贝构造、拷贝赋值C11 核心 2 个移动构造、移动赋值默认都是浅拷贝类有指针成员必须手动实现深拷贝 / 移动手动写析构 / 拷贝 / 赋值后C11 不会自动生成移动函数。