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

CHƯƠNG 5 CÁC CÁCH TẠO ĐỐI TƯỢNG docx

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 (1.11 MB, 37 trang )

CH
ƯƠ
NG
CH
ƯƠ
NG
5
CÁC CÁCH T

O Đ

I T
ƯỢ
NG
CÁC CÁCH T

O Đ

I T
ƯỢ
NG
1
OOP-CHƯƠNG 5-TẠO ĐỐI TƯỢNG
GV: Võ Hồng Bảo Châu
MỤC TIÊU
y N

m rõ h
ơ
n
v



các trư

n
g
h

p
t

o
đ

i tư

n
g
.
2
g

p


g
y Hiểu được khái niệm static, viết một vài chương
trình s

d


ng bi
ế
n và ph
ươ
ng th

c
static
trình s

d

ng bi
ế
n và ph
ươ
ng th

c
static
.
y Nắm vững khái niệm và cách sử dụng hàm friend
OOP-CHƯƠNG 5-TẠO ĐỐI TƯỢNG
GV: Võ Hồng Bảo Châu
NỘI DUNG CHI TIẾT
y CÁCH KHAI BÁO BI

N
3
y CÁCH CẤP PHÁT BỘ NHỚ

y Đ

I TƯ

NG LÀ THÀNH PH

N C

A
LỚP

y LỚP CÓ DỮ LIỆU STATIC
y HÀM FRIEND
y CON TRỎ THIS
OOP-CHƯƠNG 5-TẠO ĐỐI TƯỢNG
GV: Võ Hồng Bảo Châu
TẠO 1 ĐỐI TƯỢNG BẰNG CÁCH KHAI BÁO BIẾN
y Dùn
g

p

ơ
n
g
th

c thi
ế
t l


p
chu

n
4
gp
g

p
Ví dụ:
V
ECTOR a;
y Sử dụng phương thức thiết lập có tham số
V
í d

:

VECTOR a(10), b(10,3.5);
y Tạo
đ

i tư

n
g
t

đ


i tư

n
g
đã có – Tạo bản sao
g
g
Ví dụ:
V
ECTOR a;
V
ECTOR a;
V
ECTER b(a)
V
ECTOR b = a;
OOP-CHƯƠNG 5-TẠO ĐỐI TƯỢNG
GV: Võ Hồng Bảo Châu
TẠO NHIỀU ĐỐI TƯỢNG BẰNG CÁCH KHAI BÁO BIẾN
y S

d

n
g

p

ơ

n
g
th

c thi
ế
t l

p
chu

n
5

gp
g

p
Ví dụ:
V
ECTOR a[5];
y Sử dụng phương thức thiết lập có một tham số
V
í d

:

VECTOR a[2]={10,20};
y S


d

n
g

p

ơ
n
g
th

c thi
ế
t l

p
nhi

u tham s


gp
g

p
Ví dụ:
V
ECTOR a[2]={VECTOR(10,3.5),VECTOR(20,1.6};
OOP-CHƯƠNG 5-TẠO ĐỐI TƯỢNG

GV: Võ Hồng Bảo Châu
Đối tượng là thành phần của lớp
y Đ

i tư

n
g
có th

là thành
p
h

n của đ

i tư

n
g
khác
,
khi
6
ợ g p ợ g,
một đối tượng thuộc lớp “lớn” được tạo ra, các thành phần
của nó cũng được tạo ra. Phương thức thiết lập (nếu có) sẽ
đ t độ ih áđốit thà h hầ
đ
ược

t

độ
n
g

g

i
c
h
o c
á
c
đối

t
ượn
g

thà
n
h
p
hầ
n.
y Nếu đối tượng thành phần phải được cung cấp tham số khi
thiếtlậpthìđốitượng kếthợp(đốitượng lớn)
phảicó
thiết


lập

thì

đối

tượng

kết

hợp

(đối

tượng

lớn)

phải



phương thức thiết lập để cung cấp tham số thiết lập cho
các đ

i tư

n
g

thành
p
h

n.
ợ gp
OOP-CHƯƠNG 5-TẠO ĐỐI TƯỢNG
GV: Võ Hồng Bảo Châu
VÍ DỤ
class Diem{
7
double x,y;
public:
Diem(double xx, double yy) {x = xx; y = yy;}
//
};
class TamGiac{
Diem A,B,C;
public:
//
};
void main(){
TamGiac t; // Bao sai
Diem D;
}
OOP-CHƯƠNG 5-TẠO ĐỐI TƯỢNG
GV: Võ Hồng Bảo Châu
Đối tượng là thành phần của lớp
y Cú
p


p
đ

khởi t

o đ

i tư

n
g
thành
p
h

n là dùn
g
d

u hai
8
pp ạ ợ gp g
chấm (:) theo sau bởi tên thành phần và tham số khởi tạo.
y Khi đối tượng kết hợp bị huỷ đi thì các đối tượng thành

p
h

n của nó cũn

g
bị hu

đi, n
g
hĩa là phươn
g
thức hu

bỏ
sẽ được gọi cho các đối tượng thành phần, sau khi phương
thứchuỷ bỏ của đốitượng kếthợp đượcgọi
thức

huỷ

bỏ

của

đối

tượng

kết

hợp

được


gọi
.
OOP-CHƯƠNG 5-TẠO ĐỐI TƯỢNG
GV: Võ Hồng Bảo Châu
class Diem
{
double x
,y;
VÍ DỤ
9
,y;
public:
Diem(double xx, double yy {x = xx; y = yy;}
//
};
KH

I

T

O
Đ

I


};
class TamGiac
{




O


TƯỢNG THÀNH
PHẦN, DÙNG DẤU
HAI CH

M
Đ

i tượng thành
phần
{
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)
{}
HAI CH

M
yC)
:
A(xA
,

yA)
,
B(xB
,
yB)
,
C(xC
,
yC)
{}
void Ve() const;
//
};
void main(){
TamGiac t(100,100,200, 400,300,300);
OOP-CHƯƠNG 5-TẠO ĐỐI TƯỢNG
}
GV: Võ Hồng Bảo Châu
Đối tượng là thành phần của lớp
10
y Khi đó trình t

th

c hi

n của các
p

ơ

n
g
th

c thi
ế
t



p
g
lập và phương thức hủy bỏ theo quy tắc sau:
{ Phương thức thiết lập của các lớp thành phần được thực hiện
tr
ướ
c ph
ươ
ng th

c thi
ế
t l

p c

a l

p
tr

ướ
c ph
ươ
ng th

c thi
ế
t l

p c

a l

p
{ Phương thức hủy bỏ của lớp thành phần thực hiện sau phương
thức hủy bỏ của lớp,
{ Trong các thành phần của lớp, thành phần nào được khai báo
trước, phương thức thiết lập sẽ thực hiện trước.
{
Trong các thành ph

n c

a l

p thành ph

n nào đ
ượ
c khai báo

{
Trong các thành ph

n c

a l

p
,
thành ph

n nào đ
ượ
c khai báo
trước, phương thức hủy bỏ sẽ thực hiện sau.
OOP-CHƯƠNG 5-TẠO ĐỐI TƯỢNG
GV: Võ Hồng Bảo Châu
ĐỐI TƯỢNG LÀ THÀNH PHẦN CỦA MẢNG
11
y S

d

n
g
mản
g
các
đ


i tư

n
g
là m

t cách ti
ế
p
c

n

g
g

g

p

truyền thống.
y Tuy nhiên,
{ Có thể sử dụng mảng các đối tượng của lớp ngay chính trong lớp
OOP-CHƯƠNG 5-TẠO ĐỐI TƯỢNG
GV: Võ Hồng Bảo Châu
Ví dụ
12
class SEQUENCE{
double data;
public:

SEQUENCE();
SEQUENCE( SEQUENCE*, int );
id d ( SEQUENCE* i t )
vo
id
reor
d
er
( SEQUENCE*
,
i
n
t )
;
void out( SEQUENCE*, int );
};
};
OOP-CHƯƠNG 5-TẠO ĐỐI TƯỢNG
GV: Võ Hồng Bảo Châu
Từ đó
13
class MAIN{
SEQUENCE
*
u;
SEQUENCE u;
public:
MAIN( int = 2 );
~MAIN();
}

}
;
MAIN::MAIN( int size ){
u = new SEQUENCE[size];
SEQUENCE a(u,size);
SEQUENCE a(u,size);
a.reorder( u, size );
a.out( u, size );
}
MAIN:: MAIN(){
MAIN::
~
MAIN(){
delete []u;
}
OOP-CHƯƠNG 5-TẠO ĐỐI TƯỢNG
GV: Võ Hồng Bảo Châu
14
void main()
{
MAIN ob
j
ect(5)
;
j;
}
OOP-CHƯƠNG 5-TẠO ĐỐI TƯỢNG
GV: Võ Hồng Bảo Châu
TẠO MẢNG
TẠO PTỬ 1 TẠO PTỬ 2 …TẠO PTỬ 3

15
Gọi Gọi Gọi
Gọi
PHƯƠNG THỨC
THIẾT LẬP
PHƯƠNG THỨC
THIẾT LẬP
PHƯƠNG THỨC
THIẾT LẬP
PHƯƠNG THỨC
THIẾT LẬP
-Lớp không có phương
thức thiết lập.
Lớpcóphương thức
CÁC PHẦN TỬ PHẢI CÓ KHẢ NĂNG
TỰ KHỞI TẠO

Lớp



phương

thức

thiết lập không tham số.
–Lớp có phương thức
thiết lập mà mọi tham số
đều có giá trị mặc nhiên
OOP-CHƯƠNG 5-TẠO ĐỐI TƯỢNG

GV: Võ Hồng Bảo Châu
class Diem {
double x,y;
p
ublic:
class String {
char *p;
public:
p
Diem(double xx, double yy):
x(xx), y(yy) {}
void Set(double xx, double yy) {x
xx y yy;}
String(char *s) {p = strdup(s);}
String(const String &s) {p = strdup(s.p);}
~String() {
cout
<< "
delete
"<<
(void
*
)p
<< "
\
n
"
;
16
=

xx
,
y
=
yy;}
//
};
cout

delete

(void

)p

\
n;
delete [] p;
}
//
class SinhVien
{
String MaSo;
St i H T
St
r
i
ng
H
o

T
en;
int NamSinh;
public:
SinhVien
(
char *ht
,
char *ms
,
int ns
)
:HoTen
(
ht
),
MaSo
(
ms
),
NamSinh
(
ns
){}
(, ,)(),(), (){}
//
};
String as[3]; // Bao sai
Diem ad[5]; // Bao sai
Diem


ad[5];

//

Bao

sai
SinhVien asv[7]; // Bao sai
OOP-CHƯƠNG 5-TẠO ĐỐI TƯỢNG
GV: Võ Hồng Bảo Châu
class Diem
{
double x
,y;
class String
{
char
*
p;
,y;
public:
Diem(double xx = 0, double yy =
0):x(xx), y(yy){}
void Set(double xx double yy) {x
char

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

String(const String &s) {p = strdup(s.p);}
S i () { "d l " ( id *) "
\
"
17
void Set(double xx
,
double yy) {x
= xx, y = yy;}
//
}
;
~
S
tr
i
ng
()

{
cout <<
"d
e
l
ete
"
<<
(
vo
id


*)
p <<
"
\
n
"
;
delete [] p;
}
}
class SinhVien{
String MaSo;
String HoTen;
itN Sih
Dùng phương thức thiết lập với
th ố óiátị ặ đị h
i
n
t

N
am
Si
n
h
;
public:
SinhVien(char *ht = “Nguyen Van A”, char *ms =“19920014”, int ns = 1982):HoTen(ht),
MaSo

(
ms
),
NamSinh
(
ns
){}
th
am s

c
ó
g


t
r

m

c
đị
n
h
(), (){}
//
};
String as[3]; // Ok: Ca ba phan tu deu la chuoi rong
Diem ad[5]; // Ok: ca 5 diem deu la (0 0)
Diem ad[5]; // Ok: ca 5 diem deu la (0

,
0)
SinhVien asv[7]; // Ok: Het sai ca 7 sinh vien deu co cung ten, ma so, nam sinh
OOP-CHƯƠNG 5-TẠO ĐỐI TƯỢNG
GV: Võ Hồng Bảo Châu
class Diem
{
dbl
class String
{
char
*
p;
d
ou
bl
e x,y;
public:
Diem(double xx, double yy):
x
(
xx
),

y(yy){}
char

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

String() {p = strdup(“”);}
S i () { "d l " ( id *) "
\
"
18
( ), y(yy){}
Diem():x(0), y(0){}
//
};
~
S
tr
i
ng
()

{
cout <<
"d
e
l
ete
"
<<
(
vo
id

*)
p <<

"
\
n
"
;
delete [] p;
}
class SinhVien {
String MaSo;
String HoTen;
itN Sih
Dùng phương thức thiết lập không
th ố
i
n
t

N
am
Si
n
h
;
public:
SinhVien(char *ht, char *ms, int ns):HoTen(ht),MaSo(ms), NamSinh(ns){}
SinhVien
()
:HoTen
(
“N

g
u
y
en Van A”
),
MaSo
(
“19920014”
),
NamSinh
(
1982
){}
th
am s

() ( g y ), ( ), ( ){}
//
};
String as[3]; // Ca ba phan tu deu la chuoi rong
Diem ad[5]; // ca 5 diem deu la (0 0)
Diem ad[5]; // ca 5 diem deu la (0
,
0)
SinhVien asv[7];// Ca 7 sinh vien deu co cung hoten,maso, namsinh
OOP-CHƯƠNG 5-TẠO ĐỐI TƯỢNG
GV: Võ Hồng Bảo Châu
ĐỐI TƯỢNG ĐƯỢC CẤP PHÁT ĐỘNG
y Đ


i tư

n
g
đư

c c
ấp

p
hát đ

n
g
là các đ

i tư

n
g
đư

c t

o
19
ợ g ợ pp ộ g ợ g ợ ạ
ra bằng phép toán new và bị huỷ đi bằng phép toán delete
y Phép toán new cấp đối tượng trong vùng heap (hay vùng
ế ố

free store) và
g
ọi phươn
g
thức thi
ế
t lập cho đ

i tượn
g

được cấp.
Dù ó hể ấ ộ đối àdù d l để h ỷ
y

n
g
new c
ó
t
hể
c

p m

t
đối
tượn
g
v

à


n
g

d
e
l
ete
để

h
u


một đối tượng.
y
Dùng new và delete cũng có thể cấp nhiều đốitượng và
y
Dùng

new



delete

cũng




thể

cấp

nhiều

đối

tượng



huỷ nhiều đối tượng
OOP-CHƯƠNG 5-TẠO ĐỐI TƯỢNG
GV: Võ Hồng Bảo Châu
CẤP VÀ HỦY 1 ĐỐI TƯỢNG
class Diem
{
class String {
char
*
p;
20
{
double x,y;
public:
Diem(double xx, double
yy):x(xx) y(yy){};

char

p;
public:
String(char *s) {p = strdup(s);}
String(const String &s) {p = strdup(s.p);}
Si (){dl [] }
yy):x(xx)
,
y(yy){};
//
};
~
S
tr
i
ng
()

{d
e
l
ete
[]
p;
}
//
};
i*i i
i

nt
*
p
i
= new
i
nt;
int *pj = new int(15);
Diem *pd = new Diem(20,40);
Strin
g
*
p
a = new Strin
g(
"N
g
u
y
en Van A"
);
gp g( gy );
//
delete pa;
delete pd;
delete pj;
C
ấp
và hủ
y

m

t đ

i tư

n
g
delete

pj;
delete pi;
p y ộ ợ g
OOP-CHƯƠNG 5-TẠO ĐỐI TƯỢNG
GV: Võ Hồng Bảo Châu
CẤP VÀ HỦY NHIỀU ĐỐI TƯỢNG
y Tron
g
trườn
g
h
ợp
c
ấp
nhi

u đ

i tư


n
g,
ta khôn
g
th

cun
g

21
g g ợp p ợ g, g g
cấp tham số cho từng phần tử được cấp:
y int *pai = new int[10];
y Diem *pad = new Diem[5]; // Bao sai
y String *pas = new String[5]; // Bao sai
y Lỗi trên được khắc phục bằng cách cung cấp phương thức
thiết lập để đối tượng có khả năng tự khởi tạo.
OOP-CHƯƠNG 5-TẠO ĐỐI TƯỢNG
GV: Võ Hồng Bảo Châu
CẤP VÀ HỦY NHIỀU ĐỐI TƯỢNG
class String
{
Khi đó mọi phần tử được cấp đều được
khởi độ ớiù iátị
22
{
char *p;
public:
String(char *s = "Alibaba") {p = strdup(s);}
St i ( t St i & ) { t d ( ) }

khởi

độ
ng v
ới
c
ù
ng g


t
r

int *pai = new int[10];
Diem *pad = new Diem[5];
//

ca

5

d
i
e
m
co

cu
n
g


toa

do

(0,0)
St
r
i
ng
(
cons
t

St
r
i
ng
&
s
)

{
p = s
t
r
d
up
(
s.p

)
;
}
~String() {delete [] p;}
//
};
//ca5de cocu gtoado(0,0)
String *pas = new String[5];
// Ca 5 chuoi cung duoc khoi dong bang
“Alibaba”
Việchuỷ nhiều đốitượng đượcthực
};
class Diem
{
double x,y;
public:

Việc

huỷ

nhiều

đối

tượng

được

thực


hiện bằng cách dùng
delete và có thêm dấu [] ở trước.

delete
[]

p
as;
public:
Diem(double xx, double yy):x(xx),y(yy){};
Diem():x(0),y(0){};
//
[] p
– delete [] pad;
– delete [] pai;
}
OOP-CHƯƠNG 5-TẠO ĐỐI TƯỢNG
GV: Võ Hồng Bảo Châu
Lớp có dữ liệu static
23
y Nh

m
đ

các
đ

i tư


n
g
của l

p
cùn
g
chia sẻ
v
ùn
g
b


g
pg
g

nhớ
y Dữ liệu static còn gọi là thành viên tĩnh của lớp.
y Trong ngôn ngữ lập trình hướng đối tượng, loại thành
viên này thường được gọi là biến lớp (class variables)



y T

đó có th


s

dụng nó mà không c

n tạo
đ

i tư

ng
thuộc lớp.
D á đ

i
ù h hi

bi
ế
i à
y
D
o

c
á
c
đ

i



ng

c
ù
ng

n
h
au

c
hi
a

s

bi
ế
n

stat
i
c

n
à
y,

nên nó phải được khai báo như biến toàn cục

y
Gi

ng nh
ư
2 ng
ườ
i (2 đ

i t
ượ
ng) hùn ti

n mua 1 món
OOP-CHƯƠNG 5-TẠO ĐỐI TƯỢNG
y
Gi

ng nh
ư
2 ng
ườ
i (2 đ

i t
ượ
ng) hùn ti

n mua 1 món
đồ nên 2 người có thể xài chung món đồ đó

GV: Võ Hồng Bảo Châu
Thay a bằng bất
k

đ

i tượn
g
nào,
24

g
kết quả cũng như
nhau
ế


Bi
ế
n count
đ
ư

c khai báo static
đ

liên hệ các
đ

i

tượng với nhau. Mỗi lần tạo 1 đối tượng thì biến count
tăng 1 h

y 1 đ

i t
ượ
ng thì bi
ế
n count gi

m 1
tăng 1
,
h

y 1 đ

i t
ượ
ng thì bi
ế
n count gi

m 1
.
OOP-CHƯƠNG 5-TẠO ĐỐI TƯỢNG
GV: Võ Hồng Bảo Châu
Lớp có phương thức static
25

y Phư
ơ
n
g
th

c static là
p

ơ
n
g
th

c có th

g

i th

c
g
p
g
g


hiện ngay cả khi chưa tạo đối tượng thuộc lớp.
y Phương thức static là phương thức để cho các đối



ng của l

p cùng chia sẻ.
y Chẳng hạn, như trong ví dụ trên, phương thức
bP ()
num
b
er
P
erson
()
.
OOP-CHƯƠNG 5-TẠO ĐỐI TƯỢNG
GV: Võ Hồng Bảo Châu

×