C++头文件和实现(用复数类举例)

virtual_no.h
#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_ */
virtual_no.cpp
#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;
}
  1. 在C++中一般头文件和实现要分开,头文件的定义一般写在.h中,例如本例中,我们将复数抽象成一个类,它的数据成员包括实部和虚部,复数的操作有输入、输出、加减等,都定义成友元函数, 复数的属性行为:共轭复数,复数的模都定义成成员函数,在vitual_no.h中,只声明接口,不给出具体的实现。具体的实现写在vitual_no.cpp中,通过#include"vitual_no.h"来相互关联,注意:自己写的.h用引号
  2. 操作为什么写成友元函数?首先,友元函数方便操作类的私有成员变量,其次类的成员函数中隐含的包括一个this的本身对象,如果将重载的操作符写成成员函数,那么编译的时候会提出参数溢出,原因就是多了this本身对象,解决方法就是定义成friend
  3. 通常,头文件中应该只定义确实必要的东西,不宜使用using namespace std;只using确实需要的东西,因为#include了该头文件的程序相当于把头文件的内容copy过去一份,会造成一些命名上的错误。
  4. virtual_no.cpp中getConjugate()函数
  • 如果直接返回v1,结果不正确,输入3+j4, 输出4-4j
  • 如果在返回v1前加入int j=0;这么无关痛痒的话,结果也能返回正确, 输入3+j4, 输出3-j4,原因需要进一步分析。
  • 如果在新定义引用v2=v1, 返回v2也能得到正确结果
原文地址:https://www.cnblogs.com/lovelyxia/p/1714007.html