laäp trình höôùng Ñoái töôïng - wordpress.com...moïi thao taùc ñeàu coù tham soá...

118
Laäp Trình Höôùng Ñoái Töôïng Laäp Trình Höôùng Ñoái Töôïng Laäp Trình Höôùng Ñoái Töôïng Laäp Trình Höôùng Ñoái Töôïng OÂn taäp toát nghieäp

Upload: others

Post on 13-Oct-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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

Page 2: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

Chöông 1Chöông 1

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

Page 3: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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.

Page 4: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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.

Page 5: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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.

Page 6: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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

Page 7: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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).

Page 8: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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).

Page 9: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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

Page 10: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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.

Page 11: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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.

Page 12: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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.

Page 13: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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

Page 14: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

Ñ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ù.

Page 15: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

Ñ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.

Page 16: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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ù.

Page 17: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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

Page 18: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

Ñ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.

Page 19: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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.

Page 20: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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;

};

Page 21: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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);

}

Page 22: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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;

}

Page 23: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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

Page 24: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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);

}

Page 25: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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.

Page 26: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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);

};

Page 27: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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;

}

Page 28: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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();

}

Page 29: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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.

Page 30: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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);

Page 31: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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.

Page 32: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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);

};

Page 33: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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

Page 34: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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

Page 35: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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

Page 36: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

// 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);

};

Page 37: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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;

}

Page 38: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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];

}

Page 39: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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

Page 40: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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;

}

Page 41: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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.

Page 42: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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.

Page 43: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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);

};

Page 44: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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.

Page 45: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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.

Page 46: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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);}

};

Page 47: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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

}

Page 48: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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.

Page 49: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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();

};

Page 50: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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;

}

Page 51: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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;

}

Page 52: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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 ?

Page 53: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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

Page 54: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

Ñ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.

Page 55: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

Ñ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;}

};

Page 56: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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

Page 57: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

� 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).

Page 58: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

Ñ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;

};

Page 59: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

Ñ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";

}

Page 60: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

Ñ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

Page 61: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

Ñ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;

};

Page 62: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

Ñ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";

}

Page 63: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

Ñ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).

Page 64: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

Ñ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();

Page 65: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

Ñ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

}

Page 66: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

Ñ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

Page 67: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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.

Page 68: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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.

Page 69: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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;

};

Page 70: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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;

}

Page 71: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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";

}

Page 72: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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.

Page 73: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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.

Page 74: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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).

Page 75: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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";}

};

Page 76: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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();

};

Page 77: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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;

}

Page 78: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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";

}

Page 79: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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

Page 80: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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

Page 81: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

Ñ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.

Page 82: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

Ñ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

Page 83: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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.

Page 84: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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;

Page 85: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

Ñ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.

Page 86: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

Ñ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.

Page 87: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

Ñ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

Page 88: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

Ñ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

Page 89: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

Ñ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

Page 90: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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);

Page 91: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

Ñ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;

//...

};

Page 92: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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

Page 93: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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){}

//...

};

Page 94: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

Ñ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));

}

Page 95: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

Ñ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.

Page 96: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

Ñ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;}

// ...

Page 97: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

Ñ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

Page 98: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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;}

// ...

Page 99: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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

Page 100: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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;}

// ...

};

Page 101: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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

Page 102: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

Ñ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.

Page 103: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

Ñ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){};

//...

};

//...

Page 104: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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;

Page 105: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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.

Page 106: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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){};

//...

};

Page 107: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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;

Page 108: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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ôø.

Page 109: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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();

};

Page 110: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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();

};

Page 111: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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

Page 112: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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.

Page 113: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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;

};

Page 114: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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;

//...

};

Page 115: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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:

//...

};

Page 116: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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;

Page 117: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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:

//...

};

Page 118: Laäp Trình Höôùng Ñoái Töôïng - WordPress.com...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

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û.