拒绝隐式转换--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 关键字可以避免一些潜在的错误,尤其是在涉及单参数构造函数的情况下,防止不经意的隐式类型转换。

相关文章
|
7月前
|
安全 编译器 程序员
【C++ 修饰符关键字 explicit 】掌握C++中的explicit :构造函数行为和初始化综合指南
【C++ 修饰符关键字 explicit 】掌握C++中的explicit :构造函数行为和初始化综合指南
434 3
|
C++
24 C++ - explicit关键字
24 C++ - explicit关键字
40 0
|
7月前
|
存储 安全 算法
【C/C++ 关键字 函数说明符 】C++ noexcept 关键字(指定某个函数不抛出异常)
【C/C++ 关键字 函数说明符 】C++ noexcept 关键字(指定某个函数不抛出异常)
78 0
|
3月前
|
安全 Go C语言
Go常量的定义和使用const,const特性“隐式重复前一个表达式”,以及iota枚举常量的使用
这篇文章介绍了Go语言中使用`const`定义常量的方法,包括常量的特性“隐式重复前一个表达式”,以及如何使用`iota`实现枚举常量的功能。
|
6月前
|
存储 编译器 程序员
C++一分钟之-auto关键字与类型推导
【6月更文挑战第21天】`auto`在C++11中重生,简化了类型声明,尤其在处理复杂类型时。它让编译器根据初始化值推导变量类型,减少了冗余和错误。使用`auto`简化了迭代器声明和函数返回类型推导,但也带来挑战:类型推导可能不直观,未初始化的`auto`是错误的,且过度使用影响可读性。使用`auto&`和`auto*`明确引用和指针,`decltype`辅助复杂类型推导,保持适度使用以维持代码清晰。
57 1
引用作为重载条件
引用作为重载条件
42 0
|
C++
【C++知识点】explicit 关键字
【C++知识点】explicit 关键字
83 0
|
C++
怎么理解 C++ 的 explicit 关键字?
给构造函数声明 explicit 可以阻止它们被用来执行隐式类型转换(implicit type conversions)。本文通过一个例子来直观地帮助大家理解 C++ 中的 explicit 关键字。
129 0
|
C#
C# defualt关键字默认值用法
原文:C# defualt关键字默认值用法 默认值表达式生成类型的默认值。 默认值表达式在泛型类和泛型方法中非常有用。 使用泛型类和泛型方法时出现的一个问题是,如何在无法提前知道以下内容的情况下将默认值赋值给参数化类型 T: T 是引用类型还是值类型。
983 0