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

CHƯƠNG 4: PHƯƠNG THỨC TỰ THỰC HIỆN pps

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 (849.46 KB, 13 trang )

4/14/2010
1
1
CHƯƠNG 4
PHƯƠNG THỨC TỰ THỰC HIỆN
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
GV: Võ Hồng Bảo Châu
2
MỤC TIÊU
y Hiểu rõ phương thức thiết lập, huỷ bỏ và thiết lập sao
chép.
y Xây dựng lớp có các phương thức tự động thực hiện.
y Sử dụng được các lớp theo nghĩa hướng về với đối


ế

OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN


n
g
(tạo đ

i tư

n
g
, thì đ

i tư



n
g
tự
g
iải
q
u
y
ế
t v

n
đề nào đó)
GV: Võ Hồng Bảo Châu
3
NỘI DUNG CHI TIẾT
y KHÁI NiỆM
y PHƯƠNG THỨC THIẾT LẬP
y PHƯƠNG THỨC HỦY BỎ
y PHƯƠNG THỨC THIẾT
L

P T

O BẢN SAO
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN


GV: Võ Hồng Bảo Châu

44
Phương thức tự động thực hiện
y Trong C++ có 2 phương thức thuộc loại này:
{ Phương thức thiết lập (constructor)
{ Phương thức hủy bỏ (destructor)
y Chương trình mang đúng nghĩa hướng về với đối
t
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
t
ư

n
g
:
{ Khi tạo ra đối tượng, một số hành vi sẽ thực thi vào thời điểm
đó.
GV: Võ Hồng Bảo Châu
4/14/2010
2
55
Khi đó,
y Đối tượng không chỉ đơn thuần là dữ liệu có cấu trúc
đã được tạo ra.
y Mà còn,
{ Mang tính hành động: một hoặc một số hành vi nào đó của nó
đ
c thi hành
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
đ
ư


c thi hành
.
y Và ngược lại,
{ Khi đối tượng mất đi, sẽ có một số hành động được thực thi.
GV: Võ Hồng Bảo Châu
66
Phương thức thiết lập
y Được thực hiện một cách tự động ngay sau khi đối
tượng được tạo ra.
y Nhằm thực hiện một số công việc ban đầu như:
{ Tạo ra vùng bộ nhớ
{
Sao chép, kh

i t

o giá tr

ban đ

u cho d

li

u
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
{
Sao chép, kh


i t

o giá tr

ban đ

u cho d

li

u
{ v.v
y Lớp trong C++ có thể có hoặc không có phương thức
thiết lập
y Khi không có, một số hành động sau được thực hiện:
{ Dành bộ nhớ cho các dữ liệu
{ Khởi tạo giá trị không cho tất cả các byte của dữ liệu
GV: Võ Hồng Bảo Châu
77
y Trong C++, phương thức thiết lập có tên trùng với tên
của lớp, không có kiểu trả về. Chẳng hạn,
p

ơ
n
g
th

c thiết l


p,

OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
p
g

p,
tên giống tên lớp
Tạo ra đối tượng p
Tự động gọi phương
thức thiết lập
GV: Võ Hồng Bảo Châu
88
y Khi tạo đối tượng, nếu không chỉ định thêm bất kỳ
điều gì. Chẳng hạn,
STACK S;
y Thì phương thức thiết lập chuẩn được gọi thực hiện
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
một cách tự độn
g
.
Không có phương
thức thiết lập
Không báo lỗi vì có
pthức thiết lập chuẩn
được gọi tự động
GV: Võ Hồng Bảo Châu
4/14/2010
3
99

Vậy, thế nào là constructor chuẩn
y Phương thức thiết lập chuẩn là phương thức thiết lập
không có tham số.
y Hoặc phương thức thiết lập với tất cả các tham số
được gán giá trị đầu. Chẳng hạn,
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
STACK( unsigned int = 1237 );
VECTOR( int = 2;double = 3.5 );
Phương thức thiết lập có thuộc
tính truy cập là public.
GV: Võ Hồng Bảo Châu
1010
class PointPoint {
int xVal, yVal;
public:
Point ()
// Hàm thiết lập chuẩn
{ xVal = 0; yVal = 0; }
Point (int x, int y) {
xVal = x;
y
Val =
y
;
y Một lớp có thể có nhiều
phương thức thiết lập.
y Chúng khác nhau qua
danh sách tham số.
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
yy

}
void OffsetPt (int , int ); …
};
void main() {
Point p1;
Point p2(10,20);
}
y Đây chính là khả năng
định nghĩa chồng lên
nhau (overloading) của
các hành vi trong lớp.
GV: Võ Hồng Bảo Châu
11
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
GV: Võ Hồng Bảo Châu
12
Gợi ý khi xây dựng constructor
y Việc thường làm là gán trị cho các thành phần dữ liệu
của đối tượng.
y Số constructor có trong một lớp thường là những
dạng dữ liệu của đối tượng mà ta muốn có ngay lúc
b đ

OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
b
an
đ

u.
GV: Võ Hồng Bảo Châu

4/14/2010
4
1313
Phương thức hủy bỏ
y Phương thức hủy bỏ (destructor) được thực hiện trước khi
đối tượng bị mất đi (trước khi vùng bộ nhớ dành cho đối
tượng bị thu hồi).
y Sử dụng mang tính dọn dẹp, hoặc thông báo về sự kết
thúc hoạt động.
y
Trong C++ ph
ươ
ng th

c h

y b

đ
ượ
c vi
ế
t nh
ư
sau:
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
y
Trong C++
,
ph

ươ
ng th

c h

y b

đ
ượ
c vi
ế
t nh
ư
sau:
~ClassName()
y Một lớp chỉ có 1 phương thức hủy bỏ
y 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.
y 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.
GV: Võ Hồng Bảo Châu
14
Tổng cộng
có bao bao
nhiêu lnhiêu l
ầầ
nn
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
nhiêu lnhiêu l
ầầ

nn
hàm hủy
được gọi ?
GV: Võ Hồng Bảo Châu
15
BÀI TẬP LÀM TẠI LỚP
y Xây dựng lớp PhanSo gồm 2 thành phần tử số và mẫu số.
Viết hàm thiết lập (có và không có tham số) và hàm hủy
bỏ đáp ứng yêu cầu của hàm main sau:
void main()
{
PhanSo a;
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
PhanSo a;
PhanSo b(1,2),c(3,4);
getch();
}
Cho biết hàm thiết lập, hủy bỏ được gọi bao nhiêu lần và thứ
tự thiết lập, hủy bỏ các đối tượng.
Thời gian làm bài: 5 phút.
GV: Võ Hồng Bảo Châu
16
y Xây dựng lớp NhietDo gồm 2 thành phần giá trị (số
thực) và loại (ký tự, C hoặc F). Viết các hàm cần thiết
để hàm main sau đây chạy đúng
void main()
{
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
{
NhietDo a(20,’C’),b(135,’F’);

NhietDo c,d;
}
Cho biết thứ tự thực hiện của hàm thiết lập và hủy bỏ
Thời gian làm bài: 5 phút.
GV: Võ Hồng Bảo Châu
4/14/2010
5
1717
Phương thức thiết lập tạo bản sao
y Còn gọi là Copy Constructor.
y Mục tiêu
{ Nhằm để tạo ra bản sao của đối tượng, trong đó quản lý chặt chẽ
những gì được làm, được sao chép
{
Qu

n lý b

n sao c

a đ

i t
ượ
ng đ
ượ
c t

o ra
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN

{
Qu

n lý b

n sao c

a đ

i t
ượ
ng đ
ượ
c t

o ra
Đây là phương thức có trong C++
GV: Võ Hồng Bảo Châu
1818
Trường hợp tạo bản sao
y Khi cần tạo bản sao, có thể viết như sau:
EXAMPLE A;
EXAMPLE B = A;
y Khi đó
B
là bản sao của đối tư

n
g
A, nhữn

g

g
ì đư

c
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
g
gg
làm khi sao chép sẽ được quy định trong phương thức
thiết lập tạo bản sao của lớp EXAMPLE.
GV: Võ Hồng Bảo Châu
1919
y Với cách viết EXAMPLE B = A, chẳng qua để dễ sử
dụng – đồng nhất việc gán với việc sao chép. Thực
chất, câu lệnh này là:
EXAMPLE B(A)
y
Cũng c

n l
ư
u ý thêm câu l

nh gán ch

gán giá tr

OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
y

Cũng c

n l
ư
u ý thêm
,
câu l

nh gán ch

gán giá tr

B = A;
y Hoàn toàn khác câu lệnh – tạo đối tượng
EXAMPLE B = A;
GV: Võ Hồng Bảo Châu
2020
Cách thức viết copy constructor
y Phương thức thiết lập tạo bản sao là một phương thức
như mọi phương thức khác, nên chứa các câu lệnh
cần thực hiện.
y Tuy nhiên, do đặc thù là được điều khiển một cách tự
đ

ê tê
i à th

đ



OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
đ

n
g
,

n
ê
n

n
g

i
v
à th
am

s

đ
ư

c
q
u
y
ư


c:
ClassName( ClassName& )
GV: Võ Hồng Bảo Châu
4/14/2010
6
2121
y Trong lớp này, khi một bảo sao của đối tượng (được
truyền qua tham số) được tạo ra, chỉ thành phần dữ
liệu n của lớp mới có giá trị giống giá trị n của bản gốc
y Nói cách khác, nó chỉ "bắt chước" thành phần dữ liệu
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
n.
GV: Võ Hồng Bảo Châu
2222
Ví dụ
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
GV: Võ Hồng Bảo Châu
2323
y Một lớp luôn luôn có 1 phương thức thiết lập tạo bản
sao.
y Phương thức đó có thể hiện thực hay không hiện thực.
y Khi không hiện thực, một phương thức tạo bản sao



OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
chu

n sẽ âm th


m t

n tại.
Nguy hiểm trong lập trình là khi mọi thứ
diễn ra một cách âm thầm, người lập trình
không hay biết
GV: Võ Hồng Bảo Châu
24
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
Không có hàm thiết lập sao chép, hàm thiết
lập sao chép chuẩn sẽ được gọi
GV: Võ Hồng Bảo Châu
4/14/2010
7
2525
y Phương thức thiết lập tạo bản sao được thi hành khi:
{ Khởi tạo đối tượng bởi đối tượng đã có
{ Tham số thực được truyền cho tham số giá trị của một
phương thức nào đó.
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
{ Phương thức trả đối tượng của lớp trở về thông qua
tên gọi (return Obj)
GV: Võ Hồng Bảo Châu
26
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
Hàm thiết lập sao chép được gọi khi tham số thực
được truyền cho tham số giá trị của một phương
thức nào đó.
GV: Võ Hồng Bảo Châu
27

OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
Hàm thiết lập tạo bản sao được gọi khi phương thức
trả đối tượng của lớp trở về thông qua tên gọi
(return Obj)
GV: Võ Hồng Bảo Châu
28
y VẬY NẾU KHÔNG VIẾT COPY CONSTRUCTOR
THÌ COPY CONSTRUCTOR CHUẨN SẼ ĐƯỢC GỌI
y => COPY CONSTRUCTOR CÓ CŨNG ĐƯỢC,
KHÔNG CÓ CŨNG ĐƯỢC
Ô


OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
y =>COPY CONSTRUCTOR KH
Ô
NG C

N THI

T?
??
GV: Võ Hồng Bảo Châu
4/14/2010
8
2929
Lưu ý
y Vấn đề chỉ nảy sinh phức tạp khi việc cấp phát và thu
hồi bộ nhớ được thực thi.
y Bởi khi đó, có thể vô tình thu hồi vùng bộ nhớ đang

được sử dụng bởi một bản sao nào đó.
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
GV: Võ Hồng Bảo Châu
3030
Xét lớp VECTOR như sau
class VECTOR{
int size;
double *data;
public:
VECTOR( int
=
2 );
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
VECTOR( int 2 );
VECTOR( VECTOR& );//copy constructor
~VECTOR();
void setData( double = 0.0 );
void outData();
}
GV: Võ Hồng Bảo Châu
3131
y Nếu không có phương thức thiết lập tạo bản sao, hoặc
viết không đúng yêu cầu. Một vùng bộ nhớ bị thu hồi
hai lần
y Bởi thực chất có 2 đối tượng, nhưng trong trường hợp
à

hi đ

i t

à ó h

t ù b

h

OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
n
ày
c

h
a
i đ

i t
ư

n
g
n
ày
c
ó
c
h
un
g
m


t
v
ù
n
g b

n
h

.
GV: Võ Hồng Bảo Châu
3232
Chúng ta xem xét cụ thể hơn
VECTOR::VECTOR( int n ){
size = n;
data = new double[size];
setData();
cout <<
"
Object at
"
<< data << endl;
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
cout << Object at << data << endl;
}
VECTOR::~VECTOR(){
cout << "Memory location << data
<< "has been destroyed\n";
delete []data;
}

GV: Võ Hồng Bảo Châu
4/14/2010
9
3333
VECTOR::VECTOR( VECTOR& V ){
size = V.size;
data = new double[size];
cout<<“copy constructor”<<endl;
cout << "Object at " << data << endl;
setData();
}
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
void VECTOR::setData( double a ){
for ( int i = 0; i < size; i++ )
data[i] = a;
}
void VECTOR::outData(){
for ( int i = 0; i < size; i++ )
cout << data[i] << ", ";
cout << endl;
}
GV: Võ Hồng Bảo Châu
3434
Khởi tạo đối tượng
void main(){
VECTOR u;
u.outData();
VECTOR v = u
;
Object at 0x8f7d128e

0, 0,
copy constructor
Object at 0x8f7d12a2
0, 0,
Memory location0x8f7d12a2has been destroyed
Memory location
0x8f7d128e
has been destroyed
Có phương thức
copy constructor
Hai đối tượng có
2 vùng nhớ
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
;
v.outData();
}
Memory

location
0x8f7d128e
has

been

destroyed
Object at 0x8f75126e
0, 0,
0, 0,
Memory location0x8f75126ehas been destroyed
Memory location0x8f75126ehas been destroyed

Không có phương
thức copy
constructor
Hai đối tượng có 1
vùng nhớ. 1 vùng
nhớ bị thu hồi 2 lần.
GV: Võ Hồng Bảo Châu
3535
Lưu ý
y Với phương thức thiết lập của lớp VECTOR như trên,
chúng ta có thể viết
VECTOR u = 5;
y Trường hợp này đồng nghĩa với
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
VECTOR u(5);
y Nên phương thức thiết lập tạo bản sao không được gọi
đến
GV: Võ Hồng Bảo Châu
Tham số giá trị
y Khi truyền tham số thực cho tham số giá trị của
một phương thức, thì phương thức thiết lập tạo bản
sao sẽ được gọi đến.
y Chẳng hạn, để tính tích vô hướng của hai vector
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
36

=
=
n
i

ii
vuvu
1
),(
GV: Võ
Hồng Bảo
Châu
4/14/2010
10
3737
double VECTOR::scalar(VECTOR v){
double t = 0.0;
for(int i = 0; i<size; i++ )
t += data
[
i
]
*v.data
[
i
];
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
[] [];
return t;
}
GV: Võ Hồng Bảo Châu
3838
y Chương trình gọi có thể viết
VECTOR u(5), v(5);
u.setData

(
2.0
);
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
();
v.setData(3.0);
cout << "(u,v) = "
<< u.scalar(v) << endl;
GV: Võ Hồng Bảo Châu
3939
y Để kiểm tra sự hoạt động của trường hợp này, chúng
ta không hiện thực phương thức thiết lập tạo bản sao.
y Một bản sao của v được tạo ra; khi hàm scalar()
thực hiện xong, địa chỉ data của bản sao này được
th h

i (d ó h
th

h

b

)
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
th
u
h

i (d

o

c
ó ph
ư
ơ
n
g th

c
h

y b

)
GV: Võ Hồng Bảo Châu
4040
y Đến lượt kết thúc, một lần nữa địa chỉ data của v lại
bị thu hồi, trong khi đó 2 địa chỉ này lại giống nhau –
do không có phương thức thiết lập tạo bản sao.
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
Để khắc phục tình trạng này, sử dụng tham
số dạng tham chiếu:
scalar(VECTOR& v)
GV: Võ Hồng Bảo Châu
4/14/2010
11
4141
Hàm trả về đối tượng
y Phương thức thiết lập tạo bản sao sẽ được gọi để tạo ra

bản sao khi hàm trả về một đối tượng của lớp.
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
GV: Võ Hồng Bảo Châu
4242
y Chẳng hạn, tổng của 2 vector:
VECTOR VECTOR::add(VECTOR v){
VECTOR t
(
size
);
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
();
for(int i=0; i<size; i++ )
t.data[i] = data[i] + v.data[i];
return t;
}
GV: Võ Hồng Bảo Châu
4343
y Chương trình gọi có thể viết
void main(){
VECTOR u(3), v(3);
u.setData
(
1.0
);
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
();
v.setData(4.0);
(u.add(v)).outData();
}

Chúng ta thử bỏ copy constructor trong
lớp VECTOR này để theo dõi kết quá
GV: Võ Hồng Bảo Châu
4444
y Chúng ta cũng có thể lưu lại kết quả tổng 2 vector
bằng cách bổ sung
VECTOR t = u.add(v);
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
t.outData();
y Kết quả hoàn toàn tương tự
GV: Võ Hồng Bảo Châu
4/14/2010
12
4545
Phép toán gán
y Nhưng khi dùng phép toán gán
VECTOR t(3);
t = u.add(v);
t.outData();
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
y Kết quả không như mong đợi
GV: Võ Hồng Bảo Châu
4646
Lý do
y Phép toán gán chuẩn sẽ gán từng byte của đối tượng
này cho đối tượng kia, khi đó các biến liên quan đến
địa chỉ cũng hoàn toàn giống nhau.
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
Phương thức thiết lập tạo bản sao sẽ tạo
ra một đối tượng mới; còn phép toán gán

chỉ làm thay đổi giá trị của đối tượng
GV: Võ Hồng Bảo Châu
4747
y Có thể bổ sung thêm hàm assign() để gán giá trị:
VECTOR VECTOR::assign(VECTOR v){
size = v.size();
for
(
int i = 0
;
i < size
;
i++
)
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
(;;)
data[i] = v.data[i];
return *this;
}
GV: Võ Hồng Bảo Châu
48
TỰ KẾT LUẬN
y KHI NÀO BẮT BUỘC PHẢI CÓ PHƯƠNG THỨC
COPY CONSTRUCTOR TƯỜNG MINH?
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
GV: Võ Hồng Bảo Châu
4/14/2010
13
49
TÓM TẮT

y CÓ 3 LOẠI PHƯƠNG THỨC TỰ THỰC HIỆN: THIẾT
LẬP, HỦY BỎ, SAO CHÉP
y CÁCH KHAI BÁO TỪNG LOẠI?
y PHƯƠNG THỨC CHUẨN?
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
y KHI NÀO CẦN PHƯƠNG THỨC COPY
CONSTRUCTOR?
GV: Võ Hồng Bảo Châu
50
OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC HIỆN
THANK YOU
GV: Võ Hồng Bảo Châu

×