面向对象程序设计第八章:运算符重载

简介: 面向对象程序设计第八章:运算符重载

对时钟类进行运算符重载

【问题描述】对时钟类进行重载【输入形式】

【输出形式】

【样例输入】

【样例输出】

【样例说明】

【评分标准】

#include <iostream>
using namespace std;
class Clock //时钟类声明
{
public: //外部接口
  Clock(int NewH=0, int NewM=0, int NewS=0);
  void ShowTime();
   Clock operator ++();        //前置单目运算符重载
 //后置单目运算符重载
       Clock operator ++(int);
      Clock operator +(const Clock&c2);
      Clock(const Clock& c2);
  //+运算符重载
      void jinwei();
 //+运算符重载
private:  //私有数据成员
  int Hour, Minute, Second;
};
Clock::Clock(const Clock& c2)
{
    Hour = c2.Hour;
    Minute = c2.Minute;
    Second = c2.Second;
}
void Clock::jinwei()
{
        if (Second >= 60)
        {
            Minute++;
            Second = Second - 60;
        }
        if (Minute >= 60)
        {
            Hour++;
            Minute = Minute - 60;
        }
        if (Hour >= 24)
        {
            Hour = Hour - 24;
        }
}
Clock::Clock(int newH, int NewM , int NewS) :Hour(newH), Minute(NewM), Second(NewS)
{
}
Clock Clock::operator+(const Clock& c2)
{
    Clock c3;
    c3.Hour = Hour + c2.Hour;
    c3.Minute = Minute + c2.Minute;
    c3.Second = Second + c2.Second;
    c3.jinwei();
    return c3;
}
Clock Clock::operator++()
{
    Second++;
    this->jinwei();
    return *this;
}
Clock Clock::operator++(int)
{
    Clock t;
    t = *this;
    Second++;
    this->jinwei();
    return t;
}
void Clock::ShowTime()
{  
   cout<<Hour<<":"<<Minute<<":"<<Second<<endl;
}
int main()
{
  Clock c1(23,59,59),c2(5,12,10),c3;
  c1.ShowTime();
  c1++;
  c1.ShowTime();
  c3=++c2;
  c3.ShowTime();
  c3=c2+c1;
  c3.ShowTime();
  return 0;
}

判断时间的大小

【问题描述】对> , = =, <进行重载 能够判断Time的大小

【输入形式】

【输出形式】

如 Time t1(2,3,5) t2(3,3,5)

cout<<(t1>t2);

输出结果为:1

【样例输出】

【样例说明】

【评分标准】

#include <iostream>
#include<iostream>
using namespace std;
class Time
{
public:
    Time(int h=0, int m=0, int s=0) :hour(h), min(m), sec(s)
    {
    }
    int operator ==(Time t2)
    {
        if ((hour == t2.hour) && (min == t2.min) && (sec == t2.sec))
            return 1;
        else
            return 0;
    }
    int tosec()
    {
        return sec + min * 60 + hour * 3600;
    }
    int operator <(Time t2)
    {
        if (this->tosec() > t2.tosec())
            return 1;
        else
            return 0;
    }
    int operator >(Time t2)
    {
        if (this->tosec() < t2.tosec())
            return 1;
        else
            return 0;
    }
private:
    int hour;
    int min;
    int sec;
};
int main( )
{
   Time t1(2,3,3),t2(2,3,3),t3(2,4,5);
   cout<<(t1==t2)<<(t1>t2)<<(t3<t2)<<endl;
} 

向量运算符重载

【问题描述】

【输入形式】

【输出形式】

【样例输入】

【样例输出】

【样例说明】

【评分标准】

#include <iostream>
using namespace std;
class myCArray
{
private:
  int* p_arr;
  public:
      void  print()  const;
      myCArray(int *a, int s)
      {
          this->len = 0;
          this->size = s;
          p_arr = new int[size];
          for (int i = 0; i < size; i++)
          {
              p_arr[i] = a[i];
              len++;
          }
      }
      myCArray()
      {
          this->len = 0;
          this->size = 0;
        p_arr=NULL;
      }
    myCArray (const myCArray &t)
    {
    size=t.size;
    p_arr=new int[size];
    for(int i=0;i<=size-1;i++)
    p_arr[i]=t.p_arr[i];
  }
      int &operator[](int i)
      {
          return p_arr[i];
      }
      myCArray operator +(const myCArray &a2);
      myCArray operator -(const myCArray& a2);
      myCArray operator =(const myCArray& t);
      ~myCArray()
      {
          delete p_arr;
      }
  private:    
    int size;
      int len;
};
myCArray myCArray::operator +(const myCArray &a2)
{
    myCArray a3;
    a3.size=size;
    a3.p_arr=new int[a2.size];
    for (int i=0;i<a3.size;i++)
      a3.p_arr[i]=0;
    for (int i = 0; i < a3.size; i++)
    {
        a3.p_arr[i] = p_arr[i] + a2.p_arr[i];
    }
    return a3;
}
myCArray myCArray::operator -(const myCArray& a2)
{
    myCArray a3;
    a3.size=size;
    a3.p_arr=new int[a2.size];
    for (int i=0;i<a3.size;i++)
      a3.p_arr[i]=0;
    for (int i = 0; i < a3.size; i++)
    {
        a3.p_arr[i] = p_arr[i] - a2.p_arr[i];
    }
    return a3;
}
myCArray myCArray::operator =(const myCArray& t)
{
    size = t.size;
    len = t.len;
    p_arr = new int[size];
    for (int i = 0; i < size; i++)
    {
        this->p_arr[i] = t.p_arr[i];
    }
    return *this;
}
void myCArray::print() const
  {
    for(int i=0;i<this->size ;i++)
      cout<<this->p_arr[i]<<" ";
    cout<<endl;
  }
int main()
  {   int a[5]={1,2,3,4,5},b[5]={1,1,1,1,1};
    myCArray t1(a,5),t2(b,5),t3;
     t3=t1+t2;
     t3.print();
     t3=t1-t2;
           t3.print();
     t3[4]=1000;
     t3.print();
       return 0;
  }

再战分数运算

【问题描述】

下列主函数涉及分数类Fraction对象的运算,Fraction对象由分子和分母构成,分析给出的代码并设计Fraction类,使主函数程序代码正确执行。提示:需要对相关运算符进行重载并使该分数约分成最简形式。

【输入形式】

【输出形式】

【样例输入】

【样例输出】

【样例说明】

【评分标准】

#include <iostream>
#include<iostream>
#include<iomanip>
using namespace std;
class Fraction
{
public:
    Fraction(int n = 0, int d = 1)
    {
        num = n;
        den = d;
    }
    friend double operator+(const double& a, const Fraction& b)
    {
        return a + (double)b.num / b.den;
    }
    friend Fraction operator+(const Fraction &f1,const Fraction &f2)
    {
        int v;
        v = ged(f1.den, f2.den);
        int com;
        com = f1.den * f2.den / v;
        Fraction f3,f4(f1),f5(f2);
        f4.num = f4.num * (com / f4.den);
        f5.num = f5.num * (com / f5.den);
        f3.num = f4.num + f5.num;
        f3.den = com;
        f3.yuefen();
        return f3;
    }
    friend Fraction operator-(const Fraction& f1, const Fraction& f2)
    {
        int v;
        v = ged(f1.den, f2.den);
        int com;
        com = f1.den * f2.den / v;
        Fraction f3, f4(f1), f5(f2);
        f4.num = f4.num * (com / f4.den);
        f5.num = f5.num * (com / f5.den);
        f3.num = f4.num - f5.num;
        f3.den = com;
        f3.yuefen();
        return f3;
    }
    friend Fraction operator*(Fraction f1,Fraction f2)
    {
        Fraction f3;
        f3.num = f1.num * f2.num;
        f3.den = f1.den * f2.den;
        f3.yuefen();
        return f3;
    }
    friend Fraction operator/(Fraction f1,Fraction f2)
    {
        Fraction f3;
        f3.num = f1.num * f2.den;
        f3.den = f1.den * f2.num;
        f3.yuefen();
        return f3;
    }
    static int ged(int a, int b)
    {
        int v ;
        v = a % b;
        while (v != 0)
        {
            a = b;
            b = v;
            v = a % b;
        }
        return b;
    }
    Fraction operator--()
    {
        if (den != 2)
        {
            this->yuefen();
            num--;
        }
        else
            num--;
        return *this;
    }
    operator double()
    {
        return num / den;
    }
    Fraction operator--(int)
    {
        int t=ged(num,den);
num=num/t;
den=den/t;
Fraction a=*this;
num--;
a.yuefen();
return a;
    }
    void yuefen()
    {
        int g;
        g = ged(num, den);
        num = num / g;
        den = den / g;
        if (den < 0) 
        {
            den = -den;
            num = -num;
        }
    }
    friend ostream& operator << (ostream& os, const Fraction& output) ;
    friend istream& operator >> (istream& is, Fraction& input);
private:
    int num;
    int den;
};
ostream& operator << (ostream& os, const Fraction& output) 
{
    if(output.num==0)
        os<<output.num<<endl;
else
    os << output.num << "/" << output.den << endl;
    return os;
}
istream& operator >> (istream& is, Fraction& input)
{
    char c;
    is >> input.num >> c >> input.den;
    return is;
}
int main()
{
  Fraction f1, f2,f3(4,-8);
  cin >> f1 >> f2;    //让用户输入两个分数,格式:分子/分母,如 2/6 24/14 
  cout << f1 + f3 << endl;  //输出的分数格式:分子/分母,如 -1/6
  cout << ----f3 << endl; //--运算只对分数对象的分子进行
  f3 = f1 / f2;
  cout << f3 << endl;
  cout << f2-- << endl; //--运算只对分数对象的分子进行
  cout << f1 * f2 << endl;
  cout << f1 - f2 << endl;  
  cout <<setiosflags(ios::fixed)<<setprecision(2) << 0.8 + f2 << endl;      //0.8+f2结果为浮点类型
  return 0;
}

习题

1.在表达式x+yz中,+是作为成员函数重载的运算符,是作为非成员函数重载的运算符。下列叙述中正确的是
C
【 正确答案: C】
A operator+有两个参数,operator
有两个参数
B operator+有两个参数,operator
有一个参数

C operator+有一个参数,operator有两个参数
D operator+有一个参数,operator
有一个参数

  1. 下列关于运算符重载的描述中,()是正确的
    D
    【 正确答案: D】
    A 运算符重载可以改变运算的个数
    B 运算符重载可以改变优先级
    C 运算符重载可以改变结合性
    D 运算符重载不能改变语法结构
  2. 如果表达式++ik中的“++”和“”都是重载的友元运算符,则采用运算符函数调用格式,该表达式还可表示为()

【 正确答案: B】

A operator*(i.operator++(),k)

B operator*(operator++(i),k)

C i,operator++().operator*(k)

D k.operator*(operator++(i))

  1. 下列运算符中,()运算符在C++中不能重载

【 正确答案: C】

A &&

B []

C ::

D new


目录
相关文章
|
6月前
|
Java 物联网 测试技术
Java面向对象程序设计3面向对象基础
Java面向对象程序设计3面向对象基础
329 0
|
6月前
|
Java 程序员 数据安全/隐私保护
Java面向对象编程:类和对象详解
Java面向对象编程:类和对象详解
54 0
|
6月前
|
存储 数据安全/隐私保护 C++
基于C++的面向对象程序设计:类与对象的深入剖析
基于C++的面向对象程序设计:类与对象的深入剖析
75 1
|
6月前
|
设计模式 Java 数据安全/隐私保护
Java面向对象程序设计
Java面向对象程序设计
32 0
|
存储 算法 编译器
03-📝C++核心语法|面向对象1【 C++编程规范、类和对象、面向对象程序设计案例、对象的构造和析构、C++面向对象模型初探】
复习`C++核心语法`,且适当进行汇编探索底层实现原理,进一步夯实基础,为以后的`底层开发`、`音视频开发`、`跨平台开发`、`算法`等方向的进一步学习埋下伏笔。
03-📝C++核心语法|面向对象1【 C++编程规范、类和对象、面向对象程序设计案例、对象的构造和析构、C++面向对象模型初探】
|
编译器 程序员 C++
c++面向对象程序设计基础教程————多态性和虚函数(一)
c++面向对象程序设计基础教程————多态性和虚函数(一)
126 0
c++面向对象程序设计基础教程————多态性和虚函数(一)
|
存储 程序员 C语言
c++面向对象基础编程——运算符重载(二)
c++面向对象基础编程——运算符重载(二)
101 0
|
C++
c++面向对象基础编程——运算符重载(一)
c++面向对象基础编程——运算符重载(一)
136 0
|
C++
c++面向对象程序设计基础教程————多态性和虚函数(二)
c++面向对象程序设计基础教程————多态性和虚函数(二)
140 0
面向对象程序设计第九章:多态
面向对象程序设计第九章:多态
137 0