当前位置: 首页 > news >正文

博客类网站模板网站的维护与更新

博客类网站模板,网站的维护与更新,wordpress 全屏滑块主题,wordpress星座主题自适应C11 引入的委托构造函数(delegating constructor) 一、概念与语法 委托构造指一个构造函数在其初始化列表中,直接调用同类的另一个构造函数来完成部分(或全部)初始化。 语法形式: class A { public:A(int …

C++11 引入的委托构造函数(delegating constructor)


一、概念与语法

  • 委托构造指一个构造函数在其初始化列表中,直接调用同类的另一个构造函数来完成部分(或全部)初始化。

  • 语法形式:

    class A {
    public:A(int x, int y): _x(x), _y(y){ /* 主构造逻辑 */ }// 委托构造:将初始化委托给 A(int,int)A(): A(0, 0)    // 委托到上面带参构造{ /* 可留空或做额外逻辑 */ }A(int x): A(x, 0)    // 委托到 A(int,int){ }
    private:int _x, _y;
    };
    
  • 只有一个委托目标可写在初始化列表的最开头,而且初始化列表中不能再出现成员或基类初始化,否则编译失败。


二、使用场景

  1. 消除重复代码
    多个构造函数共享“公共初始化”逻辑时,将初始化集中在一个“主构造函数”中,其它构造函数只负责传参及少量收尾工作。
  2. 统一资源获取/设置
    比如打开文件、分配内存、注册回调等步骤应只在一处编写,避免修改遗漏。
  3. 与默认参数不可兼得时的替代
    对于需要在不同分支做不同预处理,再调用主构造,委托构造比重载+默认参数更灵活。

三、执行顺序

假设有三种构造函数链:

A()      : A(1)       { std::cout<<"A() body\n"; }
A(int x) : A(x, 2)    { std::cout<<"A(int)\n"; }
A(int x, int y)       { std::cout<<"A(int,int)\n"; }

A() 时,调用流程为:

  1. 调用 A() 的初始化列表,委托到 A(int)
  2. A(int) 的初始化列表,委托到 A(int,int)
  3. 进入 A(int,int)——执行成员和基类的初始化,再执行它的函数体;
  4. 返回 A(int),执行其函数体;
  5. 返回 A(),执行其函数体。

输出示例:

A(int,int)
A(int)
A()

四、限制与注意事项

  1. 只能委托同一类内部的另一个构造
    不能跨类委托,也不能在同一初始化列表里同时委托和初始化成员/基类。

  2. 禁止循环委托
    A 委托到 B,B 又委托到 A,会导致无限递归。编译器会报错。

  3. 初始化列表顺序不变
    即使在委托链中先后出现,基类子对象仍旧最先初始化,接着按声明顺序初始化成员。

  4. 与默认成员初始化配合

    • 如果成员在类内已给出默认初始化,主构造函数或其委托目标可覆盖它;
    • 非委托目标构造函数不要在初始化列表写成员初始化,以免与委托冲突。
  5. 异常安全
    所有初始化都在主构造函数里发生,如果主构造抛异常,已初始化的成员会被正确析构。

  6. 可与 explicit / 隐式转换结合
    可以给委托构造函数加 explicit,防止意外隐式构造。


五、综合示例

#include <iostream>
#include <string>class Logger {
public:Logger(const std::string& name, int level): _name(name), _level(level){std::cout << "Logger("<<_name<<","<<_level<<")\n";}// 委托到 Logger(name, 0)Logger(const std::string& name): Logger(name, 0){std::cout << "Logger(name)\n";}// 委托到 Logger("default", 0)Logger(): Logger("default"){std::cout << "Logger()\n";}private:std::string _name;int         _level;
};int main() {Logger L1;                 // default 构造Logger L2("network");      // name 构造Logger L3("db", 3);        // 主构造return 0;
}

输出:

Logger(default,0)
Logger(name)
Logger()
Logger(network,0)
Logger(name)
Logger(db,3)

六、最佳实践

  1. 明确主构造函数
    将最完整、最“重”初始化的构造函数作为主构造,保持其逻辑最全。
  2. 文档注释
    在头文件注明哪个构造是“委托”,以及委托的入口/出口含义。
  3. 避免成员初始化冲突
    除主构造外,其它构造不在初始化列表中出现成员/基类初始化,以免编译器报“不能与委托共存”。
  4. 链式委托深度适中
    链太深可能影响可读性和调试,建议不超过 2~3 级
  5. 与默认参数配合
    对于可省略的参数,也可用默认参数+委托构造混合方式,让 API 既简洁又灵活。
http://www.dtcms.com/a/511133.html

相关文章:

  • 【NVIDIA-H200-4】4节点all-reduce-从单节点到四节点的性能跃迁:NVIDIA H200 集群扩展的全链路分析
  • 纯干货呈现!红帽认证最全解析,您想了解的尽在其中
  • 《数据库系统》SQL语言之复杂查询 子查询(NOT)IN子查询 θ some/θ all子查询 (NOT) EXISTS子查询(理论理解分析+实例练习)
  • leetcode 844 比较含退格的字符串
  • 本地neo4j图谱迁移至服务器端
  • 【线规UL认证】入门线规标准要求有一些
  • Allure离线安装指南:支持Windows和Linux系统
  • CoolGuard更新,ip2region升级、名单增加过期时间
  • 济南道驰网站建设有限公司怎么样宝安网站-建设深圳信科
  • UE5 材质-11:继续石头与苔藓,把渐变系数引入到法线中,
  • 跨境电商网站建设成本wordpress自定义文章排列顺序
  • agent设计模式:第三章节—并行化
  • Rust语言特性深度解析:所有权、生命周期与模式匹配之我见
  • 利用DuckDB rusty_sheet插件0.2版在xlsx文件中测试tpch
  • 设计模式之:单例模式
  • 第一章 不可变的变量
  • AUTOSAR 中 Trusted Platform(可信平台)详解
  • 2510rs,rust清单2
  • PINN物理信息神经网络股票价格预测模型Matlab实现
  • 2510rs,rust清单3
  • 用ps做网站方法茂名建站模板搭建
  • 怎么建设vip电影网站wordpress轮播图设置
  • docker 更新layer
  • 基于卷积神经网络的香蕉成熟度识别系统,resnet50,vgg16,resnet34【pytorch框架,python代码】
  • 深度学习YOLO实战:6、通过视频案例,解析YOLO模型的能力边界与选型策略
  • C# 识别图片中是否有人
  • [Power BI] 漏斗图(Funnel Chart)
  • 做网站优化响应式网站 企业模版
  • 视觉学习篇——图像存储格式
  • GB28181视频服务wvp搭建(二)