拒绝隐式转换--explicit关键字

简介: 拒绝隐式转换--explicit关键字

explicit关键字引入✒️

🔎explicit 是一个关键字,同时也是显式的意思,用于修饰构造函数当构造函数被 explicit 修饰时,它将禁止编译器执行隐式类型转换。这主要用于防止在某些上下文中发生不期望的类型转换。

观察以下代码🚦

class Date
{
public:
   Date(int year)
    :_year(year)
  {}
  /* Date(int year, int month = 1, int day = 1)
     : _year(year)
     , _month(month)
     , _day(day)
   {}*/
 
  Date& operator=(const Date& d)
  {
    cout << "赋值拷贝" << endl;
    if (this != &d)
    {
      _year = d._year;
      _month = d._month;
      _day = d._day;
    }
    return *this;
  }
private:
  int _year;
  int _month;
  int _day;
};
void Test()
{
  Date d1(2022);
  d1 = 2023;
}
 
int main() {
  Test();
  return 0;
}

✋以上代码的Test()函数中,可以直接给对象d1赋值一个2023,编译器会先将2023作为一个参数调用Date类的构造函数(该构造函数必须要只有一个参数,或者第一个参数为无缺省值,其余参数都有缺省值的半缺省的构造函数)生成一个没有名字的对象,再将这个对象赋值拷贝给对象d1.

✋以上代码同时也说明了,构造函数不仅可以构造与初始化对象,对于单个参数或者除第一个参数无默认值其余均有默认值的构造函数,还具有类型转换的作用。

⭐️而explicit关键字可以禁止这种隐式的类型转换

现在将上面代码的构造函数用explicit关键字修饰

 explicit Date(int year)
  :_year(year)
{}
/* explicit Date(int year, int month = 1, int day = 1)
   : _year(year)
   , _month(month)
   , _day(day)
 {}*/

报错信息如下 🚦


⭐️ 使用 explicit 关键字可以避免一些潜在的错误,尤其是在涉及单参数构造函数的情况下,防止不经意的隐式类型转换。

相关文章
|
5月前
|
安全 编译器 程序员
【C++ 修饰符关键字 explicit 】掌握C++中的explicit :构造函数行为和初始化综合指南
【C++ 修饰符关键字 explicit 】掌握C++中的explicit :构造函数行为和初始化综合指南
310 3
|
11月前
|
C++
24 C++ - explicit关键字
24 C++ - explicit关键字
32 0
|
5月前
|
存储 安全 算法
【C/C++ 关键字 函数说明符 】C++ noexcept 关键字(指定某个函数不抛出异常)
【C/C++ 关键字 函数说明符 】C++ noexcept 关键字(指定某个函数不抛出异常)
65 0
|
5月前
|
存储 缓存 安全
【C/C++ 关键字 存储类说明符】C/C++ 的mutable 关键字 忽略对该数据成员的常量性检查在const函数中修改变量值
【C/C++ 关键字 存储类说明符】C/C++ 的mutable 关键字 忽略对该数据成员的常量性检查在const函数中修改变量值
53 0
|
C++
【C++知识点】explicit 关键字
【C++知识点】explicit 关键字
74 0
|
编译器 C++
C++——初始化列表 | explicit关键字 | static成员(下)
C++——初始化列表 | explicit关键字 | static成员(下)
71 0
|
C++
C++——初始化列表 | explicit关键字 | static成员(上)
C++——初始化列表 | explicit关键字 | static成员(上)
67 0
|
C++
怎么理解 C++ 的 explicit 关键字?
给构造函数声明 explicit 可以阻止它们被用来执行隐式类型转换(implicit type conversions)。本文通过一个例子来直观地帮助大家理解 C++ 中的 explicit 关键字。
115 0
|
C#
C# defualt关键字默认值用法
原文:C# defualt关键字默认值用法 默认值表达式生成类型的默认值。 默认值表达式在泛型类和泛型方法中非常有用。 使用泛型类和泛型方法时出现的一个问题是,如何在无法提前知道以下内容的情况下将默认值赋值给参数化类型 T: T 是引用类型还是值类型。
969 0