前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >EasyC++69,转换函数

EasyC++69,转换函数

作者头像
TechFlow-承志
发布2022-08-26 17:30:41
3380
发布2022-08-26 17:30:41
举报
文章被收录于专栏:TechFlow

作者 | 梁唐

大家好,我是梁唐。

这是EasyC++系列的第69篇,来聊聊转换函数。

转换函数

上一篇我们聊了类的转换,C++允许通过构造函数进行隐式类型转换。

那我们自然而然产生一个问题:这样的转换可逆吗?我们有没有办法把一个类的对象再转换回基本变量类型呢?

比如:

代码语言:javascript
复制
Time t(14);
int x = t;

这是可以的,不过不是使用构造函数。构造函数只能用于从某种类型到类类型的转换,要进行相反的转换需要使用C++中的一种特殊运算符函数——转换函数。

转换函数是用户定义的强制类型转换,可以使用强制类型转换的语法来使用。加入我们定义了Time类的转换函数,我们可以使用如下的转换:

代码语言:javascript
复制
Time t(14);
int x = int(t);
int y = (int) t;

那么如何创建转换函数呢?其实转换函数本质上也是一种运算符重载,要转换为typeName类型,需要使用这种形式的转换函数:

代码语言:javascript
复制
operator typeName();

并且还有几个条件:

  • 必须是类方法
  • 不能指定返回类型
  • 不能有参数

加上转换类型之后,Time定义如下:

代码语言:javascript
复制
class Time {
  private:
     int minutes;
    public:
     Time();
     Time(int m) {
   minutes = m;
  }
     operator int() const;
     operator double() const;
};

虽然转换函数没有声明返回类型,但是我们一样需要返回所需的值。我们再来看下实现的代码:

代码语言:javascript
复制
Time::operator int() const {
    return minutes;
}

Time::operator double() const {
    return double(minutes);
}

到这里还没有结束,还有一个很有趣的问题,假设我们使用cout来输出Time对象,那么请问输出的结果会是int还是double呢?

代码语言:javascript
复制
Time t(14);
cout << t << endl;

答案是都不会,编译器会报错。因为cout时没有指定类型,所以编译器会报错使用了二义性(ambiguous)转换。但如果我们去掉一个转换函数,只保留一个,则不会有二义性,可以运行。

同样,我们在赋值的时候也会存在二义性:

代码语言:javascript
复制
long t = Time(14);

解决办法是在赋值的时候使用枪支类型转换来指出要使用哪个转换函数:

代码语言:javascript
复制
Time t(14);
int x = (int) t;
int y = double(t);

和类的转换一样,转换函数有的时候也会有意外情况。为了避免在我们意料之外进行转换,C++11对转换函数也支持了explicit关键字,加上了关键字之后,只有强制转换时才会调用这些转换函数。

代码语言:javascript
复制
class Time {
  private:
     int minutes;
    public:
     Time();
     Time(int m) {
   minutes = m;
  }
     explicit operator int() const;
     explicit operator double() const;
};
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Coder梁 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 转换函数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档