重载<<和>>

在C++编程中实现数据的输入/输出可以用cin>>ch/cout<<ch;

但是使用cin>>ch或cout<<ch并不能实现一些特殊的数据的输入或者输出,比如输入复数、输出复数、输入时间、输出时间

为了解决对于特殊数据的输入和输出在C++中可以使用运算符重载的方式实现,可以通过重载>>和<<运算符实现特殊数据的输入和输出

1重载>>

重载函数的形式:

<span style="color:#000000;">friend istream&  operator >>(istream& input, Complex& c);</span>

第一个参数: istream表示输入流

第二个参数: Complex& 表示对Complex类实行输入

返回值: istream表示返回输入流

2重载<<

重载函数的形式:

 friend ostream&  operator <<(ostream& output, Complex& c);

第一个参数: ostream表示输入流

第二个参数:
Complex& 表示对Complex类实行输出

返回值:
ostream表示返回输出流

运用实例,通过重载>>和<<实现复数的输入和输出

#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)
{
    char op, ch;//保存字符 ,如1+2i, op保存+, ch保存i

    input>>c.real>>op>>c.imag>>ch;

    return input;
}

//重载<<运算符实现输出复数
ostream&  operator <<(ostream& output, Complex& c)
{
    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");
}

程序执行结果:

在程序中分别输入  5+10i  和  4+8i  后



重载<<和>>

时间: 2024-08-15 05:36:02

重载<<和>>的相关文章

类的多态与重载

*----------------------------------------------------------------------* *       CLASS superclass DEFINITION  定义基类 *----------------------------------------------------------------------* * *-----------------------------------------------------------

重载&gt;&gt;运算符

#include <iostream>   #include <stdio.h>   using namespace std;   class Input   {       public:          //实际重载是右移运算符          Input & operator >> (int &a)          {              scanf("%d",&a);              fflush

java中的重写和重载

重写 在java中有很多的继承,继承下来的有变量.方法.在有一些子类要实现的方法中,方法名.传的参数.返回值跟父类中的方法一样,但具体实现又跟父类的不一样,这时候我们就需要重写父类的方法,就比如我们有一个类叫做Animals,Animals类中有一个叫做Call,然后我们继承Animals又生成了Cat类和Dog类,Cat和Dog也分别有自己特别的叫声,程序如下: 1 class Animals { 2 public void call() { 3 System.out.println("啊啊啊

关于运算符重载

运算符重载需遵循以下原则: 1.除了类所属关系运算符".".成员指针运算符".*".作用域运算符"::".sizeof运算符.三目运算符"?:"之外,C++中所有的运算符都可以进行重载 2.重载运算符限制在C++已有的运算符范围内,不允许创建新的运算符 3.重载之后的运算符不能改变运算符的优先级和结合性,也不能改变运算符的操作数的个数及语法结构 4.运算符重载不能改变运算符用于内置类型的对象的含义,只能用于自定义类型对象之间,

模板类的友元重载

模板类的友元重载和普通类的友元重载有不同之处,可以参考这篇CSDN博客http://blog.csdn.net/ozwarld/article/details/7770808 #include <iostream> using namespace std; template <class T> class Test; // 模板类前置声明 template<class T> ostream& operator << (ostream& out

运算符重载

关键字:operator 相见:<高质量程序设计指南> P255 如果运算符被重载为全局函数,那么只有一个参数的运算符叫做一元运算符,有两个参数的运算符叫做二元运算符. 如果运算符被重载为类的成员函数,那么一元运算符没有参数(但是++和--运算符的后置版本除外),二元运算符只有右侧参数,因为对象自己成了左侧参数. 运算符重载的特殊性 如果重载为成员函数,则this对象发起对它的调用 如果重载为全局函数,则第一个参数发起对它的调用 禁止用户发明该语言运算符集合中不存在的运算符 除了函数调用运算符

C++ 运算符重载

C++中预定义的运算符的操作对象只能是基本数据类型,实际上,对于很多用户自定义类型,也需要有类似的运算操作.比如对象a和对象b, 那么 a+b 就需要用户自己定义它怎么相加,这时就用到了运算符重载. 运算符重载规则如下: ①. C++中的运算符除了少数几个之外,全部可以重载,而且只能重载C++中已有的运算符. ②. 重载之后运算符的优先级和结合性都不会改变. ③. 运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造.一般来说,重载的功能应当与原有功能相类似,不能改变原运算符的操作对

java怎样实现重载一个方法

重载(重新载选方法): java允许在一个类中,存在多个方法拥有相同的名字,但在名字相同的同时,必须有不同的参数,这就是重载,编译器会根据实际情况挑选出正确的方法,如果编译器找不到匹配的参数或者找出多个可能的匹配就会产生编译时错误,这个过程被称为重载的解析 . 重载包括:普通方法的重载和构造方法的重载 方法:即函数(文中我们统称之为"方法"),是一个固定的一个程序段,或称其为一个子程序,它在可以实现固定运算功能.而且,同时还带有一个入口和一个出口,所谓的入口,就是函数所带的各个参数,我

JavaScript No Overloading 函数无重载之说

在ECMAScript语言中,函数名字只不过是一个指针(可以认为是引用),下面的代码: "use strict"; function sum(a,b){ return a+b; } console.log(sum(1,2)); var sum2 = sum; sum = null; console.log(sum2(3,3)); 输出:3,6; 代码可以看出,我们定义了函数,其实函数名是一个指针,指针指向了堆内存那块这个函数的定义,我们可以把这个地址保存好几份. 我们看一下"

构造函数和析构函数是否可以被重载

构造函数可以被重载,因为构造函数可以有多个且可以带参数. 析构函数不可以被重载,因为析构函数只能有一个,且不能带参数.