转换函数conversion function
类转换分为两个角度
- 转换自身为其他类型
- 把其他类型转换为自身
|
Example: 这里我们可以将b转换为class xxx 的类型(方式2),也可以将me转换为double,然后再讲结果转换为double |
|
class xxx me; double b=0; class a=me+b; double a2=me+b; |
重载转换函数(转换自身到其他类型)
重载转换函数的语法格式如下,一般不用写返回类型,因为你转换成一个类型,返回值一般就是那个类型了
operator Type_name()
|
Example: 这里重载了double 运算,因为一般的转换我们不会去更改对象的本身,所以函数后面加上 const
这里的 double d= f+4; 中,将f转换为double,然后执行 一个注意点 // double // Fraction d=f+4; //1.把f转换为一个double ,因为先打印了 double() //2.把结果+4也就是一个double转换为一个Fraction ,这里会调用一个参数的构造函数,我们可以将构造函数改为两个参数试试 // 2.1 // 2.2
|
转换构造函数(转换其他到自身)
什么时候能转换其他到自身? 一般就是重载了 一般的运算符隐式转换或者使用强制转换,比如我们定义了一个类f_class,如果重载操作符+,那么f_class+xxx的时候,xxx可以被重载到+的操作函数,如果此时还有一个实参的构造函数,那么就能执行隐式转换,这个构造函数也称为转换构造函数
注意: 一个函数如果有多个m个paremeters,m-1个默认参数的参数,也就是一个argument,也是转换构造函数
|
Example: 重载了+,然后有一个转换构造函数
这里 Fraction d=f+4; 我们可以找到4转化为fraction的方式,所以执行了,不能使用double d=f+4; 因为f+4返回为Franction,并没有办法转换为double
|
Explicit之同时存在以及歧义
如果同时存在上述两种形式,则会引发歧义,这两种转换没有谁优先的概念
error C2666: "Fraction::operator +": 2 个重载有相似的转换 ambiguous
也就是打开上面的注释的地方
使用关键字 Explicit 表示构造函数不再支持隐式的转换了
在上述例子中也就是无法将4转换为Fraction,我们需要显示指定转换才可以
|
; // ok |
也可以同时使用double和显示的构造转换了
|
; |
|
Fraction |
|
#include <iostream> using namespace std; class Fraction { public: ):m_numerator(num),m_denominator(den) { cout<<"ctor run: m_numerator="<<m_numerator<<" m_denominator=" << m_denominator <<endl; } operator double() const { cout << "double() run"<<endl; return (double)((double)m_numerator/m_denominator); } Fraction operator +(const Fraction& elem) { cout << "+() run"<<endl; return Fraction(this->m_numerator+elem.m_numerator,this->m_denominator+elem.m_denominator); } int m_numerator; int m_denominator; }; // 重载一个<< 方便打印这个类Fraction ostream& operator << (ostream &o,const Fraction&elem) { o << "m_numerator= "<<elem.m_numerator << " m_denominator= "<<elem.m_denominator << endl; o << "double value= "<< (double)elem.m_numerator/elem.m_denominator<< endl; return o; } int main() { ,); // double 转换f为double // Fraction d=f+4; //1.把f转换为一个double ,因为先打印了 double() //2.把结果+4也就是一个double转换为一个Fraction ,这里会调用一个参数的构造函数,我们可以将构造函数改为两个参数试试 // 2.1 // 2.2 // +重载 // 无法支持 double d=f+4; 因为f+4返回为Franction,并没有办法转换为double // Fraction d=f+4; // 1. 4转换为Franction,根据只有一个实参的构造函数 // 2. 加法 double Fraction cout << d << endl; ; } |



转换函数conversion function的更多相关文章
- SQL Fundamentals || Single-Row Functions || 转换函数 Conversion function
SQL Fundamentals || Oracle SQL语言 SQL Fundamentals: Using Single-Row Functions to Customize Output使 ...
- C++面向对象高级编程(六)转换函数与non-explicit one argument ctor
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.conversion function 转换函数 //1.转换函数 //conversion function //只要你认为合理 你可以任 ...
- ORACLE常用数值函数、转换函数、字符串函数
本文更多将会介绍三思在日常中经常会用到的,或者虽然很少用到,但是感觉挺有意思的一些函数.分二类介绍,分别是: 著名函数篇 -经常用到的函数 非著名函数篇-即虽然很少用到,但某些情况下却很实用 注:N表 ...
- conversion function——转换函数
类型转换函数 与 explicit关键字 1.类型转换函数 在C++中,可以使用构造函数将一个指定类型的数据转换为类的对象,也可以使用类型转换函数 (type conversion function) ...
- C++ - 模板类模板成员函数(member function template)隐式处理(implicit)变化
模板类模板成员函数(member function template)隐式处理(implicit)变化 本文地址: http://blog.csdn.net/caroline_wendy/articl ...
- 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'啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊 ...
随机推荐
- Codeforces Round #539 (Div. 1) C. Sasha and a Patient Friend 动态开点线段树
题解看这里 liouzhou_101的博客园 更简洁的代码看这里: #include <bits/stdc++.h> using namespace std; typedef long l ...
- Codevs 2492 上帝造题的七分钟 2(线段树)
时间限制: 1 s 空间限制: 64000 KB 题目等级 : 大师 Master 题目描述 Description XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. " ...
- UVA 11605 Lights inside a 3d Grid —— (概率和期望)
题意:见大白书P181. 分析:一个一个点的进行分析,取其期望然后求和即可.假设当前点在第一次中被选到的概率为p,f[i]表示进行k次以后该点亮的概率(在这里也可以理解为期望),g[i]表示k次后该点 ...
- 5 HashSet
1.HashSet public class HashSet<E> extends AbstractSet<E> implements Set<E>, Clonea ...
- 第11组 Alpha冲刺(5/6)
第11组 Alpha冲刺(5/6) 队名 不知道叫什么团队 组长博客 https://www.cnblogs.com/xxylac/p/11898559.html 作业博客 https://edu ...
- Cesium中级教程6 - 3D Models 三维模型
3D Models 三维模型 本教程将教您如何通过Primitive API转换.加载和使用Cesium中的三维模型.如果你是Cesium的新用户,可能需要阅读三维模型部分的(空间数据可视化教程)[h ...
- html文字两行后,就用省略号代替剩下的
html文字两行后,就用省略号代替剩下的 一.总结 一句话总结: 实现原理很简单,将box的高度设置为行高的两倍,超出之后隐藏,这样就只有两行了,然后再用after属性绝对定位在第二行后面加几个点 . ...
- 数据分析 - sql 业务相关练习题
数据库 userinfo , orderinfo 表 两个 userId 彼此对应 题目 解题 不同月份的下单人数 用户在同一个月份会下多个单,这里进行去重 未支付的脏数据去除 统计用户三月份的 ...
- 数据分析 - Excel 综合实例 - 杜邦分析法
项目背景 杜邦分析法 利用 杜邦分析法完成对一份数据的动态分析 流程图如下 项目源数据 左侧为竖向的数据管理, 右侧为横向的数据管理 横向的数据管理在数据透视的时候会很不方便, 并不推荐 常用叫法左边 ...
- springboot和hadoop2.7.7集成开发
1.本人在腾讯云安装hadoop2.7.7,详细安装请看以前的博客 2.pom.xml文件 <?xml version="1.0" encoding="UTF-8& ...