美文网首页干货
C++ geekband homework review 2

C++ geekband homework review 2

作者: Wanggl | 来源:发表于2015-10-03 11:56 被阅读138次

    C++极客班作业第二题

    为Rectangle类实现构造函数,拷贝构造函数,赋值操作符,析构函数。

    class Shape

    {

    int no;

    };

    class Point

    {

    int x;

    int y;

    };

    class Rectangle: public Shape

    {

    int width;

    int height;

    Point * leftUp;

    public:

    Rectangle(int width, int height, int x, int y);

    Rectangle(const Rectangle& other);

    Rectangle& operator=(const Rectangle& other);

    ~Rectangle();

    };

    头文件

    #ifndef _RECTANGLE_

    #define _RECTANGLE_

    class Shape

    {

    int no;

    };

    class Point

    {

    int x;

    int y;

    };

    当时为了测试,我在此处添加了一个Rectlangle的友元,仍然是因为对类的构造函数和拷贝构造函数没有理解透彻。

    class Rectangle:public Shape

    {

    public:

    int Width()  const{ return width;  }

    Rectangle(int w = 0, int h = 0, int x = 0, int y = 0);

    Rectangle(const Rectangle& other);

    Rectangle& operator = (const Rectangle& other);

    ~Rectangle();

    private:

    int width;

    int height;

    Point* leftup;

    };

    构造函数

    inline

    Rectangle::Rectangle(int w,int h,int x,int y)

    :width(w)

    ,height(h)

    {

    leftup = new Point();

    //不添加友元,此处提示不能访问私有成员

    leftup->x = x;

    leftup->y = y;

    }

    修改后的代码

    inline

    Rectangle::Rectangle(int w,int h,int x,int y)

    :width(w)

    ,height(h)

    {

    leftup = new Point();

    }

    为什么此处可以实现呢?因为编译器为Point提供了默认的构造函数,Point内部的数据非常简单,编译器进行逐个赋值即可满足题目中的要求。

    拷贝赋值函数

    inline

    Rectangle& Rectangle::operator = (const Rectangle& other)

    {

    if (this == &other)

    {

    return *this;

    }

    width = other.width;

    height = other.height;

    delete leftup;

    leftup = new Point();

    leftup = new Point(*other->leftup);

    leftup->x = other.leftup->x;

    leftup->y = other.leftup->y;

    return *this;

    }

    此处我首先对this->leftup进行了删除,当时李老师说不需要去删除,但是侯杰老师多次强调要删除。我当时在想这两位大师肯定有一位犯错误了,事实证明大师不是随便能被怀疑的,两位大师都是对的。---侯杰老师强调删除是因为后续进行的是指针对象的赋值,李老师说不需要删除是因为李老师后续进行了对象的赋值。看来课程还得多听几遍,大师的话真是字字珠玑啊!

    另:李老师在此处的讲解中有一点小错误---other->leftup

    修改后

    inline

    Rectangle& Rectangle::operator = (const Rectangle& other)

    {

    if (this == &other)

    {

    return *this;

    }

    if (other.leftup != NULL)

    {

    leftup = new Point(*(other.leftup));

    }

    else

    {

    this->leftup = NULL;

    }

    width = other.width;

    height = other.height;

    Shape::operator = (other);

    return *this;

    }

    拷贝构造函数

    inline

    Rectangle::Rectangle(const Rectangle& other)

    {

    width = other.width;

    height = other.height;

    leftup = new Point();

    leftup->x = other.leftup->x;

    leftup->y = other.leftup->y;

    }

    此处的问题较大:

    没有判断other.leftup是否为空

    应该使用拷贝构造函数,防止Point扩容的问题

    没有考虑父类(Shape)

    修改后

    inline

    Rectangle::Rectangle(const Rectangle& other)

    :Shape(other)

    ,width(other.width)

    ,height(other.height)

    {

    if (other.leftup != NULL)

    {

    leftup = new Point(*other.leftup);

    }

    else

    {

    leftup = NULL;

    }

    }

    析构函数

    inline

    Rectangle::~Rectangle()

    {

    delete leftup;

    }

    #endif

    源文件

    #include

    #include "Rectangle2.h"

    using namespace std;

    int main(int argc, char* argv[])

    {

    Rectangle rect(100,100,10,10);

    Rectangle rect2(rect);

    Rectangle rect3;

    rect3 = rect2;

    cout<

    return 0;

    }

    测试结果

    相关文章

      网友评论

        本文标题:C++ geekband homework review 2

        本文链接:https://www.haomeiwen.com/subject/uksgcttx.html