c++构造函数有哪些 c++默认构造与拷贝构造【详解】

发布时间 - 2026-01-07 00:00:00    点击率:
构造函数是C++中用于初始化对象的特殊成员函数,包括默认构造函数(无参或全默认参数)和拷贝构造函数(const引用单参),分别在对象创建和用同类型对象初始化时调用;编译器仅在未显式定义对应函数时隐式生成,默认构造函数不初始化内置类型,拷贝构造默认执行浅拷贝,深拷贝需手动实现。

构造函数是C++中用于初始化对象的特殊成员函数,它在对象创建时自动调用。掌握默认构造函数、拷贝构造函数以及它们的触发条件和行为差异,对理解对象生命周期、资源管理(尤其是深拷贝)至关重要。

默认构造函数:无参或带默认值的构造函数

默认构造函数是指可以不传入实参就调用的构造函数,包括两种形式:

  • 不带任何参数的构造函数,例如 MyClass() { }
  • 所有参数都提供了默认值的构造函数,例如 MyClass(int x = 0, const char* s = nullptr) { }

如果用户没有定义任何构造函数,编译器会自动生成一个**隐式默认构造函数**(仅当类中没有用户定义的构造函数时)。但一旦你写了任意构造函数(哪怕是有参的),编译器就不再生成默认构造函数——此时若需默认构造,必须显式定义。

注意:隐式生成的默认构造函数不做初始化(内置类型如 int 不初始化为 0,而是未定义值),而用户定义的默认构造函数可按需初始化成员。

拷贝构造函数:用同类型对象初始化新对象

拷贝构造函数是只有一个参数且该参数为 const 引用类型 的构造函数,形式为:MyClass(const MyClass& other)。它的作用是用一个已存在的对象来初始化一个新创建的对象。

以下情况会自动调用拷贝构造函数:

  • 用一个对象初始化另一个对象:MyClass a; MyClass b = a;(注意:这是初始化,不是赋值)
  • 函数以值传递方式传入对象:void func(MyClass obj) { ... } → func(a);
  • 函数返回一个局部对象:MyClass create() { MyClass tmp; return tmp; }(C++17前可能调用,C++17起通常被强制省略,但语义仍按拷贝构造定义)

如果你没写拷贝构造函数,编译器会合成一个默认的——它对每个非静态成员执行“逐成员拷贝”(memberwise copy)。对于指针成员,这会导致浅拷贝问题;需要深拷贝时,必须自己定义拷贝构造函数。

编译器自动生成的构造函数:什么情况下会生成?

编译器在特定条件下会隐式生成三种特殊成员函数(C++11起称为“特殊成员函数”):

  • 默认构造函数:仅当类中没有用户声明的任何构造函数时才生成
  • 拷贝构造函数:仅当类中没有用户声明的拷贝构造函数时才生成(即使你写了其他构造函数)
  • 析构函数:仅当类中没有用户声明的析构函数时才生成(且生成的是非虚的)

这些隐式生成的函数都是 public、inline、非 explicit 的。若希望禁止某些行为(如禁止拷贝),应显式使用 = delete,例如:MyClass(const MyClass&) = delete;

常见误区与注意事项

容易混淆的几个点:

  • MyClass a = MyClass(); 是直接初始化,调用默认构造函数(C++17起 guaranteed copy elision,不调用拷贝构造)
  • MyClass a(b);MyClass a = b; 都调用拷贝构造函数(后者是复制初始化语法,但效果等价)
  • 赋值操作(a = b;)调用的是 拷贝赋值运算符,不是拷贝构造函数
  • 移动构造函数(C++11)和拷贝构造函数互不替代;有右值时优先调用移动构造,除非被删除或不可用

写构造函数时,推荐使用成员初始化列表(: member(val))而非在函数体内赋值,尤其对 const 成员、引用成员或没有默认构造函数的类类型成员,这是唯一合法方式。


# c++  # 运算符  # 赋值运算符  # 成员函数  # 构造函数  # 析构函数  # const  # char  # int  # void  # 指针  # 引用类型  # public  # 值传递  # 实参  # copy  # delete  # 对象  # 类中  # 隐式  # 这是  # 时才  # 写了  # 自动生成  # 默认值  # 的是  # 都是  # 几个 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  如何快速搭建高效WAP手机网站吸引移动用户?  Java垃圾回收器的方法和原理总结  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  WordPress 子目录安装中正确处理脚本路径的完整指南  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  JavaScript数据类型有哪些_如何准确判断一个变量的类型  ,交易猫的商品怎么发布到网站上去?  详解MySQL数据库的安装与密码配置  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  Laravel如何自定义分页视图?(Pagination示例)  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  Laravel如何记录自定义日志?(Log频道配置)  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  Linux系统命令中tree命令详解  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  如何自定义建站之星网站的导航菜单样式?  千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  如何在企业微信快速生成手机电脑官网?  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  网站建设要注意的标准 促进网站用户好感度!  常州企业网站制作公司,全国继续教育网怎么登录?  Swift中swift中的switch 语句  EditPlus中的正则表达式实战(5)  浅谈javascript alert和confirm的美化  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  LinuxShell函数封装方法_脚本复用设计思路【教程】  如何快速查询网址的建站时间与历史轨迹?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  Android自定义listview布局实现上拉加载下拉刷新功能  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  JS碰撞运动实现方法详解  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  如何快速配置高效服务器建站软件?  如何在Windows虚拟主机上快速搭建网站?  网站建设整体流程解析,建站其实很容易!  海南网站制作公司有哪些,海口网是哪家的?  在线制作视频的网站有哪些,电脑如何制作视频短片?  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  如何在IIS中配置站点IP、端口及主机头?