C++中 explicit 用法:多参数构造函数

单参数

C++中 explicit 用法 + 工业级代码实战作用

多参数

继续来看多参数,下面的例子中构造函数有两个参数:

cpp 复制代码
#include <iostream>

class ClassA {
public:
  ClassA(int num1, int num2)
    : num1_{ num1 }
    , num2_{ num2 }
  {
    std::cout << __FUNCSIG__ << std::endl;
  }
  void print() {
    std::cout << "num1_:" << num1_ << std::endl;
    std::cout << "num2_:" << num2_ << std::endl;
  }
private:
  int num1_;
  int num2_;
};

void TestClassA(ClassA class_a) {
  std::cout << __FUNCSIG__ << std::endl;
  class_a.print();
}

int main() {
  ClassA test_class_a2 = { 1, 2 };

  TestClassA({ 1, 2 });

  return 0;
}

ClassA test_class_a2 = { 1, 2 } 以及 TestClassA({ 1, 2 }) 中虽然使用了大括号列表初始化的写法,和直接传入单个整数的形式不同。编译器会自动把 {1,2} 这个初始化列表,隐式调用 ClassA 的双参数构造函数,创建出一个临时的 ClassA 对象。这种写法没有明确写出类名,仍然会导致代码可读性下降。因此,即使是多参数构造函数,为了禁止隐式转换、提升代码清晰度和安全性,仍然强烈建议加上 explicit 关键字。

cpp 复制代码
explicit ClassA(int num1, int num2)
  : num1_{ num1 }
  , num2_{ num2 }
{
  std::cout << __FUNCSIG__ << std::endl;
}

并显示转换:

cpp 复制代码
ClassA test_class_a2 = ClassA{ 1, 2 };

TestClassA(ClassA{ 1, 2 });

带默认参数的多参数构造

两个参数,其中带有一个默认参数的例子:

cpp 复制代码
#include <iostream>

class ClassA {
public:
  ClassA(int num1, int num2 = 0)
    : num1_{ num1 }
    , num2_{ num2 }
  {
    std::cout << __FUNCSIG__ << std::endl;
  }
  void print() {
    std::cout << "num1_:" << num1_ << std::endl;
    std::cout << "num2_:" << num2_ << std::endl;
  }
private:
  int num1_;
  int num2_;
};

void TestClassA(ClassA class_a) {
  std::cout << __FUNCSIG__ << std::endl;
  class_a.print();
}

int main() {
  ClassA test_class_a2 = 1;

  TestClassA(1);

  return 0;
}

对于这种带有默认参数,只有第一个参数是非默认参数的情况,在调用时候从代码 TestClassA(1) 也很难判断是一个整形参数?还是创建了一个临时对象?因此,也需要在构造函数前加 explicit 关键字。

cpp 复制代码
explicit ClassA(int num1, int num2 = 0)
  : num1_{ num1 }
  , num2_{ num2 }
{
  std::cout << __FUNCSIG__ << std::endl;
}

并显示转换:

cpp 复制代码
ClassA test_class_a2 = ClassA(1);

TestClassA(ClassA(1));
相关推荐
旖-旎11 分钟前
LeetCode 494:目标和(动态规划/01背包问题)—— 题解
c++·算法·leetcode·动态规划·01背包
ysa0510301 小时前
【板子】德州扑克模拟
c++·笔记·板子
慧都小项1 小时前
C/C++ 静态分析为什么要前移?Parasoft C/C++test 在 IDE 与 CI/CD 中的应用
c语言·c++·ide·功能测试·ai
qq_33776320192 小时前
国际期货资管系统开发方案|内外盘交易平台源码授权与二次开发支持
java·c语言·开发语言·c++·c#
zmzb010313 小时前
C++课后习题训练记录Day157
开发语言·c++
从零开始的代码生活_16 小时前
C++ 多态详解:虚函数、动态绑定、抽象类与虚表原理
开发语言·c++·后端·学习·算法
大彼方..17 小时前
C++ STL Vector 深度剖析:从内存管理到性能优化
开发语言·c++
炸薯条!17 小时前
从零开始学C++ (内存管理)
java·jvm·c++
cpp_250119 小时前
P6625 [省选联考 2020 B 卷] 卡牌游戏
数据结构·c++·算法·前缀和·贪心·洛谷题解·省选
旖-旎1 天前
《LeetCode 416 分割等和子集》
c++·算法·leetcode·动态规划·背包问题