C++中的委托构造函数是什么?(代码复用)
发布时间 - 2026-01-11 00:00:00 点击率:次委托构造函数是C++11特性,允许一个构造函数在初始化列表中调用同类其他构造函数以复用初始化逻辑;被委托者先执行,委托者体后执行,且委托必须独占初始化列表。
委托构造函数是C++11引入的特性,允许一个构造函数调用同一个类的另一个构造函数,从而避免重复代码,实现构造逻辑的复用。
委托构造函数的基本写法
在构造函数初始化列表中,用类名(参数...)的形式调用本类其他构造函数:
- 被委托的构造函数先执行,完成对象初始化;
- 委托方构造函数体内的代码后执行(可补充额外逻辑);
- 委托必须出现在初始化列表中,且不能与其他成员初始化混用(即不能同时初始化其他成员变量)。
典型复用场景示例
比如一个Person类有多种构造方式,但核心字段(姓名、年龄)总要校验和赋值:
class Person {
std::string name_;
int age_;
public:
// 主构造函数(做完整校验和初始化)
Person(const std::string& n, int a) : name_(n), age_(std::max(0, a)) {
if (n.empty()) throw std::invalid_argument("name cannot be empty");
}
// 委托构造:只传姓名,默认年
龄为0
Person(const std::string& n) : Person(n, 0) {} // ← 委托给上面的构造函数
// 委托构造:只传年龄,默认姓名为空字符串
Person(int a) : Person("", a) {}
};
这样,校验逻辑只写一次,维护更简单,也不用把初始化逻辑挪到私有辅助函数里。
注意事项和限制
- 委托链不能循环(A→B→A会编译失败);
- 不能在委托构造函数体内再调用其他构造函数;
- 如果类有虚基类,被委托的构造函数负责初始化它,委托方不能再初始化;
- 委托构造函数不能有mem-initializer(即初始化列表里只能有委托,不能有
member(value))。
本质上,委托构造函数不是“调用函数”,而是把初始化责任转交给另一个构造路径——对象只被初始化一次,语义清晰,复用自然。基本上就这些。
# c++
# 代码复用
# 成员变量
# 构造函数
# 循环
# 委托
# 对象
# 能有
# 复用
# 列表中
# 体内
# 出现在
# 本类
# 能在
# 总要
# 能再
# 有多种
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
南京网站制作费用,南京远驱官方网站?
ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】
C++用Dijkstra(迪杰斯特拉)算法求最短路径
如何在建站宝盒中设置产品搜索功能?
如何在橙子建站中快速调整背景颜色?
Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
nodejs redis 发布订阅机制封装实现方法及实例代码
JS去除重复并统计数量的实现方法
Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件
Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理
JavaScript如何实现路由_前端路由原理是什么
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理
Laravel Admin后台管理框架推荐_Laravel快速开发后台工具
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权
Laravel如何实现全文搜索功能?(Scout和Algolia示例)
Linux系统运维自动化项目教程_Ansible批量管理实战
*服务器网站为何频现安全漏洞?
如何自定义建站之星网站的导航菜单样式?
Laravel如何创建自定义Artisan命令?(代码示例)
成都网站制作公司哪家好,四川省职工服务网是做什么用?
如何快速搭建自助建站会员专属系统?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
如何用低价快速搭建高质量网站?
Python文件流缓冲机制_IO性能解析【教程】
JavaScript如何实现继承_有哪些常用方法
晋江文学城电脑版官网 晋江文学城网页版直接进入
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
Python进程池调度策略_任务分发说明【指导】
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
如何用花生壳三步快速搭建专属网站?
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
如何在阿里云通过域名搭建网站?
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
微信小程序制作网站有哪些,微信小程序需要做网站吗?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】
标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析
如何在阿里云完成域名注册与建站?
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
详解Android——蓝牙技术 带你实现终端间数据传输
Android利用动画实现背景逐渐变暗
潮流网站制作头像软件下载,适合母子的网名有哪些?


龄为0
Person(const std::string& n) : Person(n, 0) {} // ← 委托给上面的构造函数
// 委托构造:只传年龄,默认姓名为空字符串
Person(int a) : Person("", a) {}
};