www.gusucode.com > 《C++高级语言程序设计》PPT及全书例子源代码-源码程序 > 《C++高级语言程序设计》PPT及全书例子源代码-源码程序/code/C++例题程序/第6章/s6_18/smain6_18.cpp

    //Download by http://www.NewXing.com
//文件名:smain6_18.cpp
//构造函数类型转换函数。以下程序只在直角坐标的第一象限考虑问题

#include <iostream>
#include <math.h>
using namespace std;

const double PI = 3.14;
class CVector;
class CPoint								//定义直角点坐标类
{
	friend CVector; 
 	friend ostream &operator << (ostream &s, CPoint obj);

 public:
	CPoint(double dX=0, double dY=0);
	operator CVector( );						//类类型转换函数

private:
  	double m_dX;							//x坐标
  	double m_dY;							//y坐标
};

class  CVector								//定义极坐标类
{
	friend CPoint ;
  	friend ostream &operator << (ostream &s, CVector obj);  

public:
	CVector(double dP=0, double dSeta=0);
	operator CPoint( );							//类类型转换函数

private:
  	double m_dP;								//极半径 
  	double m_dSeta;								//极角

};

ostream &operator << (ostream &s, CPoint obj)
{
	s << "X坐标为:" << obj.m_dX << "; Y坐标为:" << obj.m_dY << "\n";
	return s; 
}

CPoint::CPoint(double dX, double dY)
{
	m_dX = dX;
	m_dY = dY;
} 

CVector::operator CPoint( )
{
	CPoint oCPoint;
	oCPoint.m_dX = m_dP * cos(m_dSeta);				//得到x坐标
	oCPoint.m_dY = m_dP * sin(m_dSeta);				//得到y坐标
 	return oCPoint; 
}

ostream &operator << (ostream &s,CVector obj)  
{
	s << "极径=" << obj.m_dP << "; 极角=" << obj.m_dSeta << "弧度。" << "\n";
	return s;
}

CVector::CVector(double dP, double dSeta)
{
	m_dP = dP;
	m_dSeta = dSeta;
} 

//sqrt( )是math.h库里面的求平方根的函数
//atan( )是math.h库里的求反正切函数,tan( )则是求正切函数,单位都是弧度
CPoint::operator CVector( )
{
	CVector oCVector;
	oCVector.m_dP = sqrt(m_dX*m_dX + m_dY*m_dY);		//求极径
	oCVector.m_dSeta = atan(m_dY/m_dX);					//求极角	
	return oCVector;
}


void main()
{
	double dSeta;
	dSeta = 2*PI*30/360;								//30度角的弧度值
	CPoint oCPoint(2.0, 2.0), oCPoint2;
	CVector oCVector(4.0, dSeta), oCVector2;			//

	cout << oCPoint << oCPoint2; 
	cout << oCVector << oCVector2;

	oCPoint2 = CPoint(oCVector);						//将CVector转换为CPoint
	oCVector2 = CVector(oCPoint);						//将CPoint转换为CVector

	cout << oCPoint << oCPoint2;
	cout << oCVector << oCVector2 << endl;

}