《C++语言基础》实践参考——我的向量类

返回:贺老师课程教学链接 项目要求

【项目4-我的向量类】

建立一个向量类MyVector,声明如下,请完成类的定义

class MyVector          //定义向量类
{
public:
    MyVector(int m);    //构造函数,共有m个元素的向量,元素值预置为0
    MyVector(const MyVector &v);  //复制构造函数
    ~MyVector(); //析构函数:释放动态数组所占用的存储空间
    friend istream &operator>>(istream &input, MyVector &d);
    friend ostream &operator<<(ostream &output, const MyVector &d);
    friend MyVector operator+(const MyVector &d1,const MyVector &d2);//向量相加,对应位置上的元素相加
    friend MyVector operator-(const MyVector &d1,const MyVector &d2);//向量相减,对应位置上的元素相减
    bool operator==(const MyVector &d);//判断两个矩阵是否相等,即对应位置上的所有元素是否相等
private:
    int *Array;       //Array 为动态数组指针,指向向量占用内存的起始地址
    int num;          //向量中元素个数
};
int main()
{
    MyVector d1(5),d2(5);
    cout<<"输入d1——";
    cin>>d1;
    cout<<"输入d2——";
    cin>>d2;
    cout<<"d1="<<d1<<endl;
    cout<<"d2="<<d2<<endl;
    cout<<"d1+d2="<<d1+d2<<endl;
    cout<<"d1-d2="<<d1-d2<<endl;
    cout<<"d1"<<((d1==d2)?"==":"!=")<<"d2"<<endl;
    return 0;
}

[参考解答]

#include <iostream>
using namespace std;
class MyVector          //定义向量类
{
public:
    MyVector(int m);    //构造函数,共有m个元素的向量,元素值预置为0
    MyVector(const MyVector &v);  //复制构造函数
    ~MyVector(); //析构函数:释放动态数组所占用的存储空间
    friend istream &operator>>(istream &input, MyVector &d);
    friend ostream &operator<<(ostream &output, const MyVector &d);
    friend MyVector operator+(const MyVector &d1,const MyVector &d2);//向量相加,对应位置上的元素相加
    friend MyVector operator-(const MyVector &d1,const MyVector &d2);//向量相减,对应位置上的元素相减
    bool operator==(const MyVector &d);//判断两个矩阵是否相等,即对应位置上的所有元素是否相等
private:
    int *Array;       //Array 为动态数组指针,指向向量占用内存的起始地址
    int num;          //向量中元素个数
};

MyVector::MyVector(int m)
{
    num = m;
    Array = new int[num];
    for(int i=0; i<num; ++i)
        Array[i]=0;
}

MyVector::MyVector(const MyVector &d)
{
    num=d.num;
    if(Array!=NULL) delete []Array;  //***这一句可以去掉,解释在程序后面
    Array = new int[num];
    for(int i=0; i<num; ++i)
        Array[i]=d.Array[i];
}

MyVector::~MyVector() //析构函数:用于释放动态数组所占用的存储空间
{
    delete [] Array;
}

istream &operator>>(istream &input, MyVector &d)
{
    cout<<d.num<<"个元素的向量: ";
    for(int i=0; i<d.num; ++i)
        cin>>d.Array[i];
    return input;
}

ostream &operator<<(ostream &output, const MyVector &d)
{
    cout<<"(";
    if(d.num>0)
        cout<<d.Array[0];
    for(int i=1; i<d.num; ++i)
        cout<<", "<<d.Array[i];
    cout<<")";
    return output;
}

MyVector operator+(const MyVector &d1,const MyVector &d2)
{
    //在此可以先判断d1和d2的元素数是否相同,如果不相同可以报错退出,不做运算。本参考解答忽略了这一前提
    MyVector d(d1.num);
    for(int i=0; i<d1.num; ++i)
    {
        d.Array[i]=d1.Array[i]+d2.Array[i];
    }
    return d;
}

MyVector operator-(const MyVector &d1,const MyVector &d2)
{
    MyVector d(d1.num);
    for(int i=0; i<d1.num; ++i)
    {
        d.Array[i]=d1.Array[i]-d2.Array[i];
    }
    return d;
}

bool MyVector::operator ==(const MyVector &d)//判断两个矩阵是否相等,即对应位置上的所有元素是否相等
{
    if(num!=d.num) return false;
    bool eq = true;
    for(int i=0; i<num; ++i)
    {
        if (Array[i]!=d.Array[i])
        {
            eq=false;
            break;
        }
        if (!eq) break;
    }
    return eq;
}

int main()
{
    MyVector d1(5),d2(5);
    cout<<"输入d1——";
    cin>>d1;
    cout<<"输入d2——";
    cin>>d2;
    cout<<"d1="<<d1<<endl;
    cout<<"d2="<<d2<<endl;
    cout<<"d1+d2="<<d1+d2<<endl;
    cout<<"d1-d2="<<d1-d2<<endl;
    cout<<"d1"<<((d1==d2)?"==":"!=")<<"d2"<<endl;
    return 0;
}

关于***处的解释:话说这道题目曾经比现在这个样子全面的。作为一个完整的类的设计,要把“全套”的运算符都重载了。而这一句,是在做答案时,我从赋值运算符的重载中拷贝过来的,在复制构造函数中去掉为宜。如果是赋值时,原先有值,意味着占内存,在替换新内容之前,将旧空间释放,免得泄露。而在构造函数中,作为新建对象,不会出现这个问题。

时间: 2024-09-08 09:22:32

《C++语言基础》实践参考——我的向量类的相关文章

《C++语言基础》实践参考——我的数组类

返回:贺老师课程教学链接 [项目2-我的数组类]下面的程序,因为存在指针类型的数据成员,需要能完成深复制的构造函数.请补充完整构造函数和析构函数(其他不必动).其中,构造函数要完成下面三个任务:(1)为各成员函数赋值,按照深复制原则,其中arrayAddr应该是为保存数据新分配的连续空间的首地址:(2)MyArray(int *a, int n)中,要将a指向的数组中的数值,逐个地复制到新分配的arrayAddr指向的空间中:(3)getMax( )函数采取的策略是直接返回max(所以,计算ma

《C++语言基础》实践参考——方程也是类

返回:贺老师课程教学链接 项目要求 [项目5-方程也是类]设计一元一次方程类,求形如ax+b=0的方程的解.例如:输入3x-8=0时,输出的方程的解为x=2.66667:再如:输入5s+18=0时,输出的方程的解为s=-3.6: 参考界面如下:参考代码为: class CEquation { private: double a; // 未知数系数 double b; // 常数项 char unknown; // 代表未知数的符号 public: CEquation(double aa=0,do

《C++语言基础》参考——学生可以相加吗?

返回:贺老师课程教学链接 谈及运算,我们总是习惯"数"的运算.而实际上,像时间之类的对象也是可以进行加减运算的.再进一步,我们的思维还可以拓展,运算加以加到任何事物上,只要我们可以为这些"运算"设计好意义. 例如:有班级类和学生类.两个学生相加,组成了一个由两个学生构成的班级:班级加学生,代表班级增加了一名新同学:学生乘学生,结果为这两个学生"结对子",可以做某些事(这个对子,需要定义成一个新的类):班级乘班级,是班级中的所有学生,两两结对子的所

《C++语言基础》参考——转换构造函数与类型转换函数

返回:贺老师课程教学链接 下面的程序,想在main函数中要完成实数加复数.复数加实数,不可以.编译下面的程序出现错误,就是因为没有提供对应类型数据的运算符重载函数. #include <iostream> using namespace std; class Complex { public: Complex():real(0), imag(0){} Complex(double r,double i):real(r), imag(i){} Complex operator+(const Co

C++实践参考:IP地址类

[项目-IP地址类] 在互联网中使用的IP地址占4字节,可以用四段法表示,每段值的范围为0-255,中间用"."隔开,例如202.194.116.97.其实,也可以看看一个有4字节的无符号整型值3401741409. 现设计一个IP地址类,用于保存IP地址,并实施在IP地址上的一些操作.如下所示: class IP { private: union //由此匿名联合体可以看出,IP地址共占4个字节 { struct //这是一个由4个字节构成的匿名结构体 { unsigned char

《C++语言基础》实践项目——运算符重载(二)

返回:贺老师课程教学链接 [项目1-复数类中的运算符重载(续)]在复数类中的运算符重载基础上(1)再定义一目运算符 -,-c相当于0-c.(2)定义Complex类中的<<和>>运算符的重载,实现输入和输出,改造原程序中对运算结果显示方式,使程序读起来更自然.[参考解答] [项目2-Time类中的运算符重载(续)] 在Time类中的运算符重载基础上(1)定义对时间对象的自增和自减一目运算符 //一目运算符的重载 CTime operator++(int);//后置++,下一秒 CT

《C++语言基础》实践项目——运算符重载(一)

返回:贺老师课程教学链接 [项目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); Com

《C++语言基础》实践项目——多重继承

返回:贺老师课程教学链接 [项目1 - 教师兼干部类]分别定义Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派生出新类Teacher_Cadre(教师兼干部).要求: (1)在两个基类中都包含姓名.年龄.性别.地址.电话等数据成员. (2)在Teacher类中还包含数据成员title(职称),在Cadre类中还包含数据成员post(职务),在Teacher_Cadre类中还包含数据成员wages(工资). (3)对两个基类中的姓名.年龄.性别.地址.电话等数据成员用相

《C++语言基础》网络课程主页

返回 贺利坚教学链接 本课程是在大学的实体课程基础上建设的一门网络课程,将我在教学中建设的资源,让更多的人能够用到. 课程链接是:点击打开链接 同步实体课在 点击打开链接,那里有92名同时学习的"同学",以及他们的博客链接. 坚持这门课程学习的学员,请在评论处留言,我将建立专门的链接,一起建设学习的氛围. 学员链接:(待加) 课程内容 一.从C到C++ 课时 视频 示例程序 自测 学习指导与实践 实践项目参考解答 1.1 由C语言到C++(暨本课介绍) 链接   1.2 C语言的基本成