类型转换函数的作用是将一个类的对象转换成另一类型的数据
转换构造函数的作用是将一个类型的数据转换成另一个类的对象
(一)类型转换函数
类型转换函数的一般形式为:
operator 类型名( ) const //
{
实现转换的语句
}
如:将一个对象转换为double类型
operator double( ) const
{
return real;
}
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
//分数类
class Fraction
{
public:
//构造函数(可成为转换构造函数)
Fraction(int molecular,int denominator = 1):m_molecular(molecular),m_denominator(denominator)
{
}
//转换函数,Fraction对象可以转换为double,当需要把它转为double时可以转
//转换不能改变类里面的数据因此最好要加const
operator double()const
{
return (double)m_molecular / m_denominator;
}
private:
int m_molecular;
int m_denominator;
};
int main()
{
Fraction f(3, 4);
//编译器到此处时候看看有没有重载+,如果不能通过,然后看看f能否转换为double
double d = 4 + f; //把f对象转换为double类型数据
cout << d << endl;
system("pause");
return 0;
}
(二)转换构造函数
将一个类型数据转换为类对象
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
//分数类
class Fraction
{
public:
Fraction(int molecular, int denominator = 1) :m_molecular(molecular), m_denominator(denominator)
{
}
Fraction operator+(const Fraction& x)
{
this->m_denominator = this->m_denominator * x.m_denominator;
this->m_molecular = this->m_molecular * x.m_molecular;
return Fraction(this->m_molecular, this->m_denominator);
}
private:
int m_molecular;
int m_denominator;
};
int main()
{
Fraction f(3, 4);
//f + 要加个对象,刚好4可以通过转换构造函数转换为Fraction类对象
Fraction d = f + 4; //要把double类型数据转换为f对象
system("pause");
return 0;
}
(三)explicit关键字
- explicit关键字几乎只在构造函数前面使用
- 在构造函数前面加上explicit关键字让构造函数只起构造对象作用,不再具有转换构造函数作用
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
//分数类
class Fraction
{
public:
//加上explicit关键字,失去转换构造函数性质
explicit Fraction(int molecular, int denominator = 1) :m_molecular(molecular), m_denominator(denominator)
{
}
Fraction operator+(const Fraction& x)
{
this->m_denominator = this->m_denominator * x.m_denominator;
this->m_molecular = this->m_molecular * x.m_molecular;
return Fraction(this->m_molecular, this->m_denominator);
}
operator double()const
{
return (double)m_molecular / m_denominator;
}
private:
int m_molecular;
int m_denominator;
};
int main()
{
Fraction f(3, 4);
//1.看f有没有重载+,发现有重载,但是参数为Fraction对象,于是想着把4转换为Fraction对象发现没有转换构造函数
//2.看存不存在类型转换函数,发现有,于是把f转换为double类型,编译通过
double d = f + 4;
system("pause");
return 0;
}