第二周 string class
big three 三個(gè)特殊的函數(shù)
帶有指針的類(lèi)一定要具有以下幾種函數(shù):
- 拷貝構(gòu)造
- 拷貝賦值
- 析構(gòu)函數(shù)
本周課程內(nèi)容接著第一周淋纲,講了類(lèi)的設(shè)計(jì),不同的是本周以string class為例诽里,講解了帶有指針的類(lèi)的設(shè)計(jì)达吞。重點(diǎn)是big three的內(nèi)容吓坚。
以下通過(guò)本周的作業(yè)來(lái)重頭捋一遍
本周的作業(yè)是為 Rectangle 類(lèi)實(shí)現(xiàn)構(gòu)造函數(shù),拷貝構(gòu)造函數(shù),賦值操作符,析構(gòu)函數(shù)占卧。實(shí)例代碼如下:
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();
};
so
開(kāi)始思考
- 數(shù)據(jù)贵涵。
一個(gè)rectangle類(lèi)需要的數(shù)據(jù)應(yīng)該有長(zhǎng)、寬和左上角坐標(biāo)血柳。即width官册、height、leftup - 構(gòu)造函數(shù)
因?yàn)閘eftup為rectangle的左上角坐標(biāo)难捌,考慮設(shè)計(jì)為一個(gè)指針膝宁。那么作為一個(gè)帶有指針的類(lèi)就必須要有構(gòu)造鸦难、拷貝構(gòu)造、拷貝賦值和析構(gòu)函數(shù)员淫。
具體代碼來(lái)說(shuō)呢:
- 對(duì)于leftup合蔽,作業(yè)實(shí)例用了一個(gè)單獨(dú)的Point類(lèi)來(lái)表示,
class Point
{
int x;
int y;
};
Point * leftUp
那么這里呢介返,先完善Point類(lèi)
代碼如下:
class Point
{
private:
int x;
int y;
public:
Point(int x1=0,int y1=0)
:x(x1),y(y1){}
};
- 構(gòu)造函數(shù)
Rectangle(int w=1, int h=1, int x=0, int y=0)
:width(w),height(h),leftUp(&Point(x,y)){}
對(duì)于構(gòu)造函數(shù)拴事,需要將x和y轉(zhuǎn)換為Point,這里利用初值列,先通過(guò)point的構(gòu)造函數(shù)完成Point對(duì)象的創(chuàng)建圣蝎,再通過(guò)取地址符&挤聘,將地址傳遞給leftup。
- 拷貝構(gòu)造
拷貝構(gòu)造時(shí)捅彻,由于Point是一個(gè)指針组去,因此需要對(duì)指針進(jìn)行判斷是否為空指針
inline
Rectangle::Rectangle(const Rectangle& other)
:Shape(other), width(other.width), height(other.height) {
if (other.leftUp != nullptr){
leftUp = new Point(*(other.leftUp));
}
else
{
leftUp = nullptr;
}
}
- 拷貝賦值
同樣因?yàn)橹羔樀拇嬖冢截愘x值時(shí)需要首先進(jìn)行判斷步淹,看是否為自我賦值从隆。若是自我賦值,直接返回自己缭裆。
若不是自我賦值键闺,長(zhǎng)=長(zhǎng),寬=寬澈驼。
對(duì)于Point,由于是指針辛燥,要先考慮是否為空指針。
inline Rectangle&
Rectangle::operator=(const Rectangle& other) {
if (this==&other)
{
return *this;
}
Shape::operator=(other);
width = other.width;
height = other.height;
if (leftUp!=nullptr)
{
if (other.leftUp != nullptr) {
*leftUp = *(other.leftUp);
}
else
{
delete leftUp;
leftUp = nullptr;
}
}
else
{
if (other.leftUp!=nullptr)
{
leftUp = new Point(*(other.leftUp));
}
}
return *this;
}