2015级C++第12周实践项目 运算符重载(一)

【项目1-实现复数类中的运算符重载】 参考解答

  (1)请用类的成员函数,定义复数类重载运算符+、-、*、/,使之能用于复数的加减乘除

class Complex
{
public:
    Complex(){real=0;imag=0;}
    Complex(double r,double i){real=r; imag=i;}
    Complex operator+(const Complex &c2);
    Complex operator-(const Complex &c2);
    Complex operator*(const Complex &c2);
    Complex operator/(const Complex &c2);
    void display();
private:
    double real;
    double imag;
};
//下面定义成员函数

//下面定义用于测试的main()函数
int main()
{
    Complex c1(3,4),c2(5,-10),c3;
    cout<<"c1=";
    c1.display();
    cout<<"c2=";
    c2.display();
    c3=c1+c2;
    cout<<"c1+c2=";
    c3.display();
    c3=c1-c2;
    cout<<"c1-c2=";
    c3.display();
    c3=c1*c2;
    cout<<"c1*c2=";
    c3.display();
    c3=c1/c2;
    cout<<"c1/c2=";
    c3.display();
    return 0;
}

  (2)请用类的友元函数,而不是成员函数,再次完成上面提及的运算符的重载;

  (3)定义一个定义完整的类(是可以当作独立的产品发布,成为众多项目中的“基础工程”)。这样的类在(2)的基础上,扩展+、-、*、/运算符的功能,使之能与double型数据进行运算。设Complex c; double d; c+d和d+c的结果为“将d视为实部为d的复数同c相加”,其他-、*、/运算符类似。

【项目2-Time类中的运算符重载】 参考解答

  实现Time类中的运算符重载。

class CTime
{
private:
    unsigned short int hour;    // 时
    unsigned short int minute;  // 分
    unsigned short int second;  // 秒
public:
    CTime(int h=0,int m=0,int s=0);
    void setTime(int h,int m,int s);
    void display();
    //二目的比较运算符重载
    bool operator > (CTime &t);
    bool operator < (CTime &t);
    bool operator >= (CTime &t);
    bool operator <= (CTime &t);
    bool operator == (CTime &t);
    bool operator != (CTime &t);

    //二目的加减运算符的重载
    //返回t规定的时、分、秒后的时间
    //例t1(8,20,25),t2(11,20,50),t1+t2为19:41:15
    CTime operator+(CTime &t);
    CTime operator-(CTime &t);//对照+理解
    CTime operator+(int s);//返回s秒后的时间
    CTime operator-(int s);//返回s秒前的时间
    //二目赋值运算符的重载
    CTime &operator+=(CTime &c);
    CTime &operator-=(CTime &c);
    CTime &operator+=(int s);//返回s秒后的时间
    CTime &operator-=(int s);//返回s秒前的时间
    //一目运算符的重载
    CTime operator++(int);//后置++,下一秒
    CTime &operator++();//前置++,下一秒
    CTime operator--( int);//后置--,前一秒
    CTime &operator--();//前置--,前一秒
};

  提示1:并不是所有比较运算重载函数都很复杂

//比较运算返回的是比较结果,是bool型的true或false
//可以直接使用已经重载了的运算实现新运算,例如果已经实现了 > ,则实现 <= 就可以很方便了……
bool CTime::operator <= (CTime &t) // 判断时间t1<=t2
{
    if (*this > t) return false;
    return true;
}

  甚至可以如下面的代码般简练:

bool CTime::operator <= (CTime &t){return !(*this > t)}

  提示2:并不是所有复合赋值运算重载函数都需要很复杂

//可以直接使用已经重载了的加减运算实现
//这种赋值, 例如 t1+=20,直接改变当前对象的值,所以在运算完成后,将*this作为返回值
CTime &CTime::operator+=(CTime &c)
{
    *this=*this+c;
    return *this;
}

  提示3:请自行编制用于测试的main()函数,有些结果不必依赖display()函数,提倡用单步执行查看结果

【项目3-数组类运算的实现】 参考解答

  设计数组类Array,为了实现测试函数中要求的功能,请补足相关的函数(构造、析构函数)和运算符重载的函数。请注意引用的用法。

  实现策略提示:可以将测试函数中的语句加上注释,取消一句的注释,增加相应的函数,以渐增地实现所有的功能,避免全盘考虑带来的困难。

class Array
{
private:
    int* list;  //用于存放动态分配的数组内存首地址
    int size;   //数组大小(元素个数)
public:
    //成员函数声明
};
//要求测试函数能够运行出正确、合理的结果:
int main()
{

    int a[8]= {1,2,3,4,5,6,7,8};
    int b[8]= {10,20,30,40,50,60,70,80};
    Array array1(a,8),array3,array4;
    const Array array2(b,8);
    array4=array3=array1+array2;
    array3.show();
    array4.resize(20);
    array4[8]=99;
    cout<<array4[8]<<endl;
    cout<<array2[3]<<endl;
    return 0;
}

【项目4-String类的构造】 参考解答

  写一个能处理字符串的类,其数据成员如下所示:

class String
{
public:
   ...//需要的成员函数(若需要的话,声明友元函数)
private:
    char *p;   //指向存储的字符串
    int len;   //记录字符串的长度
};  

  请构造String类的加、减运算。其中,s1 + s2将两个字符串的连接起来;s1 - s2是将s1的尾部空格和s2的前导空格去除后的连接。

  提示:有指针成员,设计时要注意。这个,你懂的。

时间: 2024-10-01 04:33:20

2015级C++第12周实践项目 运算符重载(一)的相关文章

2015级C++第2周实践项目

[项目1 - 宣告"主权"] 你已经是CSDN博客主了,用IT人特有的方式,编一段程序.在屏幕上输出你想说的话.按要求公布博文,作为我们的开山之作. [项目2 - 胖子不想说体重]參考解答 成年男性的标准体重公式为: 标准体重(kg)=身高(cm)?100 超标准体重20%为超重,比标准体重轻20%为超轻. 请编写C++程序,输入身高和体重,完毕以下的任务: (1)计算并输出标准体重. (2)计算出标准体重,当超重时.请给出提示. (3)计算出标准体重.当超重时给出提示.不超重时也给提

2013级C++第12周(春)项目——成员的訪问属性、多重继承

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 第一部分 程序阅读 1.阅读程序.分析类中成员的訪问属性 #include <iostream> using namespace std; class A //A为基类 { public: void f1( ); int i; protected: void f2(); int j; private: int k; }; class B: p

2013级C++第15周(春)项目——输入输出流及文件文件操作

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759.内有完整教学方案及资源链接 本周程序阅读及程序调试中须要的文件,请到http://pan.baidu.com/s/1qW59HTi下载. 第一部分 阅读程序(执行程序时,由上面的链接下载源码)1.阅读教材例13.1到例13.7的程序,依据所用到的函数在功能上的限制,自己设计输入的測试数据,执行程序.(1)与自己的期望结果相对比,理解各个函数的使用方法:(2)深入理解数据流

第12周 【项目4 - 点、圆的关系】(2)

问题描述: [项目4 - 点.圆的关系] (1)先建立一个Point(点)类,包含数据成员x,y(坐标点): (2)以Point为基类,派生出一个Circle(圆)类,增加数据成员(半径),基类的成员表示圆心: (3)编写上述两类中的构造.析构函数及必要运算符重载函数(本项目主要是输入输出): (4)定义友元函数int locate,判断点p与圆的位置关系(返回值<0圆内,==0圆上,>0 圆外): <strong><span style="font-family:

第12周 【项目4 - 点、圆的关系】(1)

问题描述: (1)先建立一个Point(点)类,包含数据成员x,y(坐标点): (2)以Point为基类,派生出一个Circle(圆)类,增加数据成员(半径),基类的成员表示圆心: (3)编写上述两类中的构造.析构函数及必要运算符重载函数(本项目主要是输入输出): (4)定义友元函数int locate,判断点p与圆的位置关系(返回值<0圆内,==0圆上,>0 圆外): int main( ) { Circle c1(3,2,4),c2(4,5,5); //c2应该大于c1 Point p1(

第12周 【项目4 - 点、圆的关系】(3)

问题描述: (1)先建立一个Point(点)类,包含数据成员x,y(坐标点): (2)以Point为基类,派生出一个Circle(圆)类,增加数据成员(半径),基类的成员表示圆心: (3)编写上述两类中的构造.析构函数及必要运算符重载函数(本项目主要是输入输出): (4)定义友元函数int locate,判断点p与圆的位置关系(返回值<0圆内,==0圆上,>0 圆外): int main( ) { Circle c1(3,2,4),c2(4,5,5); //c2应该大于c1 Point p1(

2015级C++第7周项目 友元、共享数据保护、多文件结构

[项目1-成员函数.友元函数和一般函数有差别]參考解答 (1)阅读以下的程序,体会凝视中的说明(要执行程序,请找到课程主页并复制代码) //例:使用成员函数.友元函数和一般函数的差别 #include <iostream> using namespace std; class Time { public: Time(int h,int m,int s):hour(h),minute(m),sec(s) {} void display1(); //display1是成员函数 friend voi

2015级C++第4周项目 函数

[项目1-求最大公约数] 参考解答 (1)输入两个数,并求出其最大公约数 #include <iostream> using namespace std; //自定义函数的原型(即函数声明) int main() { int a,b,g; cin>>a>>b; g=gcd(a,b); cout<<"最大公约数是: "<<g; return 0; } int gcd(int x,int y) //定义用于求两数的最大公约数的函数

python编程快速上手之第12章实践项目参考答案(12.13.3)

1 #! python3 2 import openpyxl,os,glob 3 os.chdir('C:\\Users\\Administrator\\Python35-32') 4 list=glob.glob('*.txt') 5 print(list) 6 wb = openpyxl.Workbook() 7 sheet = wb.get_active_sheet() 8 columnNum=0 9 for fliename in list: 10 file_object = open(