![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#ifndef VIRTUAL_NO_H_
#define VIRTUAL_NO_H_
#include < iostream >
using namespace std;
class virtual_no
{
friend virtual_no operator + ( const virtual_no & v1, const virtual_no & v2);
friend virtual_no operator - ( const virtual_no & v1, const virtual_no & v2);
friend ostream & operator << (ostream & ostr, const virtual_no & v1); // friend和成员函数区别
friend istream & operator >> (istream & istr, virtual_no & v1);
private :
double real;
double virt;
public :
virtual_no( double rl, double vl); // 定义构造函数
double getMod();
virtual_no & getConjugate();
};
#endif /* VIRTUAL_NO_H_ */
#define VIRTUAL_NO_H_
#include < iostream >
using namespace std;
class virtual_no
{
friend virtual_no operator + ( const virtual_no & v1, const virtual_no & v2);
friend virtual_no operator - ( const virtual_no & v1, const virtual_no & v2);
friend ostream & operator << (ostream & ostr, const virtual_no & v1); // friend和成员函数区别
friend istream & operator >> (istream & istr, virtual_no & v1);
private :
double real;
double virt;
public :
virtual_no( double rl, double vl); // 定义构造函数
double getMod();
virtual_no & getConjugate();
};
#endif /* VIRTUAL_NO_H_ */
![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include
"
virtual_no.h
"
#include < iostream >
#include < math.h >
using namespace std;
virtual_no::virtual_no( double rl, double vl)
{
real = rl;
virt = vl;
}
virtual_no operator + ( const virtual_no & v1, const virtual_no & v2)
{
virtual_no res( 0 , 0 );
res.real = v1.real + v2.real;
res.virt = v1.virt + v2.virt;
return res;
}
virtual_no operator - ( const virtual_no & v1, const virtual_no & v2)
{
virtual_no res( 0 , 0 );
res.real = v1.real - v2.real;
res.virt = v1.virt - v2.virt;
return res;
}
ostream & operator << (ostream & ostr, const virtual_no & v1)
{
if (v1.virt >= 0.0 )
ostr << v1.real << " +j " << v1.virt;
else
ostr << v1.real << " -j " << ( - 1 ) * v1.virt;
return ostr;
}
istream & operator >> (istream & istr, virtual_no & v1)
{
istr >> v1.real >> v1.virt;
return istr;
}
double virtual_no::getMod()
{
return sqrt(pow(real, 2 ) + pow(virt, 2 ));
}
virtual_no & virtual_no::getConjugate()
{
virtual_no v1 = virtual_no(real, virt * ( - 1 ));
virtual_no & v2 = v1;
return v2;
}
#include < iostream >
#include < math.h >
using namespace std;
virtual_no::virtual_no( double rl, double vl)
{
real = rl;
virt = vl;
}
virtual_no operator + ( const virtual_no & v1, const virtual_no & v2)
{
virtual_no res( 0 , 0 );
res.real = v1.real + v2.real;
res.virt = v1.virt + v2.virt;
return res;
}
virtual_no operator - ( const virtual_no & v1, const virtual_no & v2)
{
virtual_no res( 0 , 0 );
res.real = v1.real - v2.real;
res.virt = v1.virt - v2.virt;
return res;
}
ostream & operator << (ostream & ostr, const virtual_no & v1)
{
if (v1.virt >= 0.0 )
ostr << v1.real << " +j " << v1.virt;
else
ostr << v1.real << " -j " << ( - 1 ) * v1.virt;
return ostr;
}
istream & operator >> (istream & istr, virtual_no & v1)
{
istr >> v1.real >> v1.virt;
return istr;
}
double virtual_no::getMod()
{
return sqrt(pow(real, 2 ) + pow(virt, 2 ));
}
virtual_no & virtual_no::getConjugate()
{
virtual_no v1 = virtual_no(real, virt * ( - 1 ));
virtual_no & v2 = v1;
return v2;
}
- 在C++中一般头文件和实现要分开,头文件的定义一般写在.h中,例如本例中,我们将复数抽象成一个类,它的数据成员包括实部和虚部,复数的操作有输入、输出、加减等,都定义成友元函数, 复数的属性行为:共轭复数,复数的模都定义成成员函数,在vitual_no.h中,只声明接口,不给出具体的实现。具体的实现写在vitual_no.cpp中,通过#include"vitual_no.h"来相互关联,注意:自己写的.h用引号
- 操作为什么写成友元函数?首先,友元函数方便操作类的私有成员变量,其次类的成员函数中隐含的包括一个this的本身对象,如果将重载的操作符写成成员函数,那么编译的时候会提出参数溢出,原因就是多了this本身对象,解决方法就是定义成friend
- 通常,头文件中应该只定义确实必要的东西,不宜使用using namespace std;只using确实需要的东西,因为#include了该头文件的程序相当于把头文件的内容copy过去一份,会造成一些命名上的错误。
- virtual_no.cpp中getConjugate()函数
- 如果直接返回v1,结果不正确,输入3+j4, 输出4-4j
- 如果在返回v1前加入int j=0;这么无关痛痒的话,结果也能返回正确, 输入3+j4, 输出3-j4,原因需要进一步分析。
- 如果在新定义引用v2=v1, 返回v2也能得到正确结果