通过重载输入和输出运算符实现复数的输入和输出

程序代码:

#include <iostream>

using namespace std;

class Complex
{
public:
      Complex( )//定义默认构造函数初始化复数
      {
          real=0;
          imag=0;
      }      

      //使用初始化表初始化复数
      Complex(double r, double i):real(r),imag(i){}

      Complex operator+(Complex &c2);//复数的加法
      Complex operator-(Complex &c2);//复数的减法
      Complex operator*(Complex &c2);//复数的乘法
      Complex operator/(Complex &c2);//复数的除法

      //重载<<运算符实现输出复数
      friend ostream&  operator <<(ostream& output, Complex& c);

       //重载>>运算符实现输入复数
      friend istream&  operator >>(istream& input, Complex& c);

private:
      double real;//复数的实部
      double imag;//复数的虚部
};

//复数的加法
Complex Complex::operator+(Complex &c2)
{
    Complex c3;

    c3.real  = real + c2.real;
    c3.imag  = imag + c2.imag;

    return c3;
}

//复数的减法
Complex Complex::operator-(Complex &c2)
{
    Complex c3;

    c3.real  = real - c2.real;
    c3.imag  = imag - c2.imag;

    return c3;
}

//复数的乘法
Complex Complex::operator*(Complex &c2)
{
    Complex c3;

    c3.real = real*c2.real - imag * c2.imag;
    c3.imag = real*c2.imag + imag * c2.real;

    return c3;
}

//复数的除法
Complex Complex::operator/(Complex &c2)
{
    Complex c3;

    c3.real = (real * c2.real + imag * c2.imag) / (c2.real*c2.real + c2.imag * c2.imag);

    c3.imag = (imag * c2.real - real * c2.imag) / (c2.real*c2.real + c2.imag * c2.imag);

    return c3;
}

//重载>>运算符实现输入复数
istream&  operator >>(istream& input, Complex& c)
{
    int a, b;
    char sign, i;

    do
    {
        cout<<"请输入一个复数,以(a+bi或a-bi)的形式输入:";
        input>>a>>sign>>b>>i;

    }while(!(('+' == sign || '-' == sign) && 'i' == i));

   c.real = a;
   c.imag = ('+' == sign) ? b : -b;

   return input;
}

//重载<<运算符实现输出复数
ostream&  operator <<(ostream& output, Complex& c)
{
    int num = c.imag;

    if(num>0)
    {
        output<<c.real<<"+"<<c.imag<<"i"<<endl;
    }
    else
    {
        output<<c.real<<c.imag<<"i"<<endl;
    }

    return output;
}

void main( )
{
    //定义三个复数
    Complex c1, c2, c3;

    cout<<"请输入一个复数:";
    cin>>c1;

    cout<<"请输入一个复数:";
    cin>>c2;

    //打印第一个复数
    cout<<"c1 = ";
    cout<<c1;

    //打印第二个复数
    cout<<"c2 = ";
    cout<<c2;

    //两个复数相加
    c3 = c1 + c2;
    cout<<"c1 + c2 = ";
    cout<<c3;

    //两个复数想减
    c3 = c1 - c2;
    cout<<"c1 - c2 = ";
   cout<<c3;

    //两个复数相乘
    c3 = c1 * c2;
    cout<<"c1 * c2 = ";
    cout<<c3;

    //两个复数相除
    c3 = c1 / c2;
    cout<<"c1 / c2 = ";
    cout<<c3;

    system("pause");
}

执行结果:

通过重载输入和输出运算符实现复数的输入和输出

时间: 2024-10-04 18:50:07

通过重载输入和输出运算符实现复数的输入和输出的相关文章

C++运算符重载——输入/输出运算符

为了与IO标准库一致,重载输入输出运算符函数的第一个行参应该是流的引用,第二个行参是对象的引用. 如果重载为类的成员函数,第一个行参应该是对象的引用,第二个行参是流的引用. 使用方式是 ClassObj << cout 这样与标准IO库就不一致了,所以输入输出运算符不能重载为类的成员函数,可以重载为类的友元函数和普通函数. 通常重载输出运算符的第二个行参是const的,因为输出一个类不许要更改它: 但是重载输入运算符的第二个行参必须是非const的,否则无法赋值. 重载的基本方法如下: //重

C++ Primer笔记10_运算符重载_赋值运算符_输入/输出运算符

我们致力于推广Scriptcase,以产品销售.技术支持.培训服务.外包开发为核心,将Scriptcase这一简单易用的工具真正在国内予以推广.我们搭建了Scriptcase的示例网站,通过该网站可以看到在几乎不需要任何编程的情况下,Scriptcase可以做到如何快速和先进的开发. 敬请访问 www.phpscriptcase.com C++ Primer笔记10_运算符重载_赋值运算符_输入/输出运算符

重载运算与类型转换——基本概念,输入和输出运算符,算术和关系运算符,赋值运算符,下标运算符,递增和递减运算符,成员访问运算符

一.基本概念 重载的运算符时具有特殊名字的函数:它们的名字由关键字operator和其后要定义的运算符号共同组成.和其他函数一样,重载的运算符也包含返回类型.参数列表以及函数体. 重载运算符函数的参数数量与该运算符作用的运算对象数量一样多.一元运算符有一个参数,二元运算符有两个.对于二元运算符来说,左侧运算对象传递给第一个参数,而右侧运算对象传递给第二个参数.除了重载的函数调用运算符operator()之外,其他重载运算符不能含有默认实参. 当一个重载的运算符时成员函数时,this绑定到左侧运算

C++学习28 重载&gt;&gt;和&lt;&lt;(输入输出运算符)

在C++中,系统已经对左移运算符“<<”和右移运算符“>>”分别进行了重载,使其能够用于输入输出,但是输入输出的处理对象只能是系统内建的数据类型.系统重载这两个运算符是以系统类成员函数的形式进行的,因此cout<< var语句可以理解为: cout.operator<<( var ) 如果我们自己定义了一种新的数据类型,需要用输入输出运算符去处理,那么就要重载.本节以前面的 complex 类为例说明输入输出运算符的重载. 重载输入运算符>> 下

C++重载&gt;&gt;和&lt;&lt;(输入输出运算符)

在C++中,标准库本身已经对左移运算符<<和右移运算符>>分别进行了重载,使其能够用于不同数据的输入输出,但是输入输出的对象只能是 C++ 内置的数据类型(例如 bool.int.double 等)和标准库所包含的类类型(例如 string.complex.ofstream.ifstream 等). 如果我们自己定义了一种新的数据类型,需要用输入输出运算符去处理,那么就必须对它们进行重载.本节以前面的 complex 类为例来演示输入输出运算符的重载. 重载输入运算符>>

C++:运算符重载函数之成员运算符重载函数

5.2.3 成员运算符重载函数 在C++中可以把运算符重载函数定义为某个类的成员函数,称之为成员运算符重载函数. 1. 定义成员运算符重载函数的语法形式 (1)在类的内部,定义成员运算符重载函数的格式如下: 函数类型 operator 运算符(形参表) {       函数体 } (2)成员运算符重载函数也可以在类中声明成员函数的原型,在类外定义. 在类的内部,声明成员运算符重载函数原型的格式如下: class X{      ...      函数类型 operator运算符(参数表); };

第二天-while循环 格式化输出 运算符 编码

一.while循环 while 条件: 语句块(循环体)     #判断条件是否成立,若成立执行循环体,然后再次判断条件...直到不满足跳出循环 else: 当条件不成立的时候执行这里,和break没有关系 break  终止当前循环 continue 停止本次循环,继续执行下一次循环 1 #如:求前100奇数的和. 2 3 num = 1 4 sum = 0 5 while num <= 99: 6 num += 2 7 sum =sum+num #累加运算,把num的值累加到sum 8 pr

C++ Primer笔记12_运算符重载_递增递减运算符_成员访问运算符

1.递增递减运算符 C++语言并不要求递增递减运算符必须是类的成员.但是因为他们改变的正好是所操作对象的状态,所以建议设定为成员函数. 对于递增与递减运算符来说,有前置与后置两个版本,因此,我们应该为类定义两个版本的递增与递减运算符. 问题来了,程序是如何区分前置和后置呢?因为都是++和-- 为了解决这个问题,后置版本的递增递减运算符接受一个额外的(不被使用)int类型的形参.当我们使用后置运算符时,编译器为这个形参提供一个值为0的实参.这个形参唯一的作用就是区分前置和后置运算符函数. 因为不会

C++中不可重载的5个运算符

大多数运算符都是可以重载的,但是有5个运算符C++语言规定是不可以重载的. 1. .(点运算符),通常用于去对象的成员,但是->(箭头运算符),是可以重载的 2.::(域运算符),即类名+域运算符,取成员,不可以重载 3..*(点星运算符,)不可以重载,成员指针运算符".*,即成员是指针类型 4.?:(条件运算符),不可以重载 5.sizeof,不可以重载