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、端口及主机头?
上一篇:TCP是什么意思
上一篇:TCP是什么意思

