类转换分为两个角度

  • 转换自身为其他类型
  • 把其他类型转换为自身

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

#include <iostream>

using namespace std;

class Fraction

{

public:

    Fraction(int num,int den=1):m_numerator(num),m_denominator(den){}

    operator double() const

    {

cout << "double() run"<<endl;

        return (double)((double)m_numerator/m_denominator);

    }

private:

    int m_numerator;

    int m_denominator;

};

int main()

{

    Fraction f(3,5);

    double d=f+4;

    cout << d << endl;

    return 0;

}

这里的 double d= f+4; 中,将f转换为double,然后执行

 
 

一个注意点

// double
d=f+4; 把f转换为double

// Fraction d=f+4;

//1.把f转换为一个double ,因为先打印了 double()

//2.把结果+4也就是一个double转换为一个Fraction ,这里会调用一个参数的构造函数,我们可以将构造函数改为两个参数试试

// 2.1
Fraction(int num,int den):m_numerator(num),m_denominator(den)

// 2.2
这里就会提示
error C2440: "初始化": 无法从"double"转换为"Fraction"

  

 
 

转换构造函数(转换其他到自身)

什么时候能转换其他到自身? 一般就是重载了 一般的运算符隐式转换或者使用强制转换,比如我们定义了一个类f_class,如果重载操作符+,那么f_class+xxx的时候,xxx可以被重载到+的操作函数,如果此时还有一个实参的构造函数,那么就能执行隐式转换,这个构造函数也称为转换构造函数

注意: 一个函数如果有多个m个paremeters,m-1个默认参数的参数,也就是一个argument,也是转换构造函数

 
 

Example: 重载了+,然后有一个转换构造函数

#include <iostream>

using namespace std;

class Fraction

{

public:

    Fraction(int num,int den=1):m_numerator(num),m_denominator(den){}

    /*

    operator double() const

    {

        return (double)((double)m_numerator/m_denominator);

    }

    */

    Fraction operator +(const Fraction& elem)

    {

        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()

{

    Fraction f(3,5);

// +重载

// 无法支持 double d=f+4; 因为f+4返回为Franction,并没有办法转换为double

// Fraction d=f+4;

// 1. 4转换为Franction,根据只有一个实参的构造函数

// 2. 加法

 
 

    Fraction d=f+4;

    cout << d << endl;

    return 0;

}

 

这里 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
Fraction(int num,int den):m_numerator(num),m_denominator(den)

// 2.2
这里就会提示
error C2440: "初始化": 无法从"double"转换为"Fraction"

 
 

// +重载

// 无法支持 double d=f+4; 因为f+4返回为Franction,并没有办法转换为double

// Fraction d=f+4;

// 1. 4转换为Franction,根据只有一个实参的构造函数

// 2. 加法

 
 

double
;

Fraction
;

 
 

cout << d << endl;

;

}

 
 

 
 

 
 

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

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

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

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

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

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

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

  4. conversion function——转换函数

    类型转换函数 与 explicit关键字 1.类型转换函数 在C++中,可以使用构造函数将一个指定类型的数据转换为类的对象,也可以使用类型转换函数 (type conversion function) ...

  5. C++ - 模板类模板成员函数(member function template)隐式处理(implicit)变化

    模板类模板成员函数(member function template)隐式处理(implicit)变化 本文地址: http://blog.csdn.net/caroline_wendy/articl ...

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

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

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

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

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

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

  9. SQL简繁转换函数

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

随机推荐

  1. Codeforces Round #598 (Div. 3) A,B,C,D{E,F待补}

    A. Payment Without Change   #include<bits/stdc++.h> using namespace std; #define int long long ...

  2. MySQL 中Redo与Binlog顺序一致性问题

    首先,我们知道在MySQL中,二进制日志是server层的,主要用来做主从复制和即时点恢复时使用的.而事务日志(redo log)是InnoDB存储引擎层的,用来保证事务安全的.现在我们来讨论一下My ...

  3. STS工具:mybayis连接oracle数据库

    1.pom.xml文件中的依赖 刚添加依赖的时候会报错,原因是jar包下不下来. 2.我的jdk是1.6,所以需要升级jdk版本到1.8 执行mvn -v命令,可以看到maven的版本号 DOS窗口执 ...

  4. ueditor+复制word图片粘贴上传

    Chrome+IE默认支持粘贴剪切板中的图片,但是我要发布的文章存在word里面,图片多达数十张,我总不能一张一张复制吧?Chrome高版本提供了可以将单张图片转换在BASE64字符串的功能.但是无法 ...

  5. 蓝牙4.0模块,AT指令集

    一,LED状态 二,蓝牙模块有两种通信模式 1,AT指令模式 2,数据透传模式 三.AT指令程序设计 1.设置模块的名字 void usart3_send_str(char *pbuf) { whil ...

  6. linux认识

    linux基础 根目录 文档扩展名 在Linux中,跟windows的扩展名.exe .bat.dll不同,只要在那十个字符中有x权限,这个档案就是可执行的, 但是,可被执行和执行成功是两回事,在Li ...

  7. 【csp模拟赛3】flowers.cpp--循环节

    题目描述 小 Q 最终还是过了独木桥. 前方的地上散落着 B 朵樱花,此时刮起了风,便引来一场樱花雨. 樱花雨一共持续了 N 秒.每一秒都会有 A 朵樱花飘落.小 Q 细心的记录了每一秒时间 后地上樱 ...

  8. 系统信息的管理函数API

    1.Windows系统信息 1.1获取系统版本:   BOOL WINAPI GetVersionEx( __in_out LPOSVERSIONINFO lpVersionInfo ); lpVer ...

  9. 1558:聚会 ybt

    1558:聚会 ybt 题解(看似很难,其实要是摸清了实质这就是个大水题) 上题目 1558:聚会 时间限制: 1000 ms         内存限制: 524288 KB提交数: 82     通 ...

  10. Django基础之中间件的执行流程

    当请求到达中间件以后,先按照正序执行每个注册中间件的process_request方法,process_request方法返回的值是None,就依次执行. 如果返回的值是HttpResponse对象, ...