Khoanglang89
Bạn hãy đăng nhập hoặc đăng ký
Khoanglang89

NHẬN THIẾT KẾ WEBSITE/ SOFTWARE - LÀM ĐỒ ÁN TỐT NGHIỆP, ĐỒ ÁN CHUYÊN MÔN NGÀNH CÔNG NGHỆ THÔNG TIN


You are not connected. Please login or register

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down  Thông điệp [Trang 1 trong tổng số 1 trang]

1 Lớp và đối tượng – Phần 7 on Fri Nov 02, 2012 12:56 pm

LostSoul89

avatar

Admin
Admin
Loading
Lớp và đối tượng – Phần 7






Hàm
hủy là một hàm thành viên của lớp (phương thức) có chức năng ngược với
hàm tạo. Hàm hủy được gọi trước khi giải phóng (xoá bỏ) một đối tượng để
thực hiện một số công việc có tính ''dọn dẹp'' trước khi đối tượng được
hủy bỏ, ví dụ như giải phóng một vùng nhớ mà đối tượng đang quản lý,
xoá đối tượng khỏi màn hình nếu như nó đang hiển thị, ...














c/- Khi nào cần xây dựng hàm tạo sao chép

- Nhận xét: Hàm tạo sao chép trong ví dụ trên không khác gì hàm tạo sao chép mặc định.

- Khi lớp không có các thuộc tính kiểu con trỏ hoặc tham chiếu, thì dùng hàm tạo sao chép mặc định là đủ.

- Khi lớp có các thuộc tính con trỏ hoặc tham chiếu, thì hàm tạo sao chép mặc định chưa đáp ứng được yêu cầu.

Ví dụ:




Bây giờ chúng ta hãy theo dõi xem việc dùng hàm tạo mặc định trong đoạn chương trình sau sẽ dẫn đến sai lầm như thế nào:




/* Nhập đối tượng d, gồm: nhập một số nguyên dương và gán cho d.n,
cấp phát vùng nhớ cho d.a, nhập các hệ số của đa thức và chứa vào vùng
nhớ được cấp phát */




/* Dùng hàm tạo mặc định để xây dựng đối tượng u theo d. Kết quả: u.n
= d.n và u.a = d.a. Như vậy 2 con trỏ u.a và d.a cùng trỏ đến một vùng
nhớ */

Nhận xét: Mục đích là tạo ra một đối tượng u giống như d,
nhưng độc lập với d. Nghĩa là khi d thay đổi thì u không bị ảnh hưởng
gì. Thế nhưng mục tiêu này không đạt được, vì u và d có chung một vùng
nhớ chứa hệ số của đa thức, nên khi sửa đổi các hệ số của đa thức trong d
thì các hệ số của đa thức trong u cũng thay đổi theo. Còn một trường
hợp nữa cũng dẫn đến lỗi là khi một trong 2 đối tượng u và d bị giải
phóng (thu hồi vùng nhớ chứa đa thức) thì đối tượng còn lại cũng sẽ
không còn vùng nhớ nữa.

Ví dụ sau sẽ minh họa nhận xét trên: Khi d thay đổi thì u cũng thay đổi và ngược lại khi u thay đổi thì d cũng thay đổi theo.










d/- Ví dụ về hàm tạo sao chép

Trong chương trình trên đã chỉ rõ: Hàm tạo sao chép mặc định là chưa
thoả mãn đối với lớp DT. Vì vậy cần viết hàm tạo sao chép để xây dựng
đối tượng mới (ví dụ u) từ một đối tượng đang tồn tại (ví dụ d) theo các
yêu cầu sau:

- Gán d.n cho u.n

- Cấp phát một vùng nhớ cho u.a để có thể chứa được (d.n + 1) hệ số.

- Gán các hệ số chứa trong vùng nhớ của d.a sang vùng nhớ của u.a

Như vậy chúng ta sẽ tạo được đối tượng u có nội dung ban đầu giống như d, nhưng độc lập với d.

Để đáp ứng các yêu cầu nêu trên, hàm tạo sao chép cần được xây dựng như sau:




Chương trình sau sẽ minh họa điều này: Sự thay đổi của d không làm
ảnh hưởng đến u và ngược lại sự thay đổi của u không làm ảnh hưởng đến
d.











5/- Hàm hủy (Destructor)
Hàm hủy là một hàm thành viên của lớp (phương thức) có chức năng
ngược với hàm tạo. Hàm hủy được gọi trước khi giải phóng (xoá bỏ) một
đối tượng để thực hiện một số công việc có tính ''dọn dẹp'' trước khi
đối tượng được hủy bỏ, ví dụ như giải phóng một vùng nhớ mà đối tượng
đang quản lý, xoá đối tượng khỏi màn hình nếu như nó đang hiển thị, ...

Việc hủy bỏ một đối tượng thường xẩy ra trong 2 trường hợp sau:

- Trong các toán tử và các hàm giải phóng bộ nhớ, như delete, free, ...

- Giải phóng các biến, mảng cục bộ khi thoát khỏi hàm, phương thức.

5.1/- Hàm hủy mặc định

Nếu trong lớp không định nghĩa hàm hủy, thì một hàm hủy mặc định
không làm gì cả được phát sinh. Đối với nhiều lớp thì hàm hủy mặc định
là đủ, và không cần đưa vào một hàm hủy mới.

5.2/- Quy tắc viết hàm hủy

Mỗi lớp chỉ có một hàm hủy viết theo các quy tắc sau:

- Kiểu của hàm: Hàm hủy cũng giống như hàm tạo là hàm không có kiểu, không có giá trị trả về.

- Tên hàm: Tên của hàm hủy gồm một dấu ngã (đứng trước) và tên lớp:

~Tên_lớp

- Đối: Hàm hủy không có đối.

Ví dụ có thể xây dựng hàm hủy cho lớp DT (đa thức) như sau:




5.3/- Vai trò của hàm hủy trong lớp DT

Trong phần trước định nghĩa lớp DT (đa thức) khá đầy đủ gồm:

- Các hàm tạo

- Các toán tử nhập >>, xuất <<

- Các hàm toán tử thực hiện các phép tính +, -, *, /

Tuy nhiên vẫn còn thiếu hàm hủy để giải phóng vùng nhớ mà đối tượng kiểu DT (cần hủy) đang quản lý.

Chúng ta hãy phân tích các khiếm khuyết của chương trình này:

- Khi chương trình gọi tới một phương thức toán tử để thực hiện các
phép tính cộng, trừ, nhân đa thức, thì một đối tượng trung gian được tạo
ra. Một vùng nhớ được cấp phát và giao cho nó (đối tượng trung gian)
quản lý.

- Khi thực hiện xong phép tính sẽ ra khỏi phương thức. Đối tượng
trung gian bị xoá, tuy nhiên chỉ vùng nhớ của các thuộc tính của đối
tượng này được giải phóng. Còn vùng nhớ (chứa các hệ số của đa thức) mà
đối tượng trung gian đang quản lý thì không hề bị giải phóng. Như vậy số
vùng nhớ bị chiếm dụng vô ích sẽ tăng lên.

Nhược điểm trên dễ dàng khắc phục bằng cách đưa vào lớp DT hàm hủy trong mục 3 ở trên.

Hết phần 7



Nguồn: Internet

Xem lý lịch thành viên http://khoanglang89.forumvi.com

Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang  Thông điệp [Trang 1 trong tổng số 1 trang]

Bài viết mới cùng chuyên mục

    Bài viết liên quan vớiLớp và đối tượng – Phần 7

      Permissions in this forum:
      Bạn không có quyền trả lời bài viết