对时钟类进行运算符重载
【问题描述】对时钟类进行重载【输入形式】
【输出形式】
【样例输入】
【样例输出】
【样例说明】
【评分标准】
#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有一个参数
- 下列关于运算符重载的描述中,()是正确的
D
【 正确答案: D】
A 运算符重载可以改变运算的个数
B 运算符重载可以改变优先级
C 运算符重载可以改变结合性
D 运算符重载不能改变语法结构 - 如果表达式++ik中的“++”和“”都是重载的友元运算符,则采用运算符函数调用格式,该表达式还可表示为()
【 正确答案: B】
A operator*(i.operator++(),k)
B operator*(operator++(i),k)
C i,operator++().operator*(k)
D k.operator*(operator++(i))
- 下列运算符中,()运算符在C++中不能重载
【 正确答案: C】
A &&
B []
C ::
D new