conversion function——转换函数
类型转换函数 与 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
{
// 实现转换
}
- 必须是类的成员函数
- 无返回类型
- 形参列表为空
- 最好为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——转换函数的更多相关文章
- C++面向对象高级编程(六)转换函数与non-explicit one argument ctor
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.conversion function 转换函数 //1.转换函数 //conversion function //只要你认为合理 你可以任 ...
- ORACLE常用数值函数、转换函数、字符串函数
本文更多将会介绍三思在日常中经常会用到的,或者虽然很少用到,但是感觉挺有意思的一些函数.分二类介绍,分别是: 著名函数篇 -经常用到的函数 非著名函数篇-即虽然很少用到,但某些情况下却很实用 注:N表 ...
- SQL Fundamentals || Single-Row Functions || 转换函数 Conversion function
SQL Fundamentals || Oracle SQL语言 SQL Fundamentals: Using Single-Row Functions to Customize Output使 ...
- 转换函数conversion function
类转换分为两个角度 转换自身为其他类型 把其他类型转换为自身 Example: 这里我们可以将b转换为class xxx 的类型(方式2),也可以将me转换为double,然后再讲结果转换为doubl ...
- sql查询语句报错处理——ERROR: failed to find conversion function from unknown to text
今天遇到写存储过程遇到的一个小问题,在查询语句中使用到了自定义的数当做列的值,然后想给这一列起一个别名 ,就直接在后面用了 as 别名.执行存储过程,存储过程报错,ERROR: failed to f ...
- C++转换构造函数和隐式转换函数 ~ 转载
原文地址: C++转换构造函数和隐式转换函数 用转换构造函数可以将一个指定类型的数据转换为类的对象.但是不能反过来将一个类的对象转换为一个其他类型的数据(例如将一个Complex类对象转换成doubl ...
- C++转换构造函数和隐式转换函数
今天是第一次听到C++还有个转换构造函数,之前经常见到默认构造函数.拷贝构造函数.析构函数,但是从没听说过转换构造函数,隐式转换函数也是一样,C++的确是够博大精深的,再次叹服! 其 ...
- SQL简繁转换函数
declare @jall nvarchar(4000),@fall nvarchar(4000) select @jall=N'啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊 ...
- 完善SQL农历转换函数
-------------------------------------------------------------------- -- Author : 原著: 改编:ht ...
随机推荐
- ie表单提交提示下载文件
使用jquery的ajaxform提交form表单 如果在html中多了 enctype ="multipart/form-data" 属性值 提交时就会在ie8中提示下载 ...
- 做一个完整的Hadoop项目
1. 完整的数据流图 由同ip访问的次数: SQL查询 select ip,count(ip) from tablename Group by ip; 基于Hadoop分析 使用Hadoop分析,需 ...
- Json的动态解析
最近在项目中需要动态解析json,但解析json的方式有很多,如何合理的解析就是我们需要考虑的问题?比如Newtonsoft.Json.Linq下提供的JToken.JObject等,Newtonso ...
- linux ssh连接自动断开问题
场景描述:云上的虚拟机使用public ip连接ssh时,一直提示已经连接,但是就会自动关闭 1. 通过正常虚拟机作为跳板,能够连接到目标机子上,检查发现进程正常,但是就一直连接不上 [root@te ...
- 基于 VMware 的超融合, 解析 vSAN 与 SmartX ZBS 的优劣差异
在企业级IT领域从业多年,最近越来越多地听到圈内人谈论起超融合技术的种种好处.的确,超融合技术已越来越走向成熟,带来的价值也逐渐凸显.它可靠性高,资源消耗低,尤其是运维部署非常便捷.在企业基础架构领域 ...
- 数据库高级:SQL-CREATE-TABLE语句
作者:松软科技(www.sysoft.net.cn) 发布时间:2019/3/17 9:34:51 CREATE TABLE 语句 CREATE TABLE 语句用于创建数据库中的表. SQL CRE ...
- Laravel 5.4 快速开发简书:
Laravel 5.4 快速开发简书第1章 课程介绍 介绍课程的大体脉络和课程安排 第2章 Laravel 5.4介绍 本节课会带领大家介绍laravel的各个版本历史以及讨论php框架的未来发展趋势 ...
- Docker笔记(十一):Dockerfile详解与最佳实践
Dockerfile是一个文本文件,包含了一条条指令,每条指令对应构建一层镜像,Docker基于它来构建一个完整镜像.本文介绍Dockerfile的常用指令及相应的最佳实践建议. 1. 理解构建上下文 ...
- 07-SQLServer数据库中的系统数据库
一.总结 首先要明确SQLServer的系统数据库一共有5个:Master.Model.Msdb.Tempdb.Resource. 1.Master数据库 (1)master数据库记录了所有系统级别的 ...
- 【linux】【tomcat】tomcat8.5安装
系统环境:Centos7 1.下载tomcat8.5 wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.45/b ...