类之间的类型转换 explicit 使用

使用一个不同的类初始化另外一个类,这种情况是要经过类型转换才能完成的,否则语法上就无法通过。同样,类的类型转化也分隐式转换和显式转换。以下代码介绍了隐式转换和显式转换的两种方法。以及 explicit 关键字的使用。

#include <iostream>

using namespace std;

class Point2D
{
public:
	Point2D(int x, int y)
		:_x(x), _y(y) {}

	friend ostream& operator<<(ostream& os, const Point2D& p)
	{
		os << "(" << p._x << ", " << p._y << ")" << endl;
		return os;
	}

	friend class Point3D;

private:
	int _x;
	int _y;
};

class Point3D
{
public:
	Point3D(int x, int y, int z)
		:_x(x), _y(y), _z(z) {}

	// 通过构造器将一个非构造器类型的对象转化为构造器类型对象
	explicit Point3D(Point2D& p2)
	{
		this->_x = p2._x;
		this->_y = p2._y;
		this->_z = 0;
	}

	Point3D operator+(const Point3D &one)
	{
		Point3D tmp(0, 0, 0);
		tmp._x = this->_x + one._x;
		tmp._y = this->_y + one._y;
		tmp._z = this->_z + one._z;
		return tmp;
	}

	friend ostream& operator<<(ostream& os, const Point3D& p)
	{
		os << "(" << p._x << ", " << p._y << ", " << p._z << ")" << endl;
		return os;
	}

private:
	int _x;
	int _y;
	int _z;
};


int main(int argc, char* argv[])
{
	Point2D p2(2, 3);
	cout << p2;

	Point3D p3(7, 8, 9);
	cout << p3;

	// 通过构造器将一个非构造器类型的对象转化为构造器类型对象
	// 没加 explicit 关键字时,类似于C语言中的隐式转化
	// Point3D p3a = p2;
	// cout << p3a;

	// 加了 explicit 关键字后,显式转换
	Point3D p3a = static_cast<Point3D>(p2);


	// 先走类型转换构造器,然后再走+运算符重载
	Point3D p4a = p3 + static_cast<Point3D>(p2);
	cout << p4a << endl;

	return 0;
}

发表评论