Transfer function conversion function

Converted into two angles class

  • Convert itself into another type
  • The other type to itself

Example:

Here we can convert type b of class xxx (mode 2), may be converted to double me, and then repeat the results converted to double

class xxx me;

double  b=0;

class a=me+b;

double a2=me+b;

   

Overload conversion functions (conversion itself to other types)

Overloaded transfer function syntax is as follows, generally do not write the return type, because you converted to a type, the return value is generally the type of

operator Type_name() 

   

Example: Here overloaded double operation, because most of us will not convert to change the object itself, so after the function plus 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;

}

Here double d = f + 4;, a f is converted to double, and performing

   

Note that a point

Double // D = + f. 4; f is converted to double

// Fraction d=f+4;

// 1. convert f into a double, because first printed double ()

// 2. The result is a double +4 converted to a Fraction, here will call a constructor parameter, we can change the constructor two parameters Try

// 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;

}

   

   

   

Guess you like

Origin www.cnblogs.com/zongzi10010/p/11707843.html