explicit关键字的作用

explicit关键字在写程序时使用的次数较少,但是仔细观察会发现,在C 标准库中的相关类声明中explicit出现的频率是很高的,那么explicit关键字到底有什么作用呢?接下来我就为大家一一解答。

explicit为清晰的;明确的之意.顾名思义,关键字explicit可以阻止隐式转换的发生。

例如: C 中只带有一个参数的构造函数,或者或者除了第一个参数外其余参数都有缺省值的多参构造函数,承担了两个角色:

1.用于构建单参数的类对象。

2.隐含的类型转换操作符。

例如:一个类A的构造函数A(int i)就是,既可以用来作为构造器,又可以实现隐式转换A a=1;因为1可以通过构造函数A(int i)转换为一个类A的对象。(隐含的类型转换操作符)

但有时我们并不想让他进行隐式类型转换,这时C 的explicit关键字就起到作用了。

注意:当类的声明和定义分别在两个文件中时,explicit只能写在在声明中,不能写在定义中。

下面我将为大家介绍三种使用explicit关键字的情况:

类型转换函数

#includeusing namespace std;class Fraction{public:  Fraction(int numerator, int denominator = 1): m_numerator(numerator), m_denominator(denominator){}  operator double() const{    return (double)m_numerator/m_denominator;  }private:  int m_numerator;  int m_denominator;}
int main(void){  Fraction fraction(3, 5);  double d = 3.5   f;  cout << d << endl;  return 0;}

我们设计了一个Fraction类(分数类), 在主函数中定义了一个分数对象f,然后将3.5 f赋值给double类型变量d, 但是我们发现f并不是一个double类型的变量,因此编译器会从Fraction类中寻找operator double()函数,隐式调用该函数将Fraction类型转换成一个double类型. operator double()就是我们所说的类型转换函数(type conversion function)。

类型转换函数的一般形式

operator 数据类型 const()
{//函数实现}

1.转换函数必须是类的成员函数

2.转换函数不能声明返回类型

3.形参列表必须为空

4.类型转换函数通常应该是const

当我们想要在明确声明类型转换的时候,才使用类型转化函数时,这时我们就需要使用到explicit关键字了.使用方法如下:

#includeusing namespace std;class Fraction{public:  Fraction(int numerator, int denominator = 1): m_numerator(numerator), m_denominator(denominator){}  explicit operator double() const{    return (double)m_numerator/m_denominator;  }private:  int m_numerator;  int m_denominator;}
int main(void){  Fraction fraction(3, 5);  double d = 3.5   static_cast<double>(f);  cout << d << endl;  return 0;}

注意,这时当我们想调用类型转换函数的时候,需要写成static_cast(f);

注意static_cast 是C 11 引入的类型转换运算符。

单操作数构造函数

还是采用上面的Fraction类,这次我们重载(overload) “ ” 号运算符,使得仍然可以达到相同的效果。

#include
using namespace std
class Fraction
{
public:  Fraction(int numerator, int denominator = 1): m_numerator(numerator), m_denominator(denominator){}   double operator (const Fraction& a)   {    return (a.m_numerator   this->m_numerator)/(a.denominator   this->m_denominator);   }
private:int m_numerator;
int m_denominator;} int main(void){  Fraction fraction(3, 5);  double d = f   3;  cout << d << endl;  return 0;
}

在double d = f 3 这句话中构造函数就是前面所提到的第二种角色隐含的类型转换操作符。因为执行到这句话首先会调用 的重载函数,该函数的调用对象默认为左操作数,右操作数为Fraction类型,因此会调用构造函数将3转换成Fraction类型,然后将得到的返回值double类型赋值给变量d。

同理如果不想让构造函数进行隐式类型转换,可以在构造函数前面加上explicit关键字,防止进行隐式转换.使用方法如下:

#include
using namespace std
class Fraction
{
public:explicit Fraction(int numerator, int denominator = 1): m_numerator(numerator), m_denominator(denominator){}   double operator (const Fraction& a)   {     return (a.m_numerator   this->m_numerator)/(a.denominator   this->m_denominator);  }private:  int m_numerator; int m_denominator; } int main(void){  Fraction fraction(3, 5);  double d = f   3;  cout << d << endl;  return 0;}

你可能会注意到,加上explicit 关键字之后,这个代码将不能正确执行。

来源:code_campaignblog.csdn.net/l2563898960/article/details/97769569

C explicit 关键字详解相关推荐

  1. C++ explicit关键字详解(用于构造函数)

    C++ explicit关键字详解(用于构造函数) C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生.声明为explicit的构造函数不能在隐式转换中使用. ...

  2. C++ 中explicit关键字详解

    展开 explicit关键字的作用 使用情况 类型转换函数 单操作数构造函数 同时出现拷贝构造函数和类型转换函数 拷贝构造函数 总结 参考文献 explicit关键字的作用 explicit关键字在写 ...

  3. explicit关键字详解

    C++ explicit关键字详解 首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是impl ...

  4. C++ explicit关键字详解(转载)

    转载:https://www.cnblogs.com/ymy124/p/3632634.html 首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函 ...

  5. explicit关键字详解(C++ )

    一:首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造 ...

  6. C++ explicit关键字详解

    首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数 ...

  7. QT [006][basic] explicit关键字详解

    QT 里面构造函数,经常会遇到explicit的这个参数,为什么要用到?怎么用? http://www.cnblogs.com/ymy124/p/3632634.html

  8. 矮油~ C++ explicit关键字详解

    https://www.cnblogs.com/rednodel/p/9299251.html

  9. Java中的static关键字详解

    ** Java中的static关键字详解 ** 在一个类中定义一个方法为static,即静态的,那就是说无需本类的对象就可以调用此方法.调用一个静态方法就是 "类名.方法名" ,静 ...

最新文章

  1. 日常笔记——思科认证本地域登录
  2. python3.8 新特性
  3. 青龙羊毛——狸猫十堰
  4. Pandas简明教程:一、Pandas简介与安装
  5. 春风十里不如春城一聚:华平解决方案巡展走进昆明
  6. 一秒点击屏幕次数测试_安卓App性能专项测试流畅度深度解析
  7. C++函数编译原理和成员函数的实现
  8. CVPR2021 最佳论文候选—提高图像风格迁移的鲁棒性
  9. 大型网站的数据库分割问题。
  10. 支持java浏览器_如何为浏览器安装支持JAVA的插件
  11. 10句话快速提高项目经理的领导力
  12. 基于深度学习方法的事件抽取论文整理
  13. 国王学院计算机科学,伦敦大学国王学院计算机科学本科.pdf
  14. 为什么要在csdn开一个博客
  15. 2021-2027全球与中国成像色度计市场现状及未来发展趋势
  16. 5.1声道转化为左右声道
  17. java求三角形周长 面积_用java如何求三角形的周长和面积?
  18. java 项目启动初始化_Spring项目启动时执行初始化方法
  19. Flask的endpoint的理解
  20. @+id/和android:id有什么区别?

热门文章

  1. 找不到opencv_world310.lib OpenCv 一次配置永久使用 基于OpenCv4.0 于仕琪算法 dlib的疲劳检测
  2. Excel导入数据库出现“外部表不是预期的格式”错误的解决方法
  3. 毕业设计全纪录(一)——智能家居系统的门窗系统设计(基于树莓派)
  4. 智慧工地操作这么简单?你也可以学会
  5. 用计算机随机模拟掷骰子的实验,云南师范大学概率论实验报告随机事件的模拟--模拟掷均匀硬币的随机试验...
  6. Rancher2.0安装Kubernetes
  7. 群发猫混合渠道群发出海saas群发系统
  8. 张子阳:谈谈离职和跳槽
  9. Web自动化工具对比
  10. 阿里如何实现秒级百万TPS?搜索离线大数据平台架构解读