Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...Moïi thao taùc ñeàu coù tham soá...

Preview:

Citation preview

Laäp Trình Höôùng Ñoái TöôïngLaäp Trình Höôùng Ñoái TöôïngLaäp Trình Höôùng Ñoái TöôïngLaäp Trình Höôùng Ñoái Töôïng

OÂn taäp toát nghieäp

Chöông 1Chöông 1

Ñoái töôïng vaø lôùpÑoái töôïng vaø lôùp

Giôùi thieäuGiôùi thieäu

� Phaân tích thieát keá vaø laäp trình theo höôùng ñoái töôïng tuy sinh sau ñeû muoän nhöng ñaõ chöùng toû ñöôïc nhöõng öu ñieåm vöôït troäi so vôùi caùch tieáp caän coå ñieån.

� Trong laõnh vöïc phaân tích vaø thieát keá heä thoáng, höôùng tieáp caän môùi meû naøy ñaõ thu huùt nhieàu nhaø nghieân cöùu teân tuoåi. Nhieàu kieåu maãu, phöông phaùp luaän, moâ hình phaân tích ñaõ ñöôïc ñöa ra vôùi nhöõng möùc ñoä thaønh coâng khaùc nhau. Ta seõ nghieân cöùu phöông höôùng phaân tích theo quan ñieåm cuûa

Chöông 2- Lôùp vaø ñoái töôïng 3

� Ta seõ nghieân cöùu phöông höôùng phaân tích theo quan ñieåm cuûa Rumbaugh: Moâ hình hoaù vaø thieát keá theo höôùng ñoái töôïng.

Phöông phaùp phaân tích baèng moâ hìnhPhöông phaùp phaân tích baèng moâ hình

� Phaân tích döïa treân cô sôû moâ hình hoùa caùc ñoái töôïng trong theá giôùi thöïc.

� Duøng moâ hình ñeå xaây döïng moät thieát keá khoâng phuï thuoäc ngoân ngöõ ñöôïc toå chöùc xung quanh caùc ñoái töôïng.

� So vôùi caùch toå chöùc coå ñieån, moâ hình hoaù vaø thieát keá höôùng ñoái töôïng giuùp hieåu roõ hôn yeâu caàu cuûa vaán ñeà,

Chöông 2- Lôùp vaø ñoái töôïng 4

höôùng ñoái töôïng giuùp hieåu roõ hôn yeâu caàu cuûa vaán ñeà, thieát keá trong saùng hôn, vaø keát quaû laø nhöõng heä thoáng deã daøng baûo trì hôn.

Phöông phaùp phaân tích baèng moâ hìnhPhöông phaùp phaân tích baèng moâ hình

� Caùc khaùi nieäm trong theá giôùi thöïc ñöôïc moâ hình hoaù baèng caùc kyù hieäu ñoà hoaï moâ taû caùc ñoái töôïng cuûa chuùng (caáu truùc döõ lieäu vaø haønh vi) ñoäc laäp vôùi ngoân ngöõ.

� Caùc khaùi nieäm vaø kyù hieäu naøy coù theå ñöôïc duøng thoáng nhaát suoát quaù trình phaùt trieån heä thoáng töø phaân tích, thieát keá ñeán caøi ñaët maø khoâng caàn thay ñoåi qua caùc giai ñoaïn nhö moät soá phöông phaùp luaän khaùc.

Chöông 2- Lôùp vaø ñoái töôïng 5

ñoaïn nhö moät soá phöông phaùp luaän khaùc. � Khoâng quan taâm ñeán chi tieát caøi ñaët cho ñeán giai ñoaïn

cuoái cuûa qui trình phaùt trieån heä thoáng.

Phöông phaùp phaân tích baèng moâ hìnhPhöông phaùp phaân tích baèng moâ hình

� Caùc khaùi nieäm lieân quan ñeán maùy tính chæ ñöôïc ñöa ra ôû böôùc maõ hoùa sau cuøng, nhôø ñoù giöõ ñöôïc söï uyeån chuyeån, linh ñoäng vaø coù ñöôïc töï do quyeát ñònh trong giai ñoaïn phaân tích vaø thieát keá.

Chöông 2- Lôùp vaø ñoái töôïng 6

Phöông phaùp luaän höôùng ñoái töôïng Phöông phaùp luaän höôùng ñoái töôïng

� Moâ hình hoùa vaø thieát keá theo höôùng ñoái töôïng laø moät loái suy nghó môùi veà vaán ñeà caàn giaûi quyeát duøng caùc moâ hình ñöôïc toå chöùc xung quanh caùc khaùi nieäm trong theá giôùi thöïc.

� Trong moät heä thoáng thoâng tin höôùng ñoái töôïng, moïi thöù, hay haàu nhö moïi thöù, ñöôïc quan ñieåm nhö caùc ñoái töôïng.

Chöông 2- Lôùp vaø ñoái töôïng 7

hay haàu nhö moïi thöù, ñöôïc quan ñieåm nhö caùc ñoái töôïng.

� Moãi ñoái töôïng laø söï keát hôïp cuûa caû hai thaønh phaàn ñaëc tröng laø caáu truùc döõ lieäu (caùc thuoäc tính) vaø hoaït ñoäng (caùc thuû tuïc xöû lyù döõ lieäu).

Phöông phaùp luaän höôùng ñoái töôïng Phöông phaùp luaän höôùng ñoái töôïng

� Phöông phaùp luaän theo quan ñieåm cuûa J.Rumbaugh bao goàm xaây döïng moät moâ hình cuûa heä thoáng trong laõnh vöïc öùng duïng vaø theâm chi tieát caøi ñaët trong quaù trình thieát keá heä thoáng.

� Caùc kyù hieäu ñoà hoïa ñöôïc söû duïng ñeå bieåu dieãn caùc khaùi nieäm höôùng ñoái töôïng.

Chöông 2- Lôùp vaø ñoái töôïng 8

nieäm höôùng ñoái töôïng. � Caùch tieáp caän naøy ñöôïc goïi laø kyõ thuaät thieát keá baèng moâ

hình (OMT: Object Modeling Technique).

Phöông phaùp luaän höôùng ñoái töôïng Phöông phaùp luaän höôùng ñoái töôïng

� Kyõ thuaät moâ hình hoaù OMT bao goàm caùc böôùc:

Phaân tích Thieát keá heä thoáng

Thieát keá ñoái töôïng

Caøi ñaët

Chöông 2- Lôùp vaø ñoái töôïng 9

Caùc khaùi nieäm höôùng ñoái töôïng Caùc khaùi nieäm höôùng ñoái töôïng

� Tröøu töôïng hoaù :• Nhaán maïnh vaøo caùc khía caïnh coát yeáu voán coù cuûa moät thöïc theå

vaø boû qua nhöõng tính chaát rieâng bieät. • Söû duïng tröøu töôïng hoaù trong phaân tích coù nghóa laø laøm vieäc vôùi

caùc khaùi nieäm trong laõnh vöïc öùng duïng vaø boû qua chi tieát caøi ñaët.

• Haàu heát caùc ngoân ngöõ laäp trình hieän ñaïi ñeàu hoå trôï tröøu töôïng

Chöông 2- Lôùp vaø ñoái töôïng 10

• Haàu heát caùc ngoân ngöõ laäp trình hieän ñaïi ñeàu hoå trôï tröøu töôïng hoaù. Nhöng söï tröøu töôïng hoùa ñöôïc taän duïng trong tieáp caän ñoái töôïng vôùi tính keá thöøa (inheritance) vaø tính ña daïng (polymorphism) mang laïi hieäu quaû cao hôn.

Caùc khaùi nieäm höôùng ñoái töôïng Caùc khaùi nieäm höôùng ñoái töôïng

� Tính ñoùng goùi :• Taùch rôøi caùc khía caïnh giao dieän vôùi beân ngoaøi cuûa ñoái töôïng

vôùi chi tieát caøi ñaët beân trong. • Tính ñoùng goùi ngaên chaën khaû naêng moät chöông trình trôû neân

quaù phuï thuoäc laãn nhau daãn tôùi haäu quaû moät söï thay ñoåi nhoû coù theå aûnh höôûng lôùn ñeán toaøn boä heä thoáng.

• Trong tieáp caän O.O. khaû naêng keát hôïp döõ lieäu vaø haønh vi trong

Chöông 2- Lôùp vaø ñoái töôïng 11

• Trong tieáp caän O.O. khaû naêng keát hôïp döõ lieäu vaø haønh vi trong moät thöïc theå duy nhaát giuùp cho tính ñoùng goùi roõ raøng hôn vaø hieäu quaû hôn.

Caùc khaùi nieäm höôùng ñoái töôïng Caùc khaùi nieäm höôùng ñoái töôïng

� Keát hôïp döõ lieäu vaø haønh vi:• Trong caùch tieáp caän thuû tuïc coå ñieån, heä thoáng ñöôïc xaây döïng

treân hai sô ñoà phaân caáp chaèng chòt: sô ñoà phaân caáp döõ lieäu vaø sô ñoà phaân caáp thuû tuïc, trong ñoù söï lieân heä giöõa moät loaïi döõ lieäu vaø caùc thuû tuïc xöû lyù döõ lieäu raát môø nhaït, daãn ñeán khoù khaên trong vieäc söûa chöõa, naâng caáp trong töông lai.

• Caùch tieáp caän O.O. loaïi boû nhöõng nhöôïc ñieåm keå treân baèng

Chöông 2- Lôùp vaø ñoái töôïng 12

• Caùch tieáp caän O.O. loaïi boû nhöõng nhöôïc ñieåm keå treân baèng caùch keát hôïp döõ lieäu vaø phaàn thuû tuïc xöû lyù döõ lieäu vaøo trong moät thöïc theå duy nhaát, heä thoáng trôû thaønh moät sô ñoà phaân caáp duy nhaát caùc lôùp ñoái töôïng.

Caùc khaùi nieäm höôùng ñoái töôïngCaùc khaùi nieäm höôùng ñoái töôïng

Sô ñoà phaân caáp döõ lieäu

� Keát hôïp döõ lieäu vaø haønh vi

Chöông 2- Lôùp vaø ñoái töôïng 13

Sô ñoà phaân caáp lôùp

Sô ñoà phaân caáp döõ lieäu

Sô ñoà phaân caáp thuû tuïc

Ñöôïc thay baèng

Ñoái töôïng vaø lôùpÑoái töôïng vaø lôùp

� Ta ñònh nghóa moät ñoái töôïng laø moät "caùi gì ñoù" coù yù nghóa cho vaán ñeà ta quan taâm. Ñoái töôïng phuïc vuï hai muïc ñích: Giuùp hieåu roõ theá giôùi thöïc vaø cung caáp cô sôû cho vieäc caøi ñaët trong maùy.

� Moãi ñoái töôïng coù moät neùt nhaän daïng ñeå phaân bieät noù vôùi caùc ñoái töôïng khaùc. Neùt nhaän daïng mang yù nghóa caùc ñoái töôïng ñöôïc phaân bieät vôùi nhau do söï toàn taïi voán

Chöông 2- Lôùp vaø ñoái töôïng 14

caùc ñoái töôïng ñöôïc phaân bieät vôùi nhau do söï toàn taïi voán coù cuûa chuùng chöù khoâng phaûi caùc tính chaát maø chuùng coù.

Ñoái töôïng vaø lôùpÑoái töôïng vaø lôùp

� Caùc ñoái töôïng coù caùc ñaëc tính töông töï nhau ñöôïc gom chung laïi thaønh lôùp ñoái töôïng. Ví duï Ngöôøi laø moät lôùp ñoái töôïng. Moät lôùp ñoái töôïng ñöôïc ñaëc tröng baèng caùc thuoäc tính, vaø caùc hoaït ñoäng (haønh vi).

� Moät thuoäc tính (attribute) laø moät giaù trò döõ lieäu cho moãi ñoái töôïng trong lôùp. Teân, Tuoåi, Caân naëng laø caùc thuoäc tính cuûa Ngöôøi.

Chöông 2- Lôùp vaø ñoái töôïng 15

tính cuûa Ngöôøi.� Moät thao taùc (operation) laø moät haøm hay moät pheùp bieán

ñoåi coù theå aùp duïng vaøo hay aùp duïng bôûi caùc ñoái töôïng trong lôùp.

Sô ñoà ñoái töôïngSô ñoà ñoái töôïng

� Ta duøng sô ñoà ñoái töôïng ñeå moâ taû caùc lôùp ñoái töôïng. Sô ñoà ñoái töôïng bao goàm sô ñoà lôùp vaø sô ñoà theå hieän.

� Sô ñoà lôùp moâ taû caùc lôùp ñoái töôïng trong heä thoáng, moät lôùp ñoái töôïng ñöôïc dieãn taû baèng moät hình chöõ nhaät coù 3 phaàn: phaàn ñaàu chæ teân lôùp, phaàn thöù hai moâ taû caùc thuoäc tính vaø phaàn thöù ba moâ taû caùc thao taùc cuûa caùc ñoái töôïng trong lôùp ñoù.

Chöông 2- Lôùp vaø ñoái töôïng 16

ñoái töôïng trong lôùp ñoù.

Sô ñoà lôùp vaø sô ñoà theå hieänSô ñoà lôùp vaø sô ñoà theå hieän

Sinh vieân

Hoï teânNaêm sinhMaõ soáÑieåm TB

(Sinh vieân)

Nguyeãn Vaên A19840610234T9.2

Teân lôùp

Thuoäc tính

Chöông 2- Lôùp vaø ñoái töôïng 17

Ñieåm TB

Ñi hoïcÑi thiPhaân loaïi

9.2

Thao taùc

Sô ñoà lôùp Sô ñoà theå hieän

Ñoái töôïng vaø lôùpÑoái töôïng vaø lôùp� Cuøng moät thao taùc coù theå ñöôïc aùp duïng cho nhieàu lôùp

ñoái töôïng khaùc nhau, moät thao taùc nhö vaäy ñöôïc goïi laø coù tính ña daïng (polymorphism).

� Moãi thao taùc treân moãi lôùp ñoái töôïng cuï theå töông öùng vôùi moät caøi ñaët cuï theå khaùc nhau. Moät caøi ñaët nhö vaäy ñöôïc goïi laø moät phöông thöùc (method).

� Moät ñoái töôïng cuï theå thuoäc moät lôùp ñöôïc goïi laø moät theå hieän (instance) cuûa lôùp ñoù. Joe Smith, 25 tuoåi, naëng

Chöông 2- Lôùp vaø ñoái töôïng 18

� Moät ñoái töôïng cuï theå thuoäc moät lôùp ñöôïc goïi laø moät theå hieän (instance) cuûa lôùp ñoù. Joe Smith, 25 tuoåi, naëng 58kg, laø moät theå hieän cuûa lôùp ngöôøi.

Caøi ñaët lôùp trong C++Caøi ñaët lôùp trong C++

� Lôùp trong C++ laø caøi ñaët cuûa kieåu döõ lieäu tröøu töôïng do ngöôøi söû duïng ñònh nghóa, cho pheùp keát hôïp döõ lieäu, caùc pheùp toaùn, caùc haøm lieân quan ñeå taïo ra moät ñôn vò chöông trình duy nhaát. Caùc lôùp naøy coù ñaày ñuû öu ñieåm vaø tieän lôïi nhö caùc kieåu döõ lieäu noäi taïi. Lôùp taùch rôøi phaàn giao dieän (chæ lieân quan vôùi ngöôøi söû duïng) vaø phaàn caøi ñaët lôùp.

Chöông 2- Lôùp vaø ñoái töôïng 19

ñaët lôùp.� Lôùp trong C++ ñöôïc caøi ñaët söû duïng töø khoaù struct vaø

class.

Ví duï so saùnh: Xaây döïng kieåu döõ lieäu stack.Ví duï so saùnh: Xaây döïng kieåu döõ lieäu stack.

1. Caùch tieáp caän coå ñieån:// Stack1.cpp :

//Dung cau truc va ham toan cuc

#include <iostream.h>

typedef int bool;

typedef int Item;

const bool false = 0, true = 1;

Chöông 2- Lôùp vaø ñoái töôïng 20

const bool false = 0, true = 1;

struct Stack

{

Item *st, *top;

int size;

};

Ví duï so saùnh (tt)Ví duï so saùnh (tt)

void StackInit(Stack *ps, int sz)

{

ps->st = ps->top = new Item[ps->size=sz];

}

void StackCleanUp(Stack *ps)

{

delete [] ps->st;

Chöông 2- Lôùp vaø ñoái töôïng 21

delete [] ps->st;

}

bool StackFull(Stack *ps)

{

return (ps->top - ps->st >= ps->size);

}

Ví duï so saùnh (tt)Ví duï so saùnh (tt)

bool StackEmpty(Stack *ps)

{

return (ps->top <= ps->st);

}

bool StackPush(Stack *ps, Item x)

{

Chöông 2- Lôùp vaø ñoái töôïng 22

{

if (StackFull(ps)) return false;

*ps->top++ = x;

return true;

}

Ví duï so saùnh (tt)Ví duï so saùnh (tt)

bool StackPop(Stack *ps, Item *px)

{

if (StackEmpty(ps)) return false;

*px = *--ps->top;

return true;

}

Chöông 2- Lôùp vaø ñoái töôïng 23

Ví duï so saùnh (tt)Ví duï so saùnh (tt)void XuatHe16(long n)

{

static char hTab[] = “0123456789ABCDEF”;

Stack s;

StackInit(&s,8);

int x;

do {

StackPush(&s, n%16);

Chöông 2- Lôùp vaø ñoái töôïng 24

StackPush(&s, n%16);

n /= 16;

} while(n);

while(StackPop(&s,&x))

cout << hTab[x];

StackCleanUp(&s);

}

Ví duï so saùnh (tt)Ví duï so saùnh (tt)

Nhaän xeùt:

� Giaûi quyeát ñöôïc vaán ñeà.� Khai baùo caáu truùc döõ lieäu naèm rieâng, caùc haøm xöû lyù döõ

lieäu naèm rieâng ôû moät nôi khaùc. Do ñoù khoù theo doõi quaûn lyù khi heä thoáng lôùn. Vì vaäy khoù baûo trì.

� Moïi thao taùc ñeàu coù tham soá ñaàu tieân laø con troû ñeán ñoái töôïng caàn thao taùc. Tö töôûng theå hieän ôû ñaây laø haøm hay

Chöông 2- Lôùp vaø ñoái töôïng 25

� Moïi thao taùc ñeàu coù tham soá ñaàu tieân laø con troû ñeán ñoái töôïng caàn thao taùc. Tö töôûng theå hieän ôû ñaây laø haøm hay thuû tuïc ñoùng vai troø troïng taâm. Ñoái töôïng ñöôïc gôûi ñeán cho haøm xöû lyù.

� Trình töï söû duïng qua caùc böôùc: Khôûi ñoäng, söû duïng thöïc söï, doïn deïp.

Ví duï so saùnh (tt)Ví duï so saùnh (tt)2. Caùch tieáp caän duøng haøm thaønh phaàn:

//...

struct Stack

{

Item *st, *top;

int size;

void Init(int sz) {st = top = new

Item[size=sz];}

Chöông 2- Lôùp vaø ñoái töôïng 26

Item[size=sz];}

void CleanUp() {if (st) delete [] st;}

bool Full() const {return (top - st >=

size);}

bool Empty() const {return (top <= st);}

bool Push(Item x);

bool Pop(Item *px);

};

Ví duï so saùnh (tt)Ví duï so saùnh (tt)bool Stack::Push(Item x)

{

if (Full()) return false;

*top++ = x;

return true;

}

Chöông 2- Lôùp vaø ñoái töôïng 27

bool Stack::Pop(Item *px)

{

if (Empty()) return false;

*px = *--top;

return true;

}

Ví duï so saùnh (tt)Ví duï so saùnh (tt)void XuatHe16(long n)

{

static char hTab[] = “0123456789ABCDEF”;

Stack s;

s.Init(8);

int x;

do {

Chöông 2- Lôùp vaø ñoái töôïng 28

s.Push(n%16);

n /= 16;

} while(n);

while(s.Pop(&x))

cout << hTab[x];

s.CleanUp();

}

Ví duï so saùnh (tt)Ví duï so saùnh (tt)Nhaän xeùt:

� Giaûi quyeát ñöôïc vaán ñeà.� Döõ lieäu vaø caùc haøm xöû lyù döõ lieäu ñöôïc gom vaøo moät choã

beân trong caáu truùc. Do ñoù deã theo doõi quaûn lyù, deã baûo trì naâng caáp.

� Caùc thao taùc ñeàu bôùt ñi moät tham soá so vôùi caùch tieáp caän coå ñieån. Vì vaäy vieäc laäp trình goïn hôn. Tö töôûng theå hieän

Chöông 2- Lôùp vaø ñoái töôïng 29

coå ñieån. Vì vaäy vieäc laäp trình goïn hôn. Tö töôûng theå hieän ôû ñaây laø ñoái töôïng ñoùng vai troø troïng taâm. Ñoái töôïng thöïc hieän thao taùc treân chính noù.

� Trình töï söû duïng qua caùc böôùc: Khôûi ñoäng, söû duïng thöïc söï, doïn deïp.

Caùc haøm thaønh phaàn.Caùc haøm thaønh phaàn.� Laø haøm ñöôïc khai baùo trong lôùp. Haøm thaønh phaàn coù theå

ñöôïc ñònh nghóa beân trong hoaëc beân ngoaøi lôùp.� Haøm thaønh phaàn coù nghi thöùc giao tieáp gioáng vôùi caùc

haøm bình thöôøng khaùc: coù teân, danh saùch tham soá, giaù trò traû veà.

� Goïi haøm thaønh phaàn baèng pheùp toaùn daáu chaám (.) hoaëc daáu muõi teân (->).

Chöông 2- Lôùp vaø ñoái töôïng 30

daáu muõi teân (->).Stack s, *ps = &s;

s.Init(10);

for (int i = 0; i < 20; i++)

ps->Push(i);

Lôùp Lôùp � Trong caùch tieáp caän duøng struct vaø haøm thaønh phaàn,

ngöôøi söû duïng coù toaøn quyeân truy xuaát, thay ñoåi caùc thaønh phaàn döõ lieäu cuûa ñoái töôïng thuoäc caáu truùc. Ví duï:Stack s;

s.Init(10);

s.size = 100; // Nguy hiem

for (int i = 0; i < 20; i++)

Chöông 2- Lôùp vaø ñoái töôïng 31

for (int i = 0; i < 20; i++)

s.Push(i);

� Vì vaäy, ta khoâng coù söï an toaøn döõ lieäu. Lôùp laø moät phöông tieän ñeå khaéc phuïc nhöôïc ñieåm treân.

� Lôùp coù ñöôïc baèng caùch thay töø khoaù struct baèng töø khoaù class.

LôùpLôùp� Trong lôùp moïi thaønh phaàn maëc nhieân ñeàu laø rieâng tö

(private) nghóa laø theá giôùi beân ngoaøi khoâng ñöôïc pheùp truy xuaát. Do ñoù coù söï an toaøn döõ lieäu.class Stack

{

Item *st, *top;

int size;

Chöông 2- Lôùp vaø ñoái töôïng 32

int size;

void Init(int sz) {st = top = new

Item[size=sz];}

void CleanUp() {if (st) delete [] st;}

bool Full() const {return (top - st >= size);}

bool Empty() const {return (top <= st);}

bool Push(Item x);

bool Pop(Item *px);

};

LôùpLôùp� Phaùt bieåu:

s.size = 100; // Bao sai

Seõ bò baùo sai luùc bieân dòch, nhôø ñoù traùnh ñöôïc nhöõng loãi luùc chaïy chöông trình (run-time error) raát khoù tìm khi thöïc hieän chöông trình.

Chöông 2- Lôùp vaø ñoái töôïng 33

Thuoäc tính truy xuaát Thuoäc tính truy xuaát � Tuy nhieân lôùp nhö treân trôû thaønh voâ duïng vì caùc haøm

thaønh phaàn cuõng trôû thaønh private vaø khoâng ai duøng ñöôïc. Ñieàu ñoù ñöôïc khaéc phuïc nhôø thuoäc tính truy xuaát.

� Thuoäc tính truy xuaát cuûa moät thaønh phaàn cuûa lôùp chæ roõ phaàn chöông trình ñöôïc pheùp truy xuaát ñeán noù.

• Thuoäc tính private• Thuoäc tính public

Chöông 2- Lôùp vaø ñoái töôïng 34

• Thuoäc tính public

Thuoäc tính truy xuaát Thuoäc tính truy xuaát � Caùc thaønh phaàn laø noäi boä cuûa lôùp, bao goàm döõ lieäu vaø

caùc haøm phuïc vuï noäi boä ñöôïc ñaët trong phaàn private. Caùc haøm nhaèm muïc ñích cho ngöôøi söû duïng duøng ñöôïc ñaët trong phaàn public.

� Ví duï sau minh hoaï thuoäc tính truy xuaát.

Chöông 2- Lôùp vaø ñoái töôïng 35

// Stack.h

class Stack

{

Item *st, *top;

int size;

void Init(int sz) {st = top = new Item[size=sz];}

void CleanUp() {delete [] st;}

public:

Stack(int sz = 20) {Init(sz);}

Chöông 2- Lôùp vaø ñoái töôïng 36

Stack(int sz = 20) {Init(sz);}

~Stack() {delete [] st;}

bool Full() const {return (top - st >= size);}

bool Empty() const {return (top <= st);}

bool Push(Item x);

bool Pop(Item *px);

};

Ví duï veà lôùp vaø thuoäc tính truy xuaátVí duï veà lôùp vaø thuoäc tính truy xuaát

// Stack.cpp

#include "stack.h"

bool Stack::Push(Item x)

{

if (Full()) return false;

*top++ = x;

return true;

}

Chöông 2- Lôùp vaø ñoái töôïng 37

}

bool Stack::Pop(Item *px)

{

if (Empty()) return false;

*px = *--top;

return true;

}

Ví duï veà lôùp vaø thuoäc tính truy xuaátVí duï veà lôùp vaø thuoäc tính truy xuaát

// he16.cpp

#include "stack.h"

void XuatHe16(long n)

{

static char hTab[] = “0123456789ABCDEF”;

Stack s(8); int x;

do {

Chöông 2- Lôùp vaø ñoái töôïng 38

do {

s.Push(n%16);

n /= 16;

} while(n);

while(s.Pop(&x))

cout << hTab[x];

}

Söû duïng phaïm vi truy xuaátSöû duïng phaïm vi truy xuaát

� Phaïm vi truy xuaát ñöôïc söû duïng ñuùng seõ cho pheùp ta keát luaän: Nhìn vaøo lôùp thaáy ñöôïc moïi thao taùc treân lôùp.

� Ngöôøi duøng bình thöôøng coù theå khai thaùc heát caùc chöùc naêng (public) cuûa lôùp.

� Ngöôøi duøng cao caáp coù theå thay ñoåi chi tieát caøi ñaët, caûi tieán giaûi thuaät caùc haøm thaønh phaàn.

Chöông 2- Lôùp vaø ñoái töôïng 39

Töï tham chieáu Töï tham chieáu � Laø tham soá ngaàm ñònh cuûa haøm thaønh phaàn troû ñeán ñoái

töôïng. Nhôø ñoù haøm thaønh phaàn bieát ñöôïc noù ñang thao taùc treân ñoái töôïng naøo.

� Khi moät ñoái töôïng goïi moät thao taùc, ñòa chæ cuûa ñoái töôïng ñöôïc gôûi ñi moät caùch ngaàm ñònh vôùi teân this, teân caùc thaønh phaàn cuûa ñoái töôïng ñöôïc hieåu laø cuûa ñoái töôïng coù ñòa chæ this naøy.

Chöông 2- Lôùp vaø ñoái töôïng 40

ñòa chæ this naøy.bool Stack::Push(Item x)

{

if (Full()) // if (this->Full())

return false;

*top++ = x; // this->top++ = x;

return true;

}

Phöông thöùc thieát laäp vaø huûy boû. Phöông thöùc thieát laäp vaø huûy boû. � Phöông thöùc thieát laäp vaø huyû boû ñöôïc xaây döïng nhaèm

muïc ñích khaéc phuïc loãi queân khôûi ñoäng ñoái töôïng hoaëc khôûi ñoäng dö. Vieäc queân khôûi ñoäng ñoái töôïng thöôøng gaây ra nhöõng loãi raát khoù tìm.

� Phöông thöùc thieát laäp laø haøm thaønh phaàn ñaëc bieät ñöôïc töï ñoäng goïi ñeán moãi khi moät ñoái töôïng thuoäc lôùp ñöôïc taïo ra. Ngöôøi ta thöôøng lôïi duïng ñaëc tính treân ñeå khôûi

Chöông 2- Lôùp vaø ñoái töôïng 41

taïo ra. Ngöôøi ta thöôøng lôïi duïng ñaëc tính treân ñeå khôûi ñoäng ñoái töôïng.

� Phöông thöùc thieát laäp coù teân truøng vôùi teân lôùp ñeå phaân bieät noù vôùi caùc haøm thaønh phaàn khaùc.

Phöông thöùc thieát laäp vaø huûy boû. Phöông thöùc thieát laäp vaø huûy boû. � Coù theå coù nhieàu phieân baûn khaùc nhau cuûa phöông thöùc

thieát laäp� Phöông thöùc huyû boû laø haøm thaønh phaàn ñaëc bieät ñöôïc töï

ñoäng goïi ñeán moãi khi moät ñoái töôïng bò huyû ñi. Ngöôøi ta thöôøng lôïi duïng ñaëc tính treân ñeå doïn deïp ñoái töôïng.

� Phöông thöùc huyû boû baét ñaàu baèng daáu ngaõ (~) theo sau bôûi teân lôùp ñeå phaân bieät noù vôùi caùc haøm thaønh phaàn

Chöông 2- Lôùp vaø ñoái töôïng 42

bôûi teân lôùp ñeå phaân bieät noù vôùi caùc haøm thaønh phaàn khaùc.

� Chæ coù theå coù toái ña moät phöông thöùc hb.

Phöông thöùc thieát laäp vaø huûy boû. Phöông thöùc thieát laäp vaø huûy boû. typedef int Item;

class Stack

{

Item *st, *top;

int size;

void Init(int sz);

void CleanUp() {delete [] st;}

public:

Stack(int sz = 20) {Init(sz);}

Chöông 2- Lôùp vaø ñoái töôïng 43

Stack(int sz = 20) {Init(sz);}

~Stack() {CleanUp();}

bool Full() const {return (top - st >= size);}

bool Empty() const {return (top <= st);}

bool Push(Item x);

bool Pop(Item *px);

};

Haøm baïn (friends) Haøm baïn (friends) � Nguyeân taéc chung khi thao taùc treân lôùp laø thoâng qua caùc

haøm thaønh phaàn. Tuy nhieân coù nhöõng tröôøng hôïp ngoaïi leä, khi haøm phaûi thao taùc treân hai lôùp.

� Haøm baïn cuûa moät lôùp laø haøm ñöôïc khai baùo ôû beân ngoaøi nhöng ñöôïc pheùp truy xuaát caùc thaønh phaàn rieâng tö cuûa lôùp.

� Ta laøm moät haøm trôû thaønh haøm baïn cuûa lôùp baèng caùch

Chöông 2- Lôùp vaø ñoái töôïng 44

� Ta laøm moät haøm trôû thaønh haøm baïn cuûa lôùp baèng caùch ñöa khai baùo cuûa haøm ñoù vaøo trong lôùp, theâm töø khoaù friend ôû ñaàu.

� Ta duøng haøm baïn trong tröôøng hôïp haøm phaûi laø haøm toaøn cuïc nhöng coù lieân quan maät thieát vôùi lôùp, hoaëc laø haøm thaønh phaàn cuûa moät lôùp khaùc.

Haøm thaønh phaàn haèngHaøm thaønh phaàn haèng

� Haøm thaønh phaàn haèng laø haøm thaønh phaàn coù theå aùp duïng ñöôïc cho caùc ñoái töôïng haèng.

� Ta qui ñònh moät haøm thaønh phaàn laø haèng baèng caùch theâm töø khoaù const vaøo cuoái khai baùo cuûa noù.

� Ta khai baùo haøm thaønh phaàn laø haèng khi noù khoâng thay ñoåi caùc thaønh phaàn döõ lieäu cuûa ñoái töôïng.

Chöông 2- Lôùp vaø ñoái töôïng 45

ñoåi caùc thaønh phaàn döõ lieäu cuûa ñoái töôïng.

Haøm thaønh phaàn haèngHaøm thaønh phaàn haènginline char *strdup(const char *s)

{

return strcpy(new char[strlen(s) + 1], s);

}

class string

{

char *p;

Chöông 2- Lôùp vaø ñoái töôïng 46

public:

string(char *s = "") {p = strdup(s);}

~string() {delete [] p;}

string(const string &s2) {p = strdup(s2.p);}

void Output() const {cout << p;}

void ToLower() {strlwr(p);}

};

Haøm thaønh phaàn haèngHaøm thaønh phaàn haèngvoid main()

{

const string Truong("DH BC TDT");

string s("ABCdef");

s.Output();

s.ToLower();

s.Output();

Chöông 2- Lôùp vaø ñoái töôïng 47

s.Output();

Truong.Output();

Truong.ToLower(); // Bao loi

}

Thaønh phaàn tónh (static members) Thaønh phaàn tónh (static members) � Thaønh phaàn döõ lieäu tónh laø thaønh phaàn döõ lieäu duøng

chung cho moïi ñoái töôïng thuoäc lôùp.� Haøm thaønh phaàn tónh laø haøm thaønh phaàn coù theå hoaït

ñoäng khoâng caàn döõ lieäu cuûa ñoái töôïng, noùi caùch khaùc, noù khoâng caàn ñoái töôïng.

� Ta duøng haøm thaønh phaàn tónh thay vì haøm toaøn cuïc vì noù coù lieân quan maät thieát vôùi lôùp.

Chöông 2- Lôùp vaø ñoái töôïng 48

noù coù lieân quan maät thieát vôùi lôùp.� Ta coøn duøng haøm thaønh phaàn tónh ñeå taïo ñoái töôïng coù

giaù trò traû veà cho bieát vieäc taïo ñoái töôïng coù thaønh coâng theo nghóa luaän lyù hay khoâng.

Ví duï veà thaønh phaàn tónh: CDateVí duï veà thaønh phaàn tónh: CDatetypedef int bool;

const bool false = 0, true = 1;

class CDate

{

static int dayTab[][13];

int day, month, year;

public:

Chöông 2- Lôùp vaø ñoái töôïng 49

public:

static bool LeapYear(int y) {return y%400

== 0 || y%4==0 && y%100 != 0;}

static int DayOfMonth(int m, int y);

static bool ValidDate(int d, int m, int y);

void Input();

};

Ví duï veà thaønh phaàn tónh : CDateVí duï veà thaønh phaàn tónh : CDateint CDate::dayTab[][13] =

{

{0,31,28,31,30,31,30,31,31,30,31,30,31},

{0,31,29,31,30,31,30,31,31,30,31,30,31}

};

int CDate::DayOfMonth(int m, int y)

{

return dayTab[LeapYear(y)][m];

Chöông 2- Lôùp vaø ñoái töôïng 50

return dayTab[LeapYear(y)][m];

}

bool betw(int x, int a, int b)

{

return x >= a && x <= b;

}

Ví duï veà thaønh phaàn tónh : CDateVí duï veà thaønh phaàn tónh : CDatebool CDate::ValidDate(int d, int m, int y)

{

return betw(m,1,12) &&

betw(d,1,DayOfMonth(m,y));

}

void CDate::Input()

{

int d,m,y;

Chöông 2- Lôùp vaø ñoái töôïng 51

int d,m,y;

cin >> d >> m >> y;

while (!ValidDate(d,m,y))

{

cout << "Please enter a valid date: ";

cin >> d >> m >> y;

}

day = d; month = m; year = y;

}

2.3 Thieát laäp vaø huyû boû ñoái töôïng2.3 Thieát laäp vaø huyû boû ñoái töôïngTa caàn kieåm soaùt khi naøo phöông thöùc thieát laäp ñöôïc goïi, khi naøo phöông thöùc huyû boû ñöôïc goïi.

• Khi naøo ñoái töôïng thieát laäp ñöôïc goïi? Khi ñoái töôïng ñöôïc taïo ra.

• Khi naøo phöông thöùc huyû boû ñöôïc goïi? Khi ñoái töôïng bò huyû ñi.

Thôøi gian töø khi ñoái töôïng ñöôïc taïo ra ñeán khi noù bò huyû

Chöông 2- Lôùp vaø ñoái töôïng 52

• Thôøi gian töø khi ñoái töôïng ñöôïc taïo ra ñeán khi noù bò huyû ñi ñöôïc goïi laø thôøi gian soáng.

� Vaäy vaán ñeà xaùc ñònh khi naøo phöông thöùc thieát laäp vaø huyû boû ñöôïc goïi trôû thaønh:Khi naøo ñoái töôïng ñöôïc taïo ra ?Khi naøo ñoái töôïng bò huyû ñi ?

Thieát laäp vaø huyû boû ñoái töôïngThieát laäp vaø huyû boû ñoái töôïng� Thôøi gian soáng cuûa ñoái töôïng khaùc nhau tuyø thuoäc ñoái

töôïng ñoù thuoäc lôùp löu tröõ (storage class) naøo. Trong C++ coù caùc lôùp löu tröõ sau:autoglobalstaticfree stored

Chöông 2- Lôùp vaø ñoái töôïng 53

free stored

� Ta seõ laàn löôït xeùt caùc loaïi sau:Ñoái töôïng töï ñoängÑoái töôïng toaøn cuïcÑoái töôïng tónhÑoái töôïng ñöôïc caáp phaùt ñoängÑoái töôïng thaønh phaàn

Ñoái töôïng töï ñoängÑoái töôïng töï ñoäng� Ñoái töôïng töï ñoäng (automatic objects) laø ñoái töôïng ñöôïc

töï ñoäng sinh ra vaø töï ñoäng bò huyû ñi.� Ñoái töôïng ñòa phöông

• Laø caùc bieán ñöôïc khai baùo, ñònh nghóa beân trong moät khoái• Noù ñöôïc töï ñoäng sinh ra khi chöông trình thöïc hieän ngang doøng

leänh chöùa ñònh nghóa vaø bò huyû ñi sau khi chöông trình hoaøn taát khoái chöùa ñònh nghóa ñoù.

Chöông 2- Lôùp vaø ñoái töôïng 54

khoái chöùa ñònh nghóa ñoù.

� Khi khôûi ñoäng moät ñoái töôïng baèng moät ñoái töôïng cuøng kieåu, cô cheá taïo ñoái töôïng maëc nhieân laø sao cheùp töøng bit, do ñoù ñoái töôïng ñöôïc khôûi ñoäng seõ chia seû taøi nguyeân vôùi ñoái töôïng nguoàn.

Ñoái töôïng laø bieán ñòa phöôngÑoái töôïng laø bieán ñòa phöông#include <iostream.h>

#include <string.h>

char *strdup(const char *s)

{

return strcpy(new char[strlen(s) + 1], s);

}

class string

Chöông 2- Lôùp vaø ñoái töôïng 55

class string

{

char *p;

public:

string(char *s = "") {p = strdup(s);}

~string() {cout << "delete "<< (void *)p <<

"\n"; delete [] p;}

void Output() const {cout << p;}

};

void main()

{

string a("Nguyen Van A");

string b = a; // String b(a)

a.Output(); cout << "\n";

b.Output(); cout << "\n";

}

Chöông 2- Lôùp vaø ñoái töôïng 56

� Xuaát lieäu khi thöïc hieän ñoaïn chöông trình treân:Nguyen Van A

Nguyen Van A

delete 0x0f06

delete 0x0f06

� Ñoái töôïng b coù noäi dung vaät lyù gioáng vôùi a, nghóa laø duøng chung phaàn taøi nguyeân (con troû ñeán chuoãi “Nguyen Van A”). Khi keát thuùc haøm main() hai ñoái töôïng naøy bò huyû,

Chöông 2- Lôùp vaø ñoái töôïng 57

A”). Khi keát thuùc haøm main() hai ñoái töôïng naøy bò huyû, phaàn taøi nguyeân chung bò huyû 2 laàn (SAI).

Ñoái töôïng laø tham soá truyeàn baèng giaù tròÑoái töôïng laø tham soá truyeàn baèng giaù trò

� Ñoái töôïng laø tham soá haøm, truyeàn baèng giaù trò thì tham soá hình thöùc laø baûn sao cuûa tham soá thöïc söï, neân coù noäi dung vaät lyù gioáng tham soá thöïc söï do cô cheá sao cheùp töøng bit. extern char *strdup(const char *s);

class String

{

char *p;

Chöông 2- Lôùp vaø ñoái töôïng 58

char *p;

public:

String(char *s = "") {p = strdup(s);}

~String() {cout << "delete "<< (void *)p <<

"\n"; delete [] p;}

void Output() const {cout << p;}

bool Compare(String s) const;

};

Ñoái töôïng laø tham soá truyeàn baèng giaù tròÑoái töôïng laø tham soá truyeàn baèng giaù tròbool String::Compare(String s) const

{

return strcmp(p,s.p);

}

void main()

{

Chöông 2- Lôùp vaø ñoái töôïng 59

String a("Nguyen Van A");

String b("Le Van Beo");

int c = a.Compare(b);

cout << (c > 0 ? "a > b" : c == 0 ? "a =

b" : "a < b") << "\n";

}

Ñoái töôïng laø tham soá truyeàn baèng giaù tròÑoái töôïng laø tham soá truyeàn baèng giaù trò

� Khi thöïc hieän ñoaïn chöông trình treân, ta ñöôïc xuaát lieäu (coù theå thay ñoåi ôû nhöõng laàn thöïc hieän khaùc nhau hoaëc ôû maùy khaùc):delete 0x0f34

a > b

delete 0x0f34

delete 0x0f22

Chöông 2- Lôùp vaø ñoái töôïng 60

delete 0x0f22

Ñoái töôïng laø giaù trò traû veàÑoái töôïng laø giaù trò traû veàextern char *strdup(const char *s);

class String

{

char *p;

public:

String(char *s = "") {p = strdup(s);}

~String() {cout << "delete "<< (void *)p << "\n";

delete [] p;}

Chöông 2- Lôùp vaø ñoái töôïng 61

delete [] p;}

void Output() const {cout << p;}

bool Compare(String s) const;

String UpCase() const;

};

Ñoái töôïng laø giaù trò traû veàÑoái töôïng laø giaù trò traû veàString String::UpCase() const

{

String r = *this;

strupr(r.p);

return r;

}

void main()

{

Chöông 2- Lôùp vaø ñoái töôïng 62

{

clrscr();

String a("Nguyen Van A");

cout << "a = "; a.Output(); cout << "\n";

String A;

A = a.UpCase();

cout << "a = "; a.Output(); cout << "\n";

cout << "A = "; a.Output(); cout << "\n";

}

Ñoái töôïng laø giaù trò traû veàÑoái töôïng laø giaù trò traû veà

� Khi thöïc hieän ñoaïn chöông trình treân, ta ñöôïc xuaât lieäua = Nguyen Van A

delete 0x0f36

delete 0x0f36

a = 2¤2¤EN VAN A

A = 2¤2¤EN VAN A

delete 0x0f36

Chöông 2- Lôùp vaø ñoái töôïng 63

delete 0x0f36

Null pointer assignment

Ñoái töôïng giaù trò traû veà laø baûn sao cuûa bieåu thöùc traû veà. Do ñoù coù söï chia seû taøi nguyeân (SAI).

Ñoái töôïng laø giaù trò traû veàÑoái töôïng laø giaù trò traû veà

Caùc loãi sai gaây ra ôû ñoaïn chöông trình treân do sao cheùp ñoái töôïng (phaùt bieåu String r = *this), ñoái töôïng giaù trò traû veà vaø pheùp gaùn (A = a.Upcase).

� Ta coù theå khaéc phuïc loãi gaây ra do pheùp gaùn baèng caùch thay hai phaùt bieåu khai baùo A vaø gaùn baèng phaùt bieåu khôûi ñoäng:

String A = a.UpCase();

Chöông 2- Lôùp vaø ñoái töôïng 64

String A = a.UpCase();

Ñoái töôïng laø giaù trò traû veàÑoái töôïng laø giaù trò traû veàvoid main()

{

clrscr();

String a("Nguyen Van A");

cout << "a = "; a.Output(); cout << "\n";

String A = a.UpCase();

cout << "a = "; a.Output(); cout << "\n";

cout << "A = "; a.Output(); cout << "\n";

}

Chöông 2- Lôùp vaø ñoái töôïng 65

}

Ñoái töôïng laø giaù trò traû veàÑoái töôïng laø giaù trò traû veà� Xuaát lieäu trong tröôøng hôïp naøy laø

a = Nguyen Van A

delete 0x0d32

a = NGUYEN VAN A

A = NGUYEN VAN A

delete 0x0d32

delete 0x0d32

Chöông 2- Lôùp vaø ñoái töôïng 66

delete 0x0d32

Null pointer assignment

Phöông thöùc thieát laäp sao cheùpPhöông thöùc thieát laäp sao cheùp� Caùc loãi sai neâu treân gaây ra do sao cheùp ñoái töôïng, ta coù

theå khaéc phuïc baèng caùch “daïy” trình bieân dòch sao cheùp ñoái töôïng moät caùch luaän lyù thay vì sao cheùp töøng bit theo nghóa vaät lyù. Ñieàu ñoù ñöôïc thöïc hieän nhôø phöông thöùc thieát laäp sao cheùp.

� Phöông thöùc thieát laäp sao cheùp laø phöông thöùc thieát laäp coù tham soá laø ñoái töôïng cuøng kieåu, duøng ñeå sao cheùp ñoái

Chöông 2- Lôùp vaø ñoái töôïng 67

coù tham soá laø ñoái töôïng cuøng kieåu, duøng ñeå sao cheùp ñoái töôïng.

Phöông thöùc thieát laäp sao cheùpPhöông thöùc thieát laäp sao cheùp� Phöông thöùc thieát laäp sao cheùp thöïc hieän sao cheùp theo

nghóa logic, thoâng thöôøng laø taïo neân taøi nguyeân môùi (sao cheùp saâu).

� Phöông thöùc thieát laäp sao cheùp cuõng coù theå chia seû taøi nguyeân cho caùc ñoái töôïng (sao cheùp noâng). Trong tröôøng hôïp naøy, caàn coù cô cheá ñeå kieåm soaùt söû huyû boû ñoái töôïng.

Chöông 2- Lôùp vaø ñoái töôïng 68

töôïng.

Phöông thöùc thieát laäp sao cheùpPhöông thöùc thieát laäp sao cheùpextern char *strdup(const char *s);

class String

{

char *p;

public:

String(char *s = "") {p = strdup(s);}

String(const String &s) {p =

strdup(s.p);}

Chöông 2- Lôùp vaø ñoái töôïng 69

strdup(s.p);}

~String() {cout << "delete "<< (void *)p

<< "\n"; delete [] p;}

void Output() const {cout << p;}

bool Compare(String s) const;

String UpCase() const;

};

Phöông thöùc thieát laäp sao cheùpPhöông thöùc thieát laäp sao cheùpbool String::Compare(String s) const

{

return strcmp(p,s.p);

}

String String::UpCase() const

{

String r = *this;

Chöông 2- Lôùp vaø ñoái töôïng 70

String r = *this;

strupr(r.p);

return r;

}

Phöông thöùc thieát laäp sao cheùpPhöông thöùc thieát laäp sao cheùpvoid main()

{

clrscr();

String a("Nguyen Van A");

String b("Le Van Beo");

String aa = a;

int c = a.Compare(b);

Chöông 2- Lôùp vaø ñoái töôïng 71

cout << (c > 0 ? "a > b" : c == 0 ? "a =

b" : "a < b") << "\n";

cout << "a = "; a.Output(); cout << "\n";

String A = a.UpCase();

cout << "a = "; a.Output(); cout << "\n";

cout << "A = "; A.Output(); cout << "\n";

}

Phöông thöùc thieát laäp sao cheùpPhöông thöùc thieát laäp sao cheùp� Xuaát lieäu trong tröôøng hôïp treân nhö sau:

delete 0x0d84

a > b

a = Nguyen Van A

delete 0x0d84

a = Nguyen Van A

A = NGUYEN VAN A

Chöông 2- Lôùp vaø ñoái töôïng 72

A = NGUYEN VAN A

delete 0x0d96

delete 0x0d72

delete 0x0d62

delete 0x0d50

� Moãi ñoái töôïng ñeàu coù taøi nguyeân rieâng neân khoâng xaûy tröôøng hôïp moät vuøng taøi nguyeân bò giaûi phoùng nhieàu laàn.

Phöông thöùc thieát laäp sao cheùpPhöông thöùc thieát laäp sao cheùp� Tham soá cuûa phöông thöùc thieát laäp sao cheùp baét buoäc laø

tham chieáu.� Phöông thöùc thieát laäp sao cheùp coù theå ñöôïc duøng ñeå sao

cheùp noâng, taøi nguyeân vaãn ñöôïc chia seû nhöng coù moät bieán ñeám ñeå kieåm soaùt.

Löu yù:Neáu ñoái töôïng khoâng coù taøi nguyeân rieâng thì khoâng caàn

Chöông 2- Lôùp vaø ñoái töôïng 73

� Neáu ñoái töôïng khoâng coù taøi nguyeân rieâng thì khoâng caàn phöông thöùc thieát laäp sao cheùp.

� Khi truyeàn tham soá laø ñoái töôïng thuoäc lôùp coù phöông thöùc thieát laäp sao cheùp, ta neân truyeàn baèng tham chieáu vaø coù theâm töø khoaù const.

Sao cheùp noâng vaø sao cheùp saâuSao cheùp noâng vaø sao cheùp saâu� Duøng phöông thöùc thieát laäp sao cheùp nhö treân, trong ñoù

ñoái töôïng môùi coù taøi nguyeân rieâng laø sao cheùp saâu.� Ta coù theå sao cheùp noâng baèng caùch chia seû taøi nguyeân

vaø duøng moät bieán ñeám ñeå kieåm soaùt soá theå hieän caùc ñoái töôïng coù chia seû cuøng taøi nguyeân.

� Khi moät ñoái töôïng thay ñoåi noäi dung, noù phaûi ñöôïc taùch ra khoûi caùc ñoái töôïng duøng chung taøi nguyeân, noùi caùch

Chöông 2- Lôùp vaø ñoái töôïng 74

ra khoûi caùc ñoái töôïng duøng chung taøi nguyeân, noùi caùch khaùc, noù phaûi coù taøi nguyeân rieâng (nhö sao cheùp saâu).

Ví duï veà sao cheùp noângVí duï veà sao cheùp noâng

extern char *strdup(const char *s);

class StringRep

{

friend class String;

char *p;

int n;

StringRep(const char *s) {p = strdup(s); n = 1;}

~StringRep() {cout << "delete ” << (void *)p <<

Chöông 2- Lôùp vaø ñoái töôïng 75

~StringRep() {cout << "delete ” << (void *)p <<

"\n";}

};

Ví duï veà sao cheùp noângVí duï veà sao cheùp noâng

class String

{

StringRep *rep;

public:

String(const char *s = "") {rep = new

StringRep(s);}

String(const String &s) {rep = s.rep;

rep->n++;}

Chöông 2- Lôùp vaø ñoái töôïng 76

rep->n++;}

~String();

void Output() const {cout << rep->p;}

bool Compare(String s) const;

String UpCase() const;

void ToUpper();

};

Ví duï veà sao cheùp noângVí duï veà sao cheùp noângString::~String()

{

if (--rep->n <= 0)

delete rep;

}

bool String::Compare(String s) const

{

return strcmp(rep->p,s.rep->p);

Chöông 2- Lôùp vaø ñoái töôïng 77

return strcmp(rep->p,s.rep->p);

}

String String::UpCase() const

{

String r(rep->p);

strupr(r.rep->p);

return r;

}

Ví duï veà sao cheùp noângVí duï veà sao cheùp noângvoid main()

{

clrscr();

String a("Nguyen Van A");

String b("Le Van Beo");

String aa = a;

int c = a.Compare(b);

cout << (c > 0 ? "a > b" : c == 0 ? "a = b" : "a

Chöông 2- Lôùp vaø ñoái töôïng 78

cout << (c > 0 ? "a > b" : c == 0 ? "a = b" : "a

< b") << "\n";

cout << "a = "; a.Output(); cout << "\n";

String A = a.UpCase();

cout << "a = "; a.Output(); cout << "\n";

cout << "A = "; A.Output(); cout << "\n";

}

Ví duï veà sao cheùp noângVí duï veà sao cheùp noâng� Xuaát lieäu khi thöïc hieän ñoaïn chöông trình treân nhö sau:

a > b

a = Nguyen Van A

a = Nguyen Van A

A = NGUYEN VAN A

delete 0x0d8a

delete 0x0d72

Chöông 2- Lôùp vaø ñoái töôïng 79

delete 0x0d72

delete 0x0d58

Ví duï veà sao cheùp noângVí duï veà sao cheùp noâng

delete 0x0d84

a > b

a = Nguyen Van A

delete 0x0d84

a > b

a = Nguyen Van A

a = Nguyen Van A

A = NGUYEN VAN A

So saùnh vôùi sao cheùp saâu: Beân traùi, duøng sao cheùp saâu, beân phaûi duøng sao cheùp noâng.

Chöông 2- Lôùp vaø ñoái töôïng 80

delete 0x0d84

a = Nguyen Van A

A = NGUYEN VAN A

delete 0x0d96

delete 0x0d72

delete 0x0d62

delete 0x0d50

A = NGUYEN VAN A

delete 0x0d8a

delete 0x0d72

delete 0x0d58

Ñoái töôïng tónhÑoái töôïng tónh� Ñoái töôïng tónh coù theå laø ñoái töôïng ñöôïc ñònh nghóa toaøn

cuïc, ñöôïc ñònh nghóa coù theâm töø khoaù static (toaøn cuïc hoaëc ñòa phöông).

� Ñoái töôïng toaøn cuïc hoaëc tónh toaøn cuïc ñöôïc taïo ra khi baét ñaàu chöông trình vaø bò huyû ñi khi keát thuùc chöông trình.

� Ñoái töôïng tónh ñòa phöông ñöôïc taïo ra khi chöông trình

Chöông 2- Lôùp vaø ñoái töôïng 81

� Ñoái töôïng tónh ñòa phöông ñöôïc taïo ra khi chöông trình thöïc hieän ñoaïn maõ chöùa ñònh nghóa ñoái töôïng laàn ñaàu tieân vaø bò huyû ñi khi keát thuùc chöông trình.

Ñoái töôïng tónhÑoái töôïng tónh� Trình töï thöïc hieän chöông trình goàm:

• Goïi phöông thöùc thieát laäp cho caùc ñoái töôïng toaøn cuïc• Thöïc hieän haøm main()• Goïi phöông thöùc huyû boû cho caùc ñoái töôïng toaøn cuïc

� Ví duï sau minh hoaï yù nghóa cuûa ñoái töôïng toaøn cuïc

Chöông 2- Lôùp vaø ñoái töôïng 82

Ví duï veà ñoái töôïng toaøn cuïcVí duï veà ñoái töôïng toaøn cuïc� Xeùt ñoaïn chöông trình sau:

#include <iostream.h>

void main()

{

cout << "Hello, world.\n";

}

Haõy söûa laïi ñoaïn chöông trình treân ñeå coù xuaát lieäu:

Chöông 2- Lôùp vaø ñoái töôïng 83

Haõy söûa laïi ñoaïn chöông trình treân ñeå coù xuaát lieäu:Entering a C++ program saying...

Hello, world.

And then exitting…

Yeâu caàu khoâng thay ñoåi haøm main() döôùi baát kyø hình thöùc naøo.

Ví duï veà ñoái töôïng toaøn cuïcVí duï veà ñoái töôïng toaøn cuïc� Ñoaïn chöông trình ñöôïc söûa laïi nhö sau:

#include <iostream.h>

void main()

{

cout << "Hello, world.\n";

}

class Dummy

Chöông 2- Lôùp vaø ñoái töôïng 84

class Dummy

{

public:

Dummy() {cout << "Entering a C++ program

saying...\n";}

~Dummy() {cout << "And then exitting...";}

};

Dummy d;

Ñoái töôïng laø thaønh phaàn cuûa lôùpÑoái töôïng laø thaønh phaàn cuûa lôùp� Ñoái töôïng coù theå laø thaønh phaàn cuûa ñoái töôïng khaùc, khi

moät ñoái töôïng thuoäc lôùp “lôùn” ñöôïc taïo ra, caùc thaønh phaàn cuûa noù cuõng ñöôïc taïo ra. Phöông thöùc thieát laäp (neáu coù) seõ ñöôïc töï ñoäng goïi cho caùc ñoái töôïng thaønh phaàn.

� Neáu ñoái töôïng thaønh phaàn phaûi ñöôïc cung caáp tham soá khi thieát laäp thì ñoái töôïng keát hôïp (ñoái töôïng lôùn) phaûi

Chöông 2- Lôùp vaø ñoái töôïng 85

khi thieát laäp thì ñoái töôïng keát hôïp (ñoái töôïng lôùn) phaûi coù phöông thöùc thieát laäp ñeå cung caáp tham soá thieát laäp cho caùc ñoái töôïng thaønh phaàn.

Ñoái töôïng laø thaønh phaàn cuûa lôùpÑoái töôïng laø thaønh phaàn cuûa lôùp� Cuù phaùp ñeå khôûi ñoäng ñoái töôïng thaønh phaàn laø duøng

daáu hai chaám (:) theo sau bôûi teân thaønh phaàn vaø tham soá khôûi ñoäng.

� Khi ñoái töôïng keát hôïp bò huyû ñi thì caùc ñoái töôïng thaønh phaàn cuûa noù cuõng bò huyû ñi, nghóa laø phöông thöùc huyû boû seõ ñöôïc goïi cho caùc ñoái töôïng thaønh phaàn, sau khi phöông thöùc huyû boû cuûa ñoái töôïng keát hôïp ñöôïc goïi.

Chöông 2- Lôùp vaø ñoái töôïng 86

phöông thöùc huyû boû cuûa ñoái töôïng keát hôïp ñöôïc goïi.

Ñoái töôïng laø thaønh phaàn cuûa lôùpÑoái töôïng laø thaønh phaàn cuûa lôùpclass Diem

{

double x,y;

public:

Diem(double xx, double yy) {x = xx; y = yy;}

// ...

};

class TamGiac

{

Chöông 2- Lôùp vaø ñoái töôïng 87

{

Diem A,B,C;

public:

void Ve() const;

// ...

};

TamGiac t; // Bao sai

Ñoái töôïng laø thaønh phaàn cuûa lôùpÑoái töôïng laø thaønh phaàn cuûa lôùpclass String

{

char *p;

public:

String(char *s) {p = strdup(s);}

String(const String &s) {p = strdup(s.p);}

~String() {cout << "delete "<< (void *)p << "\n";

delete [] p;

//...

};

Chöông 2- Lôùp vaø ñoái töôïng 88

};

class SinhVien

{

String MaSo;

String HoTen;

int NamSinh;

public:

};

SinhVien s; // Bao sai

Ñoái töôïng thaønh phaàn - thieát laäpÑoái töôïng thaønh phaàn - thieát laäpclass Diem

{

double x,y;

public:

Diem(double xx, double yy {x = xx; y = yy;}

// ...

};

Chöông 2- Lôùp vaø ñoái töôïng 89

Khôûi ñoäng ñoái töôïng thaønh phaànKhôûi ñoäng ñoái töôïng thaønh phaàn

class TamGiac

{

Diem A,B,C;

public:

TamGiac(double xA, double yA, double xB, double

yB, double xC, double yC):A(xA,yA),

B(xB,yB),C(xC,yC){}

void Ve() const;

Chöông 2- Lôùp vaø ñoái töôïng 90

void Ve() const;

// ...

};

TamGiac t(100,100,200,400,300,300);

Ñoái töôïng laø thaønh phaàn cuûa lôùpÑoái töôïng laø thaønh phaàn cuûa lôùpclass String

{

char *p;

public:

String(char *s) {p = strdup(s);}

String(const String &s) {p = strdup(s.p);}

~String() {cout << "delete "<< (void *)p <<

"\n"; delete [] p;

Chöông 2- Lôùp vaø ñoái töôïng 91

"\n"; delete [] p;

//...

};

Khôûi ñoäng ñoái töôïng thaønh phaànKhôûi ñoäng ñoái töôïng thaønh phaànclass SinhVien

{

String MaSo;

String HoTen;

int NamSinh;

public:

SinhVien(char *ht, char *ms, int ns):HoTen(ht),

MaSo(ms){NamSinh = ns;}

Chöông 2- Lôùp vaø ñoái töôïng 92

MaSo(ms){NamSinh = ns;}

//...

};

SinhVien s(“Nguyen Van Beo”, “19920005”, 1985);

//Ok

Khôûi ñoäng ñoái töôïng thaønh phaànKhôûi ñoäng ñoái töôïng thaønh phaàn� Cuù phaùp duøng daáu hai chaám cuõng ñöôïc duøng cho ñoái

töôïng thaønh phaàn thuoäc kieåu cô baûn.class Diem

{

double x,y;

public:

Diem(double xx, double yy):x(xx), y(yy){}

// ...

};

Chöông 2- Lôùp vaø ñoái töôïng 93

};

class SinhVien

{

String MaSo, HoTen;

int NamSinh;

public:

SinhVien(char *ht, char *ms, int ns):HoTen(ht),

MaSo(ms), NamSinh(ns){}

//...

};

Ñoái töôïng thaønh phaàn - Huyû boûÑoái töôïng thaønh phaàn - Huyû boû� Khi ñoái töôïng keát hôïp bò huyû boû, caùc ñoái töôïng thaønh phaàn

cuûa noù cuõng bò huyû boû.class SinhVien

{

String MaSo, HoTen;

int NamSinh;

int SoMon;

double *Diem;

public:

Chöông 2- Lôùp vaø ñoái töôïng 94

public:

SinhVien(char *ht, char *ms, int ns, int sm, double *d);

~SinhVien() {delete [] Diem;}

//...

};

SinhVien::SinhVien(char *ht, char *ms, int ns, int sm, double *d):HoTen(ht), MaSo(ms), NamSinh(ns), SoMon(sm)

{

memcpy(Diem = new double[SoMon], d, SoMon*sizeof(double));

}

Ñoái töôïng laø thaønh phaàn cuûa maûngÑoái töôïng laø thaønh phaàn cuûa maûng� Khi moät maûng ñöôïc taïo ra, caùc phaàn töû cuûa noù cuõng

ñöôïc taïo ra, do ñoù phöông thöùc thieát laäp seõ ñöôïc goïi cho töøng phaàn töû moät.

� Vì khoâng theå cung caáp tham soá khôûi ñoäng cho taát caû caùc phaàn töû cuûa maûng neân khi khai baùo maûng, moãi ñoái töôïng trong maûng phaûi coù khaû naêng töï khôûi ñoäng, nghóa laø coù theå ñöôïc thieát laäp khoâng caàn tham soá.

Chöông 2- Lôùp vaø ñoái töôïng 95

laø coù theå ñöôïc thieát laäp khoâng caàn tham soá.� Ñoái töôïng coù khaû naêng töï khôûi ñoäng trong caùc tröôøng

hôïp sau:• Lôùp khoâng coù phöông thöùc thieát laäp.• Lôùp coù phöông thöùc thieát laäp khoâng tham soá.• Lôùp coù phöông thöùc thieát laäp maø moïi tham soá ñeàu coù giaù trò maëc

nhieân.

Ñoái töôïng laø thaønh phaàn cuûa maûngÑoái töôïng laø thaønh phaàn cuûa maûngclass Diem

{

double x,y;

public:

Diem(double xx, double yy):x(xx), y(yy) {}

void Set(double xx, double yy) {x = xx, y = yy;}

// ...

};

class String

Chöông 2- Lôùp vaø ñoái töôïng 96

class String

{

char *p;

public:

String(char *s) {p = strdup(s);}

String(const String &s) {p = strdup(s.p);}

~String() {cout << "delete "<< (void *)p <<

"\n"; delete [] p;}

// ...

Ñoái töôïng laø thaønh phaàn cuûa maûngÑoái töôïng laø thaønh phaàn cuûa maûngclass SinhVien

{

String MaSo;

String HoTen;

int NamSinh;

public:

SinhVien(char *ht, char *ms, int ns):HoTen(ht),

MaSo(ms), NamSinh(ns){}

Chöông 2- Lôùp vaø ñoái töôïng 97

MaSo(ms), NamSinh(ns){}

//...

};

String as[3]; // Bao sai

Diem ad[5]; // Bao sai

SinhVien asv[7]; // Bao sai

Phöông thöùc thieát laäp vôùi tham soá coù giaù trò maëc nhieân

Phöông thöùc thieát laäp vôùi tham soá coù giaù trò maëc nhieân

class Diem

{

double x,y;

public:

Diem(double xx = 0, double yy = 0):x(xx),

y(yy){}

void Set(double xx, double yy) {x = xx, y = yy;}

// ...

Chöông 2- Lôùp vaø ñoái töôïng 98

// ...

};

class String

{

char *p;

public:

String(char *s = “”) {p = strdup(s);}

String(const String &s) {p = strdup(s.p);}

~String() {cout << "delete "<< (void *)p <<

"\n"; delete [] p;}

// ...

Duøng phöông thöùc thieát laäp vôùi tham soá coù giaù trò maëc nhieân

Duøng phöông thöùc thieát laäp vôùi tham soá coù giaù trò maëc nhieân

class SinhVien

{

String MaSo;

String HoTen;

int NamSinh;

public:

SinhVien(char *ht = “Nguyen Van A”, char *ms =

“19920014”, int ns =

Chöông 2- Lôùp vaø ñoái töôïng 99

“19920014”, int ns =

1982):HoTen(ht), MaSo(ms),

NamSinh(ns){}

//...

};

String as[3]; // Ok: Ca ba phan tu deu la chuoi

rong

Diem ad[5]; // Ok: ca 5 diem deu la (0,0)

SinhVien asv[7]; // Ok: Het sai ca 7 sinh vien deu

co cung hoten, maso, namsinh

Duøng phöông thöùc thieát laäp khoâng tham soáDuøng phöông thöùc thieát laäp khoâng tham soá

class Diem

{

double x,y;

public:

Diem(double xx, double yy):x(xx), y(yy){}

Diem():x(0), y(0){}

// ...

};

Chöông 2- Lôùp vaø ñoái töôïng 100

};

class String

{

char *p;

public:

String(char *s) {p = strdup(s);}

String() {p = strdup(“”);}

~String() {cout << "delete "<< (void *)p <<

"\n"; delete [] p;}

// ...

};

Duøng phöông thöùc thieát laäp khoâng tham soá

Duøng phöông thöùc thieát laäp khoâng tham soá

class SinhVien

{

String MaSo;

String HoTen;

int NamSinh;

public:

SinhVien(char *ht, char *ms, int

Chöông 2- Lôùp vaø ñoái töôïng 101

SinhVien(char *ht, char *ms, int

ns):HoTen(ht), MaSo(ms),

NamSinh(ns){}

SinhVien():HoTen(“Nguyen Van A”),

MaSo(“19920014”), NamSinh(1982){}

//...

};

String as[3]; // Ca ba phan tu deu la chuoi rong

Diem ad[5]; // ca 5 diem deu la (0,0)

SinhVien asv[7];// Ca 7 sinh vien deu co cung

hoten, maso, namsinh

Ñoái töôïng ñöôïc caáp phaùt ñoängÑoái töôïng ñöôïc caáp phaùt ñoäng� Ñoái töôïng ñöôïc caáp phaùt ñoäng laø caùc ñoái töôïng ñöôïc taïo

ra baèng pheùp toaùn new vaø bò huyû ñi baèng pheùp toaùn delete

� Pheùp toaùn new caáp ñoái töôïng trong vuøng heap (hay vuøng free store) vaø goïi phöông thöùc thieát laäp cho ñoái töôïng ñöôïc caáp.

� Duøng new coù theå caáp moät ñoái töôïng vaø duøng delete ñeå

Chöông 2- Lôùp vaø ñoái töôïng 102

� Duøng new coù theå caáp moät ñoái töôïng vaø duøng delete ñeå huyû moät ñoái töôïng.

� Duøng new vaø delete cuõng coù theå caáp nhieàu ñoái töôïng vaø huyû nhieàu ñoái töôïng.

Ñoái töôïng ñöôïc caáp phaùt ñoängÑoái töôïng ñöôïc caáp phaùt ñoängclass String

{

char *p;

public:

String(char *s) {p = strdup(s);}

String(const String &s) {p = strdup(s.p);}

~String() {delete [] p;}

//...

};

Chöông 2- Lôùp vaø ñoái töôïng 103

};

class Diem

{

double x,y;

public:

Diem(double xx, double yy):x(xx),y(yy){};

//...

};

//...

Caáp vaø huyû moät ñoái töôïngCaáp vaø huyû moät ñoái töôïngint *pi = new int;

int *pj = new int(15);

Diem *pd = new Diem(20,40);

String *pa = new String("Nguyen Van A");

//...

delete pa;

delete pd;

delete pj;

Chöông 2- Lôùp vaø ñoái töôïng 104

delete pj;

delete pi;

Caáp vaø huyû nhieàu ñoái töôïngCaáp vaø huyû nhieàu ñoái töôïng� Trong tröôøng hôïp caáp nhieàu ñoái töôïng, ta khoâng theå cung

caáp tham soá cho töøng phaàn töû ñöôïc caáp:int *pai = new int[10];

Diem *pad = new Diem[5]; // Bao sai

String *pas = new String[5]; // Bao sai

//...

� Thoâng baùo loãi cho ñoaïn chöông trình treân nhö sau:

Chöông 2- Lôùp vaø ñoái töôïng 105

� Thoâng baùo loãi cho ñoaïn chöông trình treân nhö sau:Cannot find default constructor to initialize array element of type 'Diem'Cannot find default constructor to initialize array element of type String’

� Loãi treân ñöôïc khaéc phuïc baèng caùch cung caáp phöông thöùc thieát laäp ñeå ñoái töôïng coù khaû naêng töï khôûi ñoäng.

Caáp vaø huyû nhieàu ñoái töôïngCaáp vaø huyû nhieàu ñoái töôïngclass String

{

char *p;

public:

String(char *s = "Alibaba") {p = strdup(s);}

String(const String &s) {p = strdup(s.p);}

~String() {delete [] p;}

//...

Chöông 2- Lôùp vaø ñoái töôïng 106

};

class Diem

{

double x,y;

public:

Diem(double xx, double yy):x(xx),y(yy){};

Diem():x(0),y(0){};

//...

};

Caáp vaø huyû nhieàu ñoái töôïngCaáp vaø huyû nhieàu ñoái töôïng� Khi ñoù moïi phaàn töû ñöôïc caáp ñeàu ñöôïc khôûi ñoäng vôùi

cuøng giaù tròint *pai = new int[10];

Diem *pad = new Diem[5];

// ca 5 diem co cung toa do (0,0)

String *pas = new String[5];

// Ca 5 chuoi cung duoc khoi dong bang “Alibaba”

Vieäc huyû nhieàu ñoái töôïng ñöôïc thöïc hieän baèng caùch duøng

Chöông 2- Lôùp vaø ñoái töôïng 107

// Ca 5 chuoi cung duoc khoi dong bang “Alibaba”

� Vieäc huyû nhieàu ñoái töôïng ñöôïc thöïc hieän baèng caùch duøng delete vaø coù theâm daáu [] ôû tröôùc. delete [] pas;

delete [] pad;

delete [] pai;

2.4 Giao dieän vaø chi tieát caøi ñaët2.4 Giao dieän vaø chi tieát caøi ñaët� Lôùp coù hai phaàn taùch rôøi, moät laø phaàn giao dieän khai baùo

trong phaàn public ñeå ngöôøi söû duïng “thaáy” vaø söû duïng, vaø hai laø chi tieát caøi ñaët bao goàm döõ lieäu khai baùo trong phaàn private cuûa lôùp vaø chi tieát maõ hoaù caùc haøm thaønh phaàn, voâ hình ñoái vôùi ngöôøi duøng.

� Ta coù theå thay ñoåi uyeån chuyeån chi tieát caøi ñaët, nghóa laø coù theå thay ñoåi toå chöùc döõ lieäu cuûa lôùp, cuõng nhö coù theå

Chöông 2- Lôùp vaø ñoái töôïng 108

coù theå thay ñoåi toå chöùc döõ lieäu cuûa lôùp, cuõng nhö coù theå thay ñoåi chi tieát thöïc hieän caùc haøm thaønh phaàn (do söï thay ñoåi toå chöùc döõ lieäu hoaëc ñeå caûi tieán giaûi thuaät). Nhöng neáu baûo ñaûm khoâng thay ñoåi phaàn giao dieän thì khoâng aûnh höôûng ñeán ngöôøi söû duïng, vaø do ñoù khoâng laøm ñoå vôõ kieán truùc cuûa heä thoáng.

� Lôùp ThoiDiem coù theå ñöôïc caøi ñaët vôùi caùc thaønh phaàn döõ lieäu laø giôø, phuùt, giaây hoaëc toång soá giaây tính töø 0 giôø.

Lôùp ThoiDiem – Caùch 1Lôùp ThoiDiem – Caùch 1class ThoiDiem

{

int gio, phut, giay;

static bool HopLe(int g, int p, int gy);

public:

ThoiDiem(int g = 0, int p = 0, int gy = 0)

{Set(g,p,gy);}

void Set(int g, int p, int gy);

Chöông 2- Lôùp vaø ñoái töôïng 109

void Set(int g, int p, int gy);

int LayGio() const {return gio;}

int LayPhut() const {return phut;}

int LayGiay() const {return giay;}

void Nhap();

void Xuat() const;

void Tang();

void Giam();

};

Lôùp ThoiDiem – Caùch 2Lôùp ThoiDiem – Caùch 2class ThoiDiem

{

long tsgiay;

static bool HopLe(int g, int p, int gy);

public:

ThoiDiem(int g = 0, int p = 0, int gy = 0)

{Set(g,p,gy);}

void Set(int g, int p, int gy);

Chöông 2- Lôùp vaø ñoái töôïng 110

void Set(int g, int p, int gy);

int LayGio() const {return tsgiay / 3600;}

int LayPhut() const {return (tsgiay%3600)/60;}

int LayGiay() const {return tsgiay % 60;}

void Nhap();

void Xuat() const;

void Tang();

void Giam();

};

Giao dieän vaø chi tieát caøi ñaëtGiao dieän vaø chi tieát caøi ñaët� Coù theå xem chi tieát ñaày ñuû lôùp thôøi ñieåm caøi ñaët baèng

giôø, phuùt, giaây vaø caøi ñaët baèng toång soá giaây trong taäp tin nguoàn thgian.cpp vaø thgian2.cpp,

� Töông töï lôùp Stack coù theå ñöôïc caøi ñaët döôùi daïng maûng hoaëc döôùi daïng danh saùch lieân keát.

Chöông 2- Lôùp vaø ñoái töôïng 111

2.5 Caùc nguyeân taéc xaây döïng lôùp2.5 Caùc nguyeân taéc xaây döïng lôùp� Khi ta coù theå nghó ñeán “noù” nhö moät khaùi nieäm rieâng reõ,

xaây döïng lôùp bieåu dieãn khaùi nieäm ñoù. Ví duï lôùp SinhVien.

� Khi ta nghó ñeán “noù” nhö moät thöïc theå rieâng reõ, taïo ñoái töôïng thuoäc lôùp. Ví duï ñoái töôïng Sinh vieân “Nguyen Van A” (vaø caùc thuoäc tính khaùc nhö maõ soá, naêm sinh…).

� Lôùp laø bieåu dieãn cuï theå cuûa moät khaùi nieäm, vì vaäy lôùp

Chöông 2- Lôùp vaø ñoái töôïng 112

� Lôùp laø bieåu dieãn cuï theå cuûa moät khaùi nieäm, vì vaäy lôùp luoân luoân laø DANH TÖØ.

� Caùc thuoäc tính cuûa lôùp laø caùc thaønh phaàn döõ lieäu, neân chuùng luoân luoân laø DANH TÖØ.

� Caùc haøm thaønh phaàn laø caùc thao taùc chæ roõ hoaït ñoäng cuûa lôùp neân caùc haøm naøy laø ÑOÄNG TÖØ.

� Caùc thuoäc tính döõ lieäu phaûi vöøa ñuû ñeå moâ taû khaùi nieäm, khoâng dö, khoâng thieáu.

Caùc nguyeân taéc xaây döïng lôùpCaùc nguyeân taéc xaây döïng lôùp

// SAI

class TamGiac

{

// DUNG

class TamGiac

{

� Caùc thuoäc tính coù theå ñöôïc suy dieãn töø nhöõng thuoäc tính khaùc thì duøng haøm thaønh phaàn ñeå thöïc hieän tính toaùn. Chu vi, dieän tích tam giaùc laø thuoäc tính suy dieãn.

Chöông 2- Lôùp vaø ñoái töôïng 113

{

Diem A,B,C;

double ChuVi,

DienTich;

public:

//...

};

{

Diem A,B,C;

public:

//...

double ChuVi()const;

double DienTich()

const;

};

Caùc nguyeân taéc xaây döïng lôùpCaùc nguyeân taéc xaây döïng lôùp� Caù bieät coù theå coù moät soá thuoäc tính suy dieãn ñoøi hoûi

nhieàu taøi nguyeân hoaëc thôøi gian ñeå thöïc hieän tính toaùn, ta coù theå khai baùo laø döõ lieäu thaønh phaàn. Ví duï tuoåi trung bình cuûa daân Vieät Nam.class QuocGia

{

long DanSo;

double DienTich;

Chöông 2- Lôùp vaø ñoái töôïng 114

double DienTich;

double TuoiTrungBinh;

//...

public:

double TinhTuoiTB() const;

//...

};

Caùc nguyeân taéc xaây döïng lôùpCaùc nguyeân taéc xaây döïng lôùp� Chi tieát caøi ñaët, bao goàm döõ lieäu vaø phaàn maõ hoaù caùc

haøm thaønh phaàn coù theå thay ñoåi uyeån chuyeån nhöng phaàn giao dieän, nghóa laø phaàn khai baùo caùc haøm thaønh phaàn caàn phaûi coá ñònh ñeå khoâng aûnh höôûng ñeán ngöôøi söû duïng (xem phaàn 2.4). Tuy nhieân neân coá gaéng caøi ñaët döõ lieäu moät caùch töï nhieân theo ñuùng khaùi nieäm.

// NEN // KHONG NEN

Chöông 2- Lôùp vaø ñoái töôïng 115

// NEN

class PhanSo

{

int tu, mau;

public:

//...

};

// KHONG NEN

class PhanSo

{

long tu_mau;

public:

//...

};

Caùc nguyeân taéc xaây döïng lôùpCaùc nguyeân taéc xaây döïng lôùp� Döõ lieäu thaønh phaàn neân ñöôïc keát hôïp thay vì phaân raõ

// NEN

class TamGiac

{

Diem A,B,C;

public:

// KHONG NEN

class TamGiac

{

double xA, yA,

xB, yB, xC,

Chöông 2- Lôùp vaø ñoái töôïng 116

public:

//...

};

class HinhTron

{

Diem Tam;

double BanKinh;

public:

//...

xB, yB, xC,

yC;

public:

//...

};

class HinhTron

{

double tx, ty,

BanKinh;

Caùc nguyeân taéc xaây döïng lôùpCaùc nguyeân taéc xaây döïng lôùp� Chi tieát caøi ñaët, bao goàm döõ lieäu vaø phaàn maõ hoaù caùc

haøm thaønh phaàn coù theå thay ñoåi uyeån chuyeån nhöng phaàn giao dieän, nghóa laø phaàn khai baùo caùc haøm thaønh phaàn caàn phaûi coá ñònh ñeå khoâng aûnh höôûng ñeán ngöôøi söû duïng (xem phaàn 2.4).

� Döõ lieäu thaønh phaàn neân ñöôïc keát hôïp thay vì phaân raõ// NEN // KHONG NEN

Chöông 2- Lôùp vaø ñoái töôïng 117

// NEN

class TamGiac

{

Diem A,B,C;

public:

//...

};

// KHONG NEN

class TamGiac

{

double xA, yA,

xB, yB, xC,

yC;

public:

//...

};

Caùc nguyeân taéc xaây döïng lôùpCaùc nguyeân taéc xaây döïng lôùp� Trong moïi tröôøng hôïp, cần coù phöông thöùc thieát laäp ñeå

khôûi ñoäng ñoái töôïng.� Neân coù phöông thöùc thieát laäp coù khaû naêng töï khôûi ñoäng

khoâng caàn tham soá.� Neáu ñoái töôïng coù nhu caàu caáp phaùt taøi nguyeân thì phaûi

coù phöông thöùc thieát laäp, phöông thöùc thieát laäp sao cheùp ñeå khôûi ñoäng ñoái töôïng baèng ñoái töôïng cuøng kieåu vaø coù

Chöông 2- Lôùp vaø ñoái töôïng 118

ñeå khôûi ñoäng ñoái töôïng baèng ñoái töôïng cuøng kieåu vaø coù phöông thöùc huyû boû ñeå doïn deïp. Ngoaøi ra coøn phaûi coù pheùp gaùn (chöông tieáp theo).

� Ngöôïc laïi, ñoái töôïng ñôn giaûn khoâng caàn taøi nguyeân rieâng thì khoâng caàn phöông thöùc thieát laäp sao cheùp vaø cuõng khoâng caàn phöông thöùc huyû boû.

Recommended