前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【玩转腾讯云】C++学习笔记-转换函数,explict

【玩转腾讯云】C++学习笔记-转换函数,explict

原创
作者头像
买唯送忧
修改2021-04-30 15:30:45
2.8K1
修改2021-04-30 15:30:45
举报
文章被收录于专栏:虚拟技术学习虚拟技术学习

一、转换函数与explicit

1、格式

代码语言:txt
复制
operator 要转换的类型() const {return 转换后的值;}

因为转换函数是不需要对数据进行什么操作的,,只是把一个类型转换到另一个类型,没有数值上的改动,因此加上一个const。

2、举例

代码语言:txt
复制
//构造函数
Wsj(double m_mo, double m_den = 1):m_denominator(m_den), m_mocu(m_mo){}
//转换函数
operator double()const {return m_denominator * m_mocu;}
//调用
 Wsj w1(3, 4);
double tmp = 2.0 + w1;
//那么tmp是可以成功输出的,因为w1会被转换函数变成double类型,从而与2相加  
//思考:上面式子改为w1 = 2.0 + w1;是否正确呢?

3、思考

上述问题是正确的:因为w1会经过转换函数的转换从而变成double类型与2.0相加,产生了一个单值14.0;构造函数会自动把14.0作为double m_mo,第二个值参数为1,从而把14.0隐式转换成了Wsj对象类型,从而是正确写法。

代码语言:javascript
复制
//构造函数
Wsj(double m_mo, double m_den = 1):m_denominator(m_den), m_mocu(m_mo){}
//转换函数
operator double()const {return m_denominator * m_mocu;}
//运算符重载
Wsj& operator +(const Wsj& ss){...}

//加上运算符重载这段代码会不会报错呢?
w1 = 2.0 + w1;

这段代码是无法正确运行的原因如下:

  1. 前面说了w1会经过转换函数的转换从而变成double类型与2.0相加,产生了一个单值14.0;构造函数会自动把14.0作为double m_mo,第二个值参数为1,从而把14.0隐式转换成了Wsj对象类型,这样可以运行正确;
  2. 然而也可以直接通过运算符重载运行成功从而产生了ambiguous错误。

那怎么解决呢?得看关键字explicit

4、explicit

这个关键字是明确的意思,,绝大多数情况是放在构造函数前面让构造函数不要“自作多情”,即明确构造函数的功能,不让构造函数进行一些隐式转换;

代码语言:javascript
复制
//构造函数
explicit Wsj(double m_mo, double m_den = 1):m_denominator(m_den), m_mocu(m_mo){}
//转换函数
operator double()const {return m_denominator * m_mocu;}
//运算符重载
Wsj& operator +(const Wsj& ss){...}
//调用
w1 = 2.0 + w1;
//这样的话,程序就能运行了。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、转换函数与explicit
    • 1、格式
      • 2、举例
        • 3、思考
          • 4、explicit
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档