类型转换函数 与 explicit关键字

1.类型转换函数

C++中,可以使用构造函数将一个指定类型的数据转换为类的对象,也可以使用类型转换函数 (type conversion function)将一个类对象转换为其他类型的数据。例:

分数(Fraction)类

 #include <iostream>

 using namespace std;

 class Fraction
{
public:
Fraction(int num, int den = ) :m_numberator(num), m_denominator(den) {} operator double() const //转换函数
{
return (double)m_numberator / m_denominator;
} private:
int m_numberator; //分子
int m_denominator; //分母
}; int main()
{
Fraction f(,);
double d = + f; //调用 opertor double() 将f转化为double
cout << d << endl;
return ;
}

f是一个Fraction类型的变量,因此不能直接与3相加,于是编译器会到分数类中寻找,找到了operator double函数,该函数可以将类型对象转换为一个浮点类型的变量。因此该函数就是我们所说的类型转换函数(type conversion function)。

转换函数的一般形式:

 operator 类型名称() const
{
// 实现转换
}
  1. 必须是类的成员函数
  2. 无返回类型
  3. 形参列表为空
  4. 最好为const

2.explicit关键字

也可以通过重载+double类型转换为Fraction类类型。因此该类的代码如下:

 #include <iostream>

 class Fraction
{
public:
Fraction(int num, int den = ) : m_numberator(num), m_denominator(den) {} Fraction operator+(const Fraction &f)
{
return Fraction(this->m_numberator + f.m_numberator, this->m_denominator + f.m_denominator);
} private:
int m_numberator; //分子
int m_denominator; //分母
}; int main()
{
Fraction f(, );
Fraction d = f + ; //调用 non-explicit-one-argument ctor 将4转化为Fraction
return ;
}

但是如果同时存在类型转换函数,就存在了二义性。例:

 #include <iostream>

 class Fraction
{
public:
Fraction(int num, int den = ) : m_numberator(num), m_denominator(den) {} operator double() const
{
return (double)m_numberator / m_denominator;
} Fraction operator+(const Fraction &f)
{
return Fraction(this->m_numberator + f.m_numberator, this->m_denominator + f.m_denominator);
} private:
int m_numberator; //分子
int m_denominator; //分母
}; int main()
{
Fraction f(, );
double d = f + ; //二义性
return ;
}
  • f对象可以通过类型转换函数将类类型转换为double类型,然后加上4赋值给d
  • 4也可以通过构造函数转换为Fraction类型,然后两个类类型相加,又可以通过类型转换函数转换为double类型

解决的办法就是,使用explicit关键字的限制,使用方法也有两种:

  • 直接在构造函数前加上explicit关键字,防止double类型的变量隐式的转换为类类型。
  • 在转换构造函数operator double前加上explicit关键字,表示只有显示的将类类型转换为double类型时才调用该函数,例如:double d = static_cast<double>(f) + 4。

conversion function——转换函数的更多相关文章

  1. C++面向对象高级编程(六)转换函数与non-explicit one argument ctor

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.conversion function 转换函数 //1.转换函数 //conversion function //只要你认为合理 你可以任 ...

  2. ORACLE常用数值函数、转换函数、字符串函数

    本文更多将会介绍三思在日常中经常会用到的,或者虽然很少用到,但是感觉挺有意思的一些函数.分二类介绍,分别是: 著名函数篇 -经常用到的函数 非著名函数篇-即虽然很少用到,但某些情况下却很实用 注:N表 ...

  3. SQL Fundamentals || Single-Row Functions || 转换函数 Conversion function

    SQL Fundamentals || Oracle SQL语言   SQL Fundamentals: Using Single-Row Functions to Customize Output使 ...

  4. 转换函数conversion function

    类转换分为两个角度 转换自身为其他类型 把其他类型转换为自身 Example: 这里我们可以将b转换为class xxx 的类型(方式2),也可以将me转换为double,然后再讲结果转换为doubl ...

  5. sql查询语句报错处理——ERROR: failed to find conversion function from unknown to text

    今天遇到写存储过程遇到的一个小问题,在查询语句中使用到了自定义的数当做列的值,然后想给这一列起一个别名 ,就直接在后面用了 as 别名.执行存储过程,存储过程报错,ERROR: failed to f ...

  6. C++转换构造函数和隐式转换函数 ~ 转载

    原文地址: C++转换构造函数和隐式转换函数 用转换构造函数可以将一个指定类型的数据转换为类的对象.但是不能反过来将一个类的对象转换为一个其他类型的数据(例如将一个Complex类对象转换成doubl ...

  7. C++转换构造函数和隐式转换函数

    今天是第一次听到C++还有个转换构造函数,之前经常见到默认构造函数.拷贝构造函数.析构函数,但是从没听说过转换构造函数,隐式转换函数也是一样,C++的确是够博大精深的,再次叹服!          其 ...

  8. SQL简繁转换函数

    declare @jall nvarchar(4000),@fall nvarchar(4000) select @jall=N'啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊 ...

  9. 完善SQL农历转换函数

    -------------------------------------------------------------------- --  Author : 原著:          改编:ht ...

随机推荐

  1. 基础分类网络VGG

    vgg16是牛津大学视觉几何组(Oxford Visual Geometry Group)2014年提出的一个模型. vgg模型也得名于此. 2014年,vgg16拿了Imagenet Large S ...

  2. 使用Quarkus在Openshift上构建微服务的快速指南

    在我的博客上,您有机会阅读了许多关于使用Spring Boot或Micronaut之类框架构建微服务的文章.这里将介绍另一个非常有趣的框架专门用于微服务体系结构,它越来越受到大家的关注– Quarku ...

  3. LocalBroadcastManager 的简单介绍

    Android应用开发之(小技巧之LocalBroadcastManager) Android v4 兼容包提供android.support.v4.content.LocalBroadcastMan ...

  4. 手把手教你使用Java实现一个神经网络

    首先看一下运行效果: 下面是项目整体目录: 0.实现神经网络总览 神经网络由层.神经元.权重.激活函数和偏置组成.每层都有一个或者多个神经元,每一个神经元都和神经输入/输出连接,这些连接就是权重. 需 ...

  5. HTML定位——绝对定位和相对定位、固定定位

    1.绝对定位 绝对定位指的是通过规定HTML元素在水平和垂直方向上的位置来固定元素,基于绝对定位的元素不会占据空间. 绝对定位的位置声明是相对于已定位的并且包含关系最近的祖先元素.如果当前需要被定为的 ...

  6. HBase导入数据同时与Phoenix实现同步映射

    1.HDFS上数据准备 2019-03-24 09:21:57.347,869454021315519,8,1 2019-03-24 22:07:15.513,867789020387791,8,1 ...

  7. TensorFlow2.0(二):数学运算

    1 基本运算:加(+).减(-).点乘(*).除(/).地板除法(//).取余(%) 基本运算中所有实例都以下面的张量a.b为例进行: >>> a = tf.random.unifo ...

  8. (2)安装elastic6.1.3及插件kibana,x-pack,essql,head,bigdesk,cerebro,ik

    5.2kibana安装 5.2.1解压kibana安装包,修改config/kibana.yml中端口,服务器地址,elastic连接地址 -linux-x86_64.tar.gz cd kibana ...

  9. 如何快速转载CSDN中的博客

    看到一篇<如何快速转载CSDN中的博客>,介绍通过检查元素→复制html来实现快速转载博客的方法.不过,不知道是我没有领会其精神还是其他原因,测试结果为失败.

  10. python3.6安装【scrapy】-最保守方法

    系统:win10平台    python版本:3.6.1 1. 下载并安装 pywin32: 进入https://sourceforge.net/projects/pywin32/files/,按照下 ...