C++构造函数怎么使用_详解C++默认构造与拷贝构造函数【进阶】-C++

编译器仅在类无用户定义构造函数且所有成员和基类均可默认构造时隐式生成默认构造函数;否则需显式定义或=default。

默认构造函数和拷贝构造函数不是“写出来就自动生效”的,它们的调用时机、隐式生成规则、是否被编译器删除,全取决于你有没有显式定义其他构造函数、成员是否可复制、类是否有 const 或引用成员。

什么时候编译器会自动生成默认构造函数?

只有当类中没有用户定义的任何构造函数,且所有非静态数据成员和基类都可默认构造时,编译器才隐式声明并定义一个默认构造函数(函数体为空)。一旦你写了任意一个构造函数(哪怕带默认参数),编译器就不再生成默认构造函数。

  • 错误现象:MyClass obj; 编译失败,报错 no matching function for call to 'MyClass::MyClass()' —— 很可能因为你写了 MyClass(int x) 却忘了加默认构造函数
  • 若类中有 const int val; 或 int& ref; 成员,即使没写任何构造函数,编译器也无法生成默认构造函数(因为这些成员必须在初始化列表中初始化)
  • 基类或成员类型本身没有默认构造函数(如某个成员是 std::mutex),也会导致编译器拒绝生成默认构造函数

拷贝构造函数的调用场景与隐式删除条件

拷贝构造函数在对象以值方式传参、返回局部对象、用已有对象初始化新对象(MyClass b = a;)时触发。C++17 后部分场景会强制省略拷贝(RVO/NRVO),但语义上仍要求该函数存在且可访问。

  • 如果你定义了移动构造函数但没定义拷贝构造函数,且没显式 = default,编译器不会自动生成拷贝构造函数(它被隐式删除)
  • 类中有 const 成员或引用成员时,编译器生成的默认拷贝构造函数仍有效(只要这些成员在初始化列表中被正确绑定);但若你手动写了构造函数却漏掉某个引用成员的初始化,就会编译失败
  • 拷贝构造函数形参必须是 const MyClass&(或至少是引用类型),否则会引发无限递归:用 MyClass(MyClass) 定义会导致传参时再次调用自身

如何安全地禁用或委托构造函数?

用 = delete 显式禁用,比不写更明确;用 = default 强制让编译器生成,比手写更安全(尤其含虚函数、继承关系复杂时)。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » C++构造函数怎么使用_详解C++默认构造与拷贝构造函数【进阶】-C++
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3993542+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3993542+
  • 本周更新: 0+
  • 最后更新: 2026-03-16