0

0

C++中的委派构造函数是什么?(如何复用构造逻辑)

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-02-10 14:23:02

|

340人浏览过

|

来源于php中文网

原创

委派构造函数需在成员初始化列表中调用同类其他构造函数,被委派者先完整执行,当前函数体后运行;禁止循环委派、禁止初始化列表含其他初始化项、不可在函数体内调用。

c++中的委派构造函数是什么?(如何复用构造逻辑)

委派构造函数怎么写(C++11起支持)

委派构造函数就是让一个构造函数调用同一个类的另一个构造函数,复用初始化逻辑,避免代码重复。它不是“调用普通函数”,而是语法层面的特殊委托,必须写在成员初始化列表里,且只能出现在那里。

  • 被委派的构造函数会完整执行(包括其成员初始化列表和函数体),当前构造函数的函数体在它之后才运行
  • 不能形成循环委派,比如 A::A(int) 委派给 A::A(),而 A::A() 又反过来委派给 A::A(int) —— 编译器直接报错
  • 委派后,当前构造函数的成员初始化列表必须为空(除了委派调用本身),否则编译失败:例如 A::A() : A(42), x(0) { } 是非法的

示例:

struct Vec {
    int x, y;
    Vec() : Vec(0, 0) {}           // 委派给双参数构造函数
    Vec(int x) : Vec(x, x) {}      // 也委派
    Vec(int x, int y) : x(x), y(y) {}
};

为什么不能在构造函数体内调用另一个构造函数

因为 C++ 中构造函数没有返回值、不能取地址、也不能像普通函数那样被显式调用。你在函数体里写 Vec(1, 2),实际是创建了一个临时对象,跟当前正在构造的实例完全无关 —— 成员变量还是未初始化状态,后续赋值只是覆盖,不是初始化。

  • 常见错误现象:this->Vec(1, 2)Vec(1, 2) 出现在函数体内 → 编译通过但逻辑错误,字段没按预期初始化
  • 根本原因:C++ 对象生命周期由构造函数唯一确立,中途“重构造”不被允许;委派机制是唯一绕过该限制的合法途径
  • 兼容性注意:C++11 才引入,老项目若需兼容 C++98/03,只能靠私有初始化函数 + 构造函数重复调用(但无法初始化 const 或引用成员)

委派构造函数和初始化函数(init)怎么选

当你要复用的逻辑不涉及成员变量的初始化(比如只是设置默认值、校验参数、分配资源),用私有 init() 函数更灵活;一旦涉及 const 成员、引用成员或需要确保只初始化一次,就必须用委派构造函数。

立即学习C++免费学习笔记(深入)”;

Beautiful.ai
Beautiful.ai

AI在线创建幻灯片

下载
  • init() 函数可以被多个构造函数调用,但它不能初始化 const int a = 42; 这类成员 —— 它们必须在初始化列表中完成
  • 委派构造函数能初始化所有成员,但要求被委派者必须能覆盖全部初始化需求;如果某些构造函数要额外做不可委派的操作(如抛异常、日志),得放在委派后的函数体里
  • 性能上无差异:委派是编译期机制,不产生额外运行时开销;init() 多一次函数调用,但现代编译器通常能内联

典型混合用法:

struct File {
    const std::string path;
    FILE* fp;
    File(const char* p) : File(std::string(p)) {}  // 委派处理 string 转换
    File(std::string p) : path(std::move(p)) {      // 初始化 const 成员
        fp = fopen(path.c_str(), "r");
        if (!fp) throw std::runtime_error("open failed");
    }
};

容易被忽略的细节:委派目标必须是同一类的构造函数

你不能委派给父类构造函数,也不能委派给模板特化或别名构造函数 —— 编译器只认字面匹配的、同名同作用域的构造函数签名。

  • 错误示例:Base::Base() 出现在派生类构造函数的初始化列表里 → 不是委派,是基类初始化,语法合法但语义不同
  • 模板类中使用委派需格外小心:委派目标必须能被当前模板参数实例化,否则 SFINAE 不起作用,直接编译失败
  • 如果构造函数是 explicit,委派调用不受影响;但如果委派目标是 explicit,而你在隐式转换场景下触发它(比如 Vec v = 5;),仍会失败 —— 委派不改变原构造函数的 explicit 属性

真正麻烦的是跨继承层级的逻辑复用:委派解决不了,得靠组合或策略类,而不是硬套这个语法。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

541

2023.09.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

668

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

555

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

193

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

205

2025.08.29

包子漫画网页版入口与全集阅读指南_正版免费漫画快速访问方法
包子漫画网页版入口与全集阅读指南_正版免费漫画快速访问方法

本专题汇总了包子漫画官网和网页版入口,提供最新章节抢先看方法、正版免费阅读指南,以及稳定访问方式,帮助用户快速直达包子漫画页面,无广告畅享全集漫画内容。

18

2026.02.10

MC.JS网页版快速畅玩指南_MC.JS官网在线入口及免安装体验方法
MC.JS网页版快速畅玩指南_MC.JS官网在线入口及免安装体验方法

本专题汇总了MC.JS官网入口和网页版快速畅玩方法,提供免安装访问、不同版本(1.8.8、1.12.8)在线体验指南,以及正版网页端操作说明,帮助玩家轻松进入MC.JS世界,实现即时畅玩与高效体验。

14

2026.02.10

谷歌邮箱网页版登录与注册全指南_Gmail账号快速访问与安全操作教程
谷歌邮箱网页版登录与注册全指南_Gmail账号快速访问与安全操作教程

本专题汇总了谷歌邮箱网页版的最新登录入口和注册方法,详细提供官方账号快速访问方式、网页版操作教程及安全登录技巧,帮助用户轻松管理Gmail邮箱账户,实现高效、安全的邮箱使用体验。

6

2026.02.10

铁路12306订票与退改全攻略_高效购票与座位选取技巧
铁路12306订票与退改全攻略_高效购票与座位选取技巧

本专题全面汇总铁路12306订票、退票、改签及候补订单操作技巧,提供车厢座位分布参考、抢票攻略和高铁安检注意事项,帮助新手用户快速掌握高效购票与退改流程,提高出行效率和体验。

10

2026.02.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9万人学习

C 教程
C 教程

共75课时 | 4.6万人学习

C++教程
C++教程

共115课时 | 16.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号