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

【C++】多参数构造函数使用explict的情形

在 C++ 中,“无非默认值” 指的是:构造函数的参数没有设置默认值(即所有参数都必须显式传递)。这个说法通常出现在讨论多参数构造函数是否需要使用 explicit 关键字时。


具体解释

  1. 多参数构造函数
    • 如果一个构造函数有多个参数,且所有参数都没有默认值,则调用时必须传递全部参数,此时不会发生隐式类型转换(因为无法通过单个值构造对象)。
    示例

    class Point {
    public:
        Point(int x, int y) : m_x(x), m_y(y) {}  // 无默认值,必须传递 x 和 y
    };
    
    void draw(Point p) { /* ... */ }
    
    int main() {
        draw(Point(1, 2));  // 正确:显式构造
        // draw(3);         // 错误:无法隐式转换 int → Point(需要两个参数)
        return 0;
    }
    
  2. 有默认值的多参数构造函数
    • 如果多参数构造函数中部分参数有默认值,则可能退化为“单参数构造函数”,此时可能触发隐式转换,需要 explicit 来禁止。
    示例

    class Point {
    public:
        // 参数 y 有默认值,可以隐式转换 int → Point(等价于单参数构造函数)
        explicit Point(int x, int y = 0) : m_x(x), m_y(y) {}
    };
    
    void draw(Point p) { /* ... */ }
    
    int main() {
        draw(Point(3));     // 正确:显式构造
        // draw(4);        // 错误:explicit 禁止了隐式转换
        return 0;
    }
    

总结

场景是否需要 explicit原因
多参数构造函数,所有参数无默认值❌ 不需要必须传递所有参数,无法隐式转换。
多参数构造函数,部分参数有默认值✅ 需要(若需禁止隐式转换)可能退化为单参数构造函数,允许隐式转换。
单参数构造函数✅ 必须直接支持隐式转换,需显式禁止。

关键点
“无非默认值” 强调构造函数的参数必须全部显式传递,不会隐式简化成单参数构造函数,因此无需 explicit
• 如果有默认值,多参数构造函数可能被误用为单参数构造函数,此时需用 explicit 避免隐式转换。

相关文章:

  • LSM-Tree(Log-Structured Merge-Tree)详解
  • Java 单例模式与线程安全
  • Electron使用WebAssembly实现CRC-16 MAXIM校验
  • jmeter环境搭建及使用
  • 【第9章】亿级电商平台订单系统-整体技术架构设计
  • 【华为OD-E卷 -123 判断一组不等式是否满足约束并输出最大差 100分(python、java、c++、js、c)】
  • AI技术学习笔记系列003:`liger_kernel`、`flashattn2` 和 `unsloth` 介绍
  • 第52届医疗器械博览会盛装启幕,开启AI 赋能驱动医疗装备“新视界”
  • 【k8s004】 Docker 打包 K8s镜像
  • 《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(67)混元无极算素数 - 埃拉托斯特尼筛法
  • 阿里云服务器环境部署 一
  • 【从0到1搞懂大模型】RNN基础(4)
  • 路由的原理
  • pytorch小记(九):pytorch中创建指定形状的张量: torch.empty
  • python中a is None 和 a==None有区别吗
  • 簡易傢俬購物Apps
  • 设计模式(行为型)-观察者模式
  • Linux内核传输层源码分析SCTP
  • IP关联的定义和避免方法
  • 高可用环境下Nginx服务管理脚本优化实践
  • 俄罗斯哈巴罗夫斯克市首次举办“俄中论坛”
  • 视觉周刊|走进变革中的博物馆
  • C919上海虹桥-深圳航线开通,东航今年计划再接收10架C919
  • 俄需要达成怎样的特别军事行动结果?普京:包含四个方面
  • “80后”北大硕士罗婕履新甘肃宁县县委常委、组织部部长
  • 全中国最好的十个博物馆展陈选出来了!