C++类型转换函数和转换构造函数

类型转换函数的作用是将一个类的对象转换成另一类型的数据
转换构造函数的作用是将一个类型的数据转换成另一个类的对象

(一)类型转换函数

类型转换函数的一般形式为:
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;
}
发布了18 篇原创文章 · 获赞 14 · 访问量 367

猜你喜欢

转载自blog.csdn.net/fjd7474/article/details/104308432