首页 > 其他 > 详细

转换函数conversion function

时间:2019-10-20 17:54:30      阅读:55      评论:0      收藏:0      [点我收藏+]

类转换分为两个角度

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

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,我们需要显示指定转换才可以

Fraction d=f+(Fraction)4; // ok

? ?

也可以同时使用double和显示的构造转换了

double d=f+4;

Fraction d2=f+(Fraction)4;

#include <iostream>

using namespace std;

class Fraction

{

public:

explicit Fraction(int num,int den=1):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()

{

Fraction f(3,5);

// 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 d=f+4;

Fraction d2=f+(Fraction)4;

? ?

cout << d << endl;

return 0;

}

? ?

技术分享图片

? ?

技术分享图片

? ?

技术分享图片

转换函数conversion function

原文:https://www.cnblogs.com/zongzi10010/p/11707843.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!