委托构造函数必须在初始化列表中以this(args)形式调用且唯一,不可与其他成员初始化混用;被委托构造函数体不执行,控制权直接移交委托者。

委托构造函数必须写在初始化列表里
委托构造函数不是普通调用,它得在成员初始化列表中用 this(args) 的形式触发,且必须是初始化列表中唯一出现的内容——不能混着其他成员初始化,也不能出现在函数体里。
- 错误写法:
MyClass(int x) { this(0); }(编译失败,this()只能在初始化列表) - 正确写法:
MyClass(int x) : this(0) {} - 如果还想初始化某个成员,比如
val,那只能让被委托的构造函数负责它,委托者自己不能加val(x)
被委托的构造函数不能同时被其他函数调用
被委托的构造函数本身可以正常使用,但它的函数体在委托场景下不会执行——控制权交出去后,就跳过自己的函数体,直接执行委托者的函数体(如果有)。这点容易误以为“先跑被委托的,再跑委托的”,其实不是。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 现象:
A() : A(42) { std::cout 中,<code>"A body"不会输出 - 原因:委托发生时,
A(42)的函数体照常执行,但A()自己的函数体被跳过 - 所以别指望靠委托构造函数来“复用逻辑块”,它复用的是初始化逻辑,不是运行时逻辑
委托链不能循环,也不支持跨继承层级
C++ 不允许构造函数 A 委托 B、B 又委托 A;也不允许派生类构造函数直接委托基类构造函数(那是基类初始化列表干的事),委托只发生在同一类的多个构造函数之间。
- 编译错误示例:
error: delegating constructor cannot call itself - 常见误操作:在派生类里写
Derived() : Base() {}—— 这不是委托,是基类初始化,语法合法但和委托无关 - 委托目标必须是同名类的另一个构造函数,签名可以不同,但不能是模板特化或 deleted 函数
默认参数有时比委托更轻量,但语义不同
如果只是参数数量差异小、逻辑高度一致,用默认参数往往更直接;但一旦初始化逻辑分支多(比如有的构造函数要 new 内存、有的要 mmap 文件),委托就不可替代——默认参数无法改变初始化列表内容。
- 能用默认参数的情况:
MyClass(int x = 0, int y = 0) : x_(x), y_(y) {} - 必须用委托的情况:一个构造函数要调
init_from_file(),另一个要调init_from_buffer(),而这两者都涉及资源分配,必须在初始化阶段完成 - 注意:委托构造函数会让类失去默认构造函数(如果没显式定义),影响聚合类型判断和某些模板匹配
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










