Tải bản đầy đủ (.pdf) (15 trang)

Bài giảng lập trình hướng đối tượng class và object trần phước tuấn

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (216.21 KB, 15 trang )

N i dung
1.

L p và


i

ng

nh ngh a: tên l p, thu c tính, ph ng th c
Cài t ph ng th c
m b o tính úng n c a d li u
Các thành ph n, ph m vi truy c p

L P TRÌNH
NG
IT
NG
CLASS & OBJECT

2.
3.
4.

Tr n Ph c Tu n



5.


Th vi n hóa
M t ví
ví d
Thi t k l p
Xác
Xác

nh thành ph n d li u
nh thành ph n x lý

Các ph

ng th c/hà
c/hàm

Constructor
Destructor
6.

Hàm b n, l p b n

i

ng (C++)

p: ki u d li u tr u t
ct
i
ng


TÊN L P
li u
thành viên

p các
thao tác

9/6/2009

Hàm
thành viên

ng.

1. L p và
private
protected
public

class TÊNL P
[: <Quy n truy xu t> L PCHA ]
{ <Quy n truy xu t > :
DataType1 memberdata1;
DataType2 memberdata2;
…………….
< Quy n truy xu t > :
memberFunction1();
memberFunction2();
…………..
};

T.P.TU N - LTH T

nh ngh a
các hàm
thành viên

3

i

ng (C++)

Ví d :

Khai báo
p

9/6/2009

2

T.P.TU N - LTH T

9/6/2009

1. L p và

c bi t

class Point {

int xVal, yVal;
public:
void SetPt (int, int);
void OffsetPt (int, int);
};
void Point::SetPt
(int x, int y) {
Point
xVal = x;
yVal = y;
}
void Point::OffsetPt
(int x, int y) {
Point
xVal += x;
yVal += y;
}

void main() {
Point pt;

o ra
i t ng
thu c l p
Point

pt.SetPt(10,20);
pt.OffsetPt(2,2);
……..


i hàm
trên
i t ng

pt.xVal = 10; // úng hay sai?
Point pt1, pt2, pt3;
……….
}

T.P.TU N - LTH T

4


1. L p và
it

i

ng (C++)

1. L p và

ng
i di n cho 1

it

it


i

ng

Tên l p
Các thu c tính

ng th c c a bài toán

ng

các thành ph n d li u

Là ki u (khuôn)

o ra

it

ng

Các ph

ng th c

các thao tác (hàm) tác
i t ng

1. L p và


it

ng – Ví d

class Student
{
public:
char name[30];
int id;
};
it

T.P.TU N - LTH T

6

void main()
{
Student s;
...
printStudent(s);
}

ng

T.P.TU N - LTH T

9/6/2009

ng t i d li u c a


void printStudent(Student s)
{
cout << ”name: ” << s.name << endl;
cout << ”id: ” << s.id << endl;
}

thu c tính

void main()
{
Student s1;
cin >> s1.name;
cin >> s1.id;
}
9/6/2009

5

T.P.TU N - LTH T

9/6/2009

al p

7

9/6/2009

T.P.TU N - LTH T


8


prototype a
ph ng th c

1. L p và

it

ng - Ph

Là hàm c thù v
i t ng
c liên k t v i m t l
it
Tác ng t i các thu c tính c

class Student
{
public:
char name[30];
int id;
void print();
};

ng th c
ng c th
i t ng


...
void main()
{
Student s;
cin >> s.name;
cin >> s.id;
s.print();
}

void Student::print()
{
cout << ”name: ” << name << endl;
cout << ”id: ” << id << endl;
}
9/6/2009

T.P.TU N - LTH T

1. L p và

it

9

ng

1. L p và

Hàm inline:

inline
i thi n t c
th c thi
n b nh (dành cho mã l nh) khi th c thi.
Cách 1:
1
thêm
khóa
inline

class Point {
int xVal, yVal;
public:
void SetPt (int, int);
void OffsetPt (int, int);
};
inline void Point::SetPt
(int x, int y) {
Point
xVal = x;
yVal = y;
}
……………

9/6/2009

it

ng


Ph n l n l i l p trình là do thao tác sai v i
li u
li u không h p l (sai mi n giá tr )
li u không th ng nh t

class Point {
int xVal, yVal;
Cách 2:
2 public:
void SetPt (int x, int y) {
nh
xVal = x;
ngh a
yVal = y;
bên
}
trong
void OffsetPt (int x, int y) {
p
xVal += x;
yVal += y;
}

T.P.TU N - LTH T

10

T.P.TU N - LTH T

9/6/2009


n có k thu

ki m soát v

m b o tính úng

này

n c a d li u

};
11

9/6/2009

T.P.TU N - LTH T

12


1. L p và

it

ng

Date.h:
class Date
{

public:
int y, m, d;
bool set(int yy,int mm,int dd);
};

1. L p và

it

m b o tính úng
T.P.TU N - LTH T

14

T.P.TU N - LTH T

9/6/2009

1. L p và

ng

myCalendar.cpp:
#include ”date.h”;
void main()
{
Date d1, d2;
d1.y = 2001;
d1.m = 2;
d1.d = 29;

...
}
9/6/2009

13

T.P.TU N - LTH T

9/6/2009

date.cpp:
#include ”date.h”
bool Date::set(int yy, int mm, int dd)
{
// ki m tra tính h p l
a tham s
...
myCalendar.cpp:
}
#include ”date.h”;
void main()
{
Date d1, d2;
d1.set(2000, 13, 32);
d2.set(2001, 2, 29);
}

it

ng


Không cho truy c p tr c ti
thu c tính

Gi i pháp
n các

ch có các ph ng th c c a chính
thao tác
c lên các thu c tính

u truy c p tr c
ti
n các thu c
tính thì v n không
ki m soát
c

it

ng

Truy v n và c p nh t thu c tính thông qua
các ph ng th c xác nh
giao di n th c s
al
i t ng
ki m soát tính h p l khi thay i giá tr

n c a d li u

15

9/6/2009

T.P.TU N - LTH T

16


1. L p và

it

Date.h:
class Date
{
public:
int getYear();
int getMonth();
int getDay();
bool set(int, int, int);
void print();
void copyTo(Date&);
bool equalTo(Date&);
private:
int y, m, d;
óng gói/che
};
9/6/2009


1. L p và

T.P.TU N - LTH T

it

ng

1. L p và

Giao di n

d u thông tin
17

ng

9/6/2009

T.P.TU N - LTH T

19

ng

it

tin
18


T.P.TU N - LTH T

9/6/2009

1. L p và

myCalendar.cpp:
#include ”date.h”;
void main()
óng gói/che d u thông tin
{
Date d1, d2;
if (d1.set(2000, 1, 31))
cout << d1.getYear() << endl;
else cout << ”ngay thang khong hop le”;
cout << d1.m; // compile error
d1.d = 30;
// compile error
...
}

it

date.cpp:
#include ”date.h”;
bool Date::set(int yy, int mm, int dd)
{
// ki m tra tính h p l
a tham s
...

}
int Date::getYear()
{
return y;
}
óng gói/che d u thông
...

ng

óng gói i t ng, che d u các thông tin
i t i, truy c
i t ng thông qua
ph ng th c (giao
giao di n) xác nh
m b o tính úng

nc

it

ng

Ng i l p trình ng d ng ch
n bi t giao
di n (ch c n ng, cách dùng); không c n
bi t cách cài t c
i t ng
ng
óng gói/che d u thông tin

9/6/2009

T.P.TU N - LTH T

20


1. L p và

it

ng

Ph m vi truy c p

1. L p và
i Truy
C p

Các thành ph n public
Ph
Ph
Ph

ng th c trong l p
ng th c
p k th a
ng th c ngoài l p

Thà

Thành
Ph n

ng th c trong l p
ng th c
p k th a

9/6/2009

21

2. Th vi n hóa
Các l p c
c xây d ng
ng
c trong nhi u ch ng trình khác
nhau
Phân tách mã ngu
nh ngh a l p và mã
ngu n s
ng l p
Phân tách giao di n a l p và cài t a
p

9/6/2009

T.P.TU N - LTH T

23


TRONG
NGOÀ
L P
NGOÀI
L P K TH A L P

x

protected

x

x

x

public

x

x

x

ng th c trong l p
T.P.TU N - LTH T

Ph m vi truy c p

x


Các thành ph n private
Ph

B N

ng

private

Các thành ph n protected
Ph
Ph

it

9/6/2009

T.P.TU N - LTH T

X
22

Date.h:
#if !defined (_DATE_H__)
#define _DATE_H__
//khai báo th vi n
#include <iostream.h>

class Date

{
private:
int y, m, d;
public:
void set(int yy, int mm, int dd);
void print();
};
#endif
9/6/2009

T.P.TU N - LTH T

24


Date.cpp:

myApp.cpp:

#include ”Date.h”

#include <iostream.h>
#include ”Date.h”

void Date::set(int yy, int mm, int dd)
{
y = yy;
m = mm;
d = dd;
}

void Date::print()
{
cout <}
9/6/2009

T.P.TU N - LTH T

25

9/6/2009

void Set::Copy (Set &set) {
for (register i = 0; i < card; ++i)
set.elems[i] = elems[i];
set.card = card;
}
Bool Set::Equal (Set &set) {
if (card != set.card)
return false;
for (register i = 0; i < card; ++i)
if (!set.IsMember(elems[i]))
return false;
return true;
}
void Set::Print (void) {
cout << "{";
for (int i = 0; i < card-1; ++i)
cout << elems[i] << ",";
if (card > 0)

cout << elems[card-1];
cout << "}“<}

Bool Set::IsMember (const int elem) {
for (register i = 0; i < card; ++i)
if (elems[i] == elem)
return true;
return false;
}
void Set::AddElem (const int elem) {
if (IsMember(elem))
return;
if (card < maxCard)
elems[card++] = elem;
else
cout << "Set overflow“<}
void Set::RmvElem (const int elem) {
for (register i = 0; i < card; ++i)
if (elems[i] == elem) {
for (; i < card-1; ++i) // D ch
elems[i] = elems[i+1];
--card;
}
}

T.P.TU N - LTH T

9/6/2009


26

T.P.TU N - LTH T

3. M t ví d - L p Set (t p h p)

3. M t ví d - L p Set (t p h p)
#include <iostream.h>
const maxCard = 100;
enum Bool {false, true};
class Set {
private:
int elems[maxCard];
int card;
public:
void EmptySet(){ card = 0; }
Bool IsMember (const int);
void AddElem (const int);
void RmvElem (const int);
void Copy (Set&);
Bool Equal (Set&);
void Intersect (Set&, Set&);
void Union (Set&, Set&);
void Print ();
};

void main()
{
Date ngaysinh;

ngaysinh.set(2007, 3, 8);
ngaysinh.print();
}

27

9/6/2009

………
int main (void) {
Set s1, s2;
s1.EmptySet(); s2.EmptySet();
s1.AddElem(10); s1.AddElem(20);
s1.AddElem(30); s1.AddElem(40);
s2.AddElem(30); s2.AddElem(50);
s2.AddElem(10); s2.AddElem(60);
cout << "s1 = "; s1.Print();
cout << "s2 = "; s2.Print();
s2.RmvElem(50);
cout << "s2 - {50} = ";
s2.Print();
if (s1.IsMember(20))
cout << "20 is in s1\n";
if (!s1.Equal(s2))
cout << "s1 <> s2\n";
return 0;
}
T.P.TU N - LTH T

K t

qu ?

28


Th c hành

3. Thi t k L p

o l p Student

Xác
Xác

a.

có các thu c tính tên, mã sinh viên,
trung bình
ph ng th c print()
in thông tin

m

b.

Nhóm kh i t o
Nhóm truy v n thông tin
Nhóm c p nh t thông tin
Nhóm x lý tính toán
Nhóm ki m tra ràng bu c


Vi t ch ng trình ng d ng
nh p
thông tin cho m t s sinh viên, p x p l i
theo th
m trung bình t cao xu ng
th p.
9/6/2009

29

T.P.TU N - LTH T

Thành ph n d li u th ng
c
trong ph m vi protected hay private

Nhóm kh i t o
t

i

Xác nh tr ng thái ban
Ví d :

T.P.TU N - LTH T

u cho

it


ng

KhoiTaoPS (tu=0,mau=1)
KhoiTaoSV (ten=“”,…)
DSLK (Head=Tail=NULL)
….

t

Thành ph n d li u
9/6/2009

30

T.P.TU N - LTH T

9/6/2009

3. Thi t k L p

3. Thi t k L p
Ta c n bi t nh ng thông tin gì v
ng thu c l p này

nh thành ph n d li u
nh thành ph n x lý

Thà
Thành ph n x lý

31

9/6/2009

T.P.TU N - LTH T

32


3. Thi t k L p

3. Thi t k L p

Nhóm truy v n thông tin
Các ph ng th c truy v n (query method) là các
ph ng th c dùng
i v giá tr
a các thành
viên d li u c a m t i t ng
Có nhi u lo i câu h i truy v n có th :

Nhóm truy v n thông tin
i v i các truy v n
n gi n, quy
c t tên
ph ngth c: ti n t “get”, ti p theo là tên c a thành
viên

truy v n
n gi n (“giá tr

a x là bao nhiêu?”)
truy v n
u ki n (“thành viên x có l n h n 10
không?”)
truy v n d n xu t (“t ng giá tr
a các thành viên x
và y là bao nhiêu?”)

int getX();
int getSize();

Các lo i truy v n khác nên có tên có tính mô t
Truy v n
u ki n nên có ti n t “is”

c
m quan tr ng c a ph ng th c truy v n là
nó không nên thay
i tr ng thái hi n t i c a
i
ng
T.P.TU N - LTH T

9/6/2009

33

3. Thi t k L p

9/6/2009


Truy v n và c p nh t
u các ph ng th c get/set ch có nhi m v
cho ta
c và ghi giá tr cho các thành viên d
li u, quy nh các thành viên private
c ích
i gì?
Ngoài vi c b o v các nguyên t c óng gói, ta
còn c n ki m tra xem giá tr
i cho thành viên
li u có h p l hay không.
ng ph ng th c c p nh t cho phép ta th c
hi n vi c ki m tra tr c khi th c s thay i giá
tr
a thành viên.
Cho phép ch các d li u có th truy v n hay thay
i
c truy c p n.

Ng c l i v i truy v n thông tin, các ph ng
th c c p nh t th ng thay i tr ng thái c a
i t ng b ng cách s a i m t ho c nhi u
thành viên d li u c a i t ng ó
ng
n gi n nh t c a các ph ng th c
p nh t là gán m t giá tr nào ó cho m t
thành viên d li u
i v i d ng c p nh t
n gi n, quy

c t
tên: dùng ti n t “set” kèm theo tên thành viên
ns a
int setX(int);
T.P.TU N - LTH T

34

3. Thi t k L p

p nh t thông tin

9/6/2009

T.P.TU N - LTH T

35

9/6/2009

T.P.TU N - LTH T

36


3. Thi t k L p

3. Thi t k L p

Ví d


Nhóm x lý tính toán

int Student::setGPA(double newGPA)
{
if ((newGPA >= 0.0) && (newGPA <= 4.0))
{
this->gpa = newGPA;
return 0; // Return 0 to indicate success
}
else
{
return -1; // Return -1 to indicate failure
}
}
9/6/2009

T.P.TU N - LTH T

Xác nh tr ng thái m i cho i t ng ho c
cung c p thông tin t ng h p t các thu c tính
a i t ng
Ví d :
NhanVien.TinhLuong()
SinhVien.XepLoai()
Nghiem
PhuongTrinh.GiaiPhuongTrinh()
Giatri
PhanSo.TinhGiaTri()



Thà
Thành ph n x lý

37

3. Thi t k L p

3. Thi t k L p

Nhóm ki m tra ràng bu c
Ki m tra tính úng
Ví d :

ng c a d li u

2.

a.
b.

Thành ph n x lý
9/6/2009

T.P.TU N - LTH T

39

Bài t p


sung vào l p Date các ph ng th c
thu c các nhóm trên (m i nhóm ít nh t
t ph ng th c)
Cài t trên máy l p t p h p (Set) và
vi t ch ng trình nh p vào 2 t p h p s
nguyên (A,B), sau ó

1.

Ngày tháng n m h p l
Ngày vào làm và ngày sinh
us
a phân s ph i khác 0
ms
a sinh viên >=0 và <=10


38

T.P.TU N - LTH T

9/6/2009

9/6/2009

Tính giao c a 2 t p h p v a nh p
Ki m tra xem t p A có ph i là con c a B hay
không
T.P.TU N - LTH T


40


4. Các ph

ng th c/hàm

c bi t

Ph

ng th c kh i t o - Constructor

Ph

ng th c h y - Destructor

4. Các ph
Ph ng th
sau khi i t

ng th c/hàm
c bi
ng

cg it
ng, ng
không tr
i k t qu


c bi t

cg it
c t o ra

ng ngay

i dùng không

cg il i

Có hình th c tên trùng v i tên l p
Th ng làm nhi m v kh i t o d li u cho
ng
Có th khai báo trùng

i

Constructor
9/6/2009

41

T.P.TU N - LTH T

T.P.TU N - LTH T

42

date.cpp:

#include ”date.h”;

Date.h:
class Date
{
public:
Date();
Date(int, int, int);
int getYear();
int getMonth();
int getDay();
bool set(int, int, int);
void set(const Date&);
void print();
void copyTo(Date&);
bool equalTo(const Date&);
private:
int y, m, d;
};
9/6/2009

9/6/2009

T.P.TU N - LTH T

Constructor

Date::Date()
{
y = 2000;

m = 1;
d = 1;
}

Constructor

Date::Date(int yy, int mm, int dd)
{
set(yy, mm, dd);
}
...
43

9/6/2009

T.P.TU N - LTH T

44


Hàm xây d ng (t o)

myCalendar.cpp:
#include ”date.h”;
...
Constructor
void main()
{
Date d1;
Date womenDay(2007, 3, 8);

Date d[100];
d1.print();
womenDay.print();
}

Dùng
nh ngh a và kh i t o i t ng cùng 1 lúc.
Có tên trùng v i tên l p, không có ki u tr
.
Không g i tr c ti p, s
ct
ng g i khi kh i t o t.
Gán giá
giá tr , c p vù
vùng nh cho các d li u thà
thành viên.
viên
class Point {
int xVal, yVal;
public:
Point (int x, int y) {
xVal = x; yVal = y;
}
void OffsetPt (int x, int y) {
xVal += x; yVal += y;
}

};
T.P.TU N - LTH T


9/6/2009

45

Hàm xây d ng (t o)
class Point {
int xVal, yVal;
public:
Point () // Hàm xây d ng m c nhiên
{ xVal = 0; yVal = 0; }
Point (int x, int y) {
xVal = x; yVal = y;
}
Point (float len, float angle) {
xVal = (int) (len * cos(angle));
yVal = (int) (len * sin(angle));

}
void OffsetPt (int , int ); …

};
void main() {
Point p1;
Point p2(10,20);
Point p3(60.3, 3.14);

class Set {
private:
int *elems;
int maxCard;

int card;
public:
Set(const int size) {
elems = new int[size];
maxCard = size;
card = 0;
}
……………
};
void main() {
Set s1(100);
Set s2(20);
Set s3(1000); …
}

Không c n
ph i nh
i hàm
EmptySet()
khi kh i t o

46

T.P.TU N - LTH T

9/6/2009

4. Các ph
m
o

n

void main() {
Point pt1(10,20);
pt1.OffsetPt(2,2);
……..
// Khai báo nào là sai ?
Point pt2;
Point pt3();
Point pt4 = Point(5,5);
Point pt5 = new Point(5,5);
……….
}

ng th c/hàm

c bi t

Ph ng th
c bi
cg it
ng ngay
tr c khi i t ng
c gi i phóng kh i b
nh
Không có tham s , không có ki u tr
i, không
nh ngh a trùng
Th ng
c dùng vào m

ích c bi t là
n d p các tài nguyên mà i t ng s
ng
gi i phóng b nh
óng t p

ng

Destructor

}
9/6/2009

T.P.TU N - LTH T

47

9/6/2009

T.P.TU N - LTH T

48


date.cpp:
#include ”date.h”;

Date.h:
class Date
{

public:
Date();
Date(int, int, int);
int getYear();
int getMonth();
int getDay();
bool set(int, int, int);
...
~Date();
private:
int y, m, d;
};
9/6/2009

Destructor

49

T.P.TU N - LTH T

9/6/2009

n d p 1 i t ng tr c khi nó
c thu h i.
Cú pháp: ~TenLop() { ……... }
Không g i tr c ti p, s
ct
ng g i khi h y b t.
Thu h i vù
vùng nh cho các d li u thà

thành viên là con tr .

Destructor

class Set {
private:
int *elems;
int maxCard;
int card;
public:
Set(const int size) { …… }
~Set() { delete[] elems; }
….
};

T.P.TU N - LTH T

50

Hàm h y

void main()
{
Date d;
f1();
}
9/6/2009

Destructor


Date::~Date()
{
cerr << y << m << d <<” bye!” << endl;
}
...

T.P.TU N - LTH T

myCalendar.cpp:
#include ”date.h”;
void f1()
{
Date d(2007, 1, 1);
}

Date::Date()
{
y = 2000;
m = 1;
d = 1;
}

51

9/6/2009

Set TestFunct1(Set s1) {
Set *s = new Set(50);
return *s;
}

void main() {
Set s1(40), s2(50);
s2 = TestFunct1(s1);
}

T.P.TU N - LTH T

ng c ng
có bao nhiêu
l n hàm h y
cg i?

52


5. Hàm b n, l p b n

5. Hàm b n, l p b n
Hàm SetToReal
dùng
chuy n
p s nguyên
thành t p s th c

p Các
Nguyên
class IntSet {
public:
//...
private:

int elems[maxCard];
int card;
};

IntSet là b n (friend
friend) c a l p RealSet.

void IntSet::SetToReal (RealSet &set) {
set.card = card;
for (register i = 0; i < card; ++i)
set.elems[i] = (float) elems[i];
}

class RealSet {
public:
//...
p Các
private:
Th c
float elems[maxCard];
int card;
};

Gi nguyên nh
ngh a c a l p IntSet

Làm th nào
th c hi n
c
vi c truy xu t

n thành viên
Private ?

53

T.P.TU N - LTH T

9/6/2009

Cách 1: Khai báo hàm thành viên c a l p

Thêm dòng khai báo
Friend cho
hàm thành viên
SetToReal

class RealSet {
public:
//...
friend void IntSet::SetToReal
SetToReal (RealSet&);
private:
float elems[maxCard];
int card;
};
T.P.TU N - LTH T

9/6/2009

54


5. Hàm b n, l p b n

5. Hàm b n, l p b n
Cách 2:

Hàm b n:

Chuy n hàm SetToReal ra ngoài ( c l p).
Khai báo hàm ó là b n a c 2 l p.
class IntSet {
public:
//...
friend void SetToReal (IntSet &, RealSet&);
private:
int elems[maxCard];
int card;
};
class RealSet {
public:
//...
friend void SetToReal (IntSet &, RealSet&);
private:
float elems[maxCard];
int card;
};
9/6/2009

class IntSet {
public:

//...
private:
int elems[maxCard];
int card;
};

T.P.TU N - LTH T

Có quy n truy xu t n t t c các d li u và
hàm thành viên (protected + private) c a 1 l p.

void SetToReal (IntSet& iSet,
RealSet& rSet )
{
rSet.card = iSet.card;
for (int i = 0; i < iSet.card; ++i)
rSet.elems[i] =
(float) iSet.elems[i];
}

L p b n:
t c các hàm trong l p b n: là hàm b n.
class A;
class B { // ……….
friend class A;
};

Hàm c l p
là b n(friend)
a c 2 l p.

55

9/6/2009

class IntSet { ……….. }
class RealSet { // ……….
friend class IntSet;
};

T.P.TU N - LTH T

56


5. Hàm b n, l p b n

5. Hàm b n, l p b n
class CDate
CStudent is a class
{
friend CStudent; // friend class
private:
int d,m,y;
public:
friend void HoanVi(CDate &a,CDate &b);
//friend function
};
9/6/2009

T.P.TU N - LTH T


57

9/6/2009

T.P.TU N - LTH T

59

void HoanVi(CDate &a,CDate &b)
{
int tam;
tam=a.d;a.d=b.d;b.d=tam;
tam=a.m;a.m=b.m;b.m=tam;
tam=a.y;a.y=b.y;b.y=tam;
}

class CStudent
{
private:
int id;
CDate ns;
public:
void setns(int d,int m,int y)
{
ns.d=d; ns.m=m; ns.y=y;
}
};
9/6/2009


T.P.TU N - LTH T

58



×