zoukankan      html  css  js  c++  java
  • 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也能得到正确结果
  • 相关阅读:
    讨论Android开发中的MVC设计思想
    关于AppFromwork集成XMPP开发的使用详解
    Android 强大的开发支持库组件AppFromwork框架详解
    Z语音概述from百度
    《软件形式规格说明语言-Z》 缪淮扣 学习笔记 10-12
    形式化规格技术和验证技术小结
    编译TS发生 Property or signature expected
    electron 启动错误
    java学习第三章4.运算
    java学习第三章3.基本类型的转换和直接量
  • 原文地址:https://www.cnblogs.com/lovelyxia/p/1714007.html
Copyright © 2011-2022 走看看