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

ContractedBlock.gif ExpandedBlockStart.gif 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_ */
ContractedBlock.gif ExpandedBlockStart.gif 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/archive/2010/04/17/1714007.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值