1 Lớp và đối tượng – Phần 6 Fri Nov 02, 2012 12:56 pm
LostSoul89
Admin
Lớp và đối tượng – Phần 6
Khi
đó hàm tạo mặc định sẽ không được phát sinh nữa và mọi câu lệnh xây
dựng đối tượng mới đều sẽ gọi đến một hàm tạo của lớp. Nếu không tìm
thấy hàm tạo cần gọi thì chương trình dịch sẽ báo lỗi. Điều này thường
xẩy ra khi chúng ta không xây dựng hàm tạo không đối, nhưng lại sử dụng
các khai báo không tham số.
4.2/- Lớp không có hàm tạo và hàm tạo mặc định
a/- Nếu lớp không có hàm tạo
Chương trình dịch sẽ cung cấp một hàm tạo mặc định không đối
(default), hàm này thực chất không làm gì cả. Như vậy một đối tượng tạo
ra chỉ được cấp phát bộ nhớ, còn các thuộc tính của nó chưa được xác
định. Chúng ta có thể kiểm chứng điều này, bằng cách chạy chương trình
sau:
b/- Nếu trong lớp đã có ít nhất một hàm tạo
Khi đó hàm tạo mặc định sẽ không được phát sinh nữa và mọi câu lệnh
xây dựng đối tượng mới đều sẽ gọi đến một hàm tạo của lớp. Nếu không tìm
thấy hàm tạo cần gọi thì chương trình dịch sẽ báo lỗi. Điều này thường
xẩy ra khi chúng ta không xây dựng hàm tạo không đối, nhưng lại sử dụng
các khai báo không tham số như ví dụ sau:
Trong các câu lệnh trên, chỉ có câu lệnh thứ 2 trong hàm main() là bị
báo lỗi. Câu lệnh này sẽ gọi tới hàm tạo không đối, mà hàm này chưa
được xây dựng.
Giải pháp: có thể chọn một trong 2 giải pháp sau:
- Xây dựng thêm hàm tạo không đối.
- Gán giá trị mặc định cho tất cả các đối x1, y1 và m1 của hàm tạo đã xây dựng ở trên.
Theo phương án 2, chương trình có thể sửa như sau:
4.3/- Hàm tạo sao chép (Copy Construcotr)
a/- Hàm tạo sao chép mặc định
Giả sử đã định nghĩa một lớp nào đó, ví dụ lớp PS (phân số). Khi đó:
- Ta có thể dùng câu lệnh khai báo hoặc cấp phát bộ nhớ để tạo các đối tượng mới, ví dụ:
- Ta cũng có thể dùng lệnh khai báo để tạo một đối tượng mới từ một đối tượng đã tồn tại, ví dụ:
ý nghĩa của câu lệnh này như sau:
- Nếu trong lớp PS chưa xây dựng hàm tạo sao chép, thì câu lệnh này
sẽ gọi tới một hàm tạo sao chép mặc định (của C++). Hàm này sẽ sao chép
nội dung từng bit của u vào các bit tương ứng của v. Như vậy các vùng
nhớ của u và v sẽ có nội dung như nhau. Rõ ràng trong đa số các trường
hợp, nếu lớp không có các thuộc tính kiểu con trỏ hay tham chiếu, thì
việc dùng các hàm tạo sao chép mặc định (để tạo ra một đối tượng mới có
nội dung như một đối tượng cho trước) là đủ và không cần xây dựng một
hàm tạo sao chép mới.
- Nếu trong lớp PS đã có hàm tạo sao chép (cách viết sẽ nói sau) thì
câu lệnh: PS v(u); sẽ tạo ra đối tượng mới v, sau đó gọi tới hàm tạo sao
chép để khởi gán v theo u.
Ví dụ sau sẽ minh họa cách dùng hàm tạo sao chép mặc định:
Trong chương trình đưa vào lớp PS (phân số):
- Các thuộc tính gồm: t (tử số) và m (mẫu).
- Trong lớp không có phương thức nào cả mà chỉ có 2 hàm bạn là các hàm toán tử nhập (>>) và xuất (<<).
Nội dung chương trình là: Dùng lệnh khai báo để tạo một đối tượng u (kiểu PS) có nội dung như đối tượng đã có d.
b/- Cách xây dựng hàm tạo sao chép
- Hàm tạo sao chép sử dụng một đối kiểu tham chiếu đối tượng để khởi gán cho đối tượng mới. Hàm tạo sao chép được viết theo mẫu:
- Ví dụ có thể xây dựng hàm tạo sao chép cho lớp PS như sau:
Hết phần 6
Nguồn: Internet
Khi
đó hàm tạo mặc định sẽ không được phát sinh nữa và mọi câu lệnh xây
dựng đối tượng mới đều sẽ gọi đến một hàm tạo của lớp. Nếu không tìm
thấy hàm tạo cần gọi thì chương trình dịch sẽ báo lỗi. Điều này thường
xẩy ra khi chúng ta không xây dựng hàm tạo không đối, nhưng lại sử dụng
các khai báo không tham số.
4.2/- Lớp không có hàm tạo và hàm tạo mặc định
a/- Nếu lớp không có hàm tạo
Chương trình dịch sẽ cung cấp một hàm tạo mặc định không đối
(default), hàm này thực chất không làm gì cả. Như vậy một đối tượng tạo
ra chỉ được cấp phát bộ nhớ, còn các thuộc tính của nó chưa được xác
định. Chúng ta có thể kiểm chứng điều này, bằng cách chạy chương trình
sau:
b/- Nếu trong lớp đã có ít nhất một hàm tạo
Khi đó hàm tạo mặc định sẽ không được phát sinh nữa và mọi câu lệnh
xây dựng đối tượng mới đều sẽ gọi đến một hàm tạo của lớp. Nếu không tìm
thấy hàm tạo cần gọi thì chương trình dịch sẽ báo lỗi. Điều này thường
xẩy ra khi chúng ta không xây dựng hàm tạo không đối, nhưng lại sử dụng
các khai báo không tham số như ví dụ sau:
Trong các câu lệnh trên, chỉ có câu lệnh thứ 2 trong hàm main() là bị
báo lỗi. Câu lệnh này sẽ gọi tới hàm tạo không đối, mà hàm này chưa
được xây dựng.
Giải pháp: có thể chọn một trong 2 giải pháp sau:
- Xây dựng thêm hàm tạo không đối.
- Gán giá trị mặc định cho tất cả các đối x1, y1 và m1 của hàm tạo đã xây dựng ở trên.
Theo phương án 2, chương trình có thể sửa như sau:
4.3/- Hàm tạo sao chép (Copy Construcotr)
a/- Hàm tạo sao chép mặc định
Giả sử đã định nghĩa một lớp nào đó, ví dụ lớp PS (phân số). Khi đó:
- Ta có thể dùng câu lệnh khai báo hoặc cấp phát bộ nhớ để tạo các đối tượng mới, ví dụ:
- Ta cũng có thể dùng lệnh khai báo để tạo một đối tượng mới từ một đối tượng đã tồn tại, ví dụ:
ý nghĩa của câu lệnh này như sau:
- Nếu trong lớp PS chưa xây dựng hàm tạo sao chép, thì câu lệnh này
sẽ gọi tới một hàm tạo sao chép mặc định (của C++). Hàm này sẽ sao chép
nội dung từng bit của u vào các bit tương ứng của v. Như vậy các vùng
nhớ của u và v sẽ có nội dung như nhau. Rõ ràng trong đa số các trường
hợp, nếu lớp không có các thuộc tính kiểu con trỏ hay tham chiếu, thì
việc dùng các hàm tạo sao chép mặc định (để tạo ra một đối tượng mới có
nội dung như một đối tượng cho trước) là đủ và không cần xây dựng một
hàm tạo sao chép mới.
- Nếu trong lớp PS đã có hàm tạo sao chép (cách viết sẽ nói sau) thì
câu lệnh: PS v(u); sẽ tạo ra đối tượng mới v, sau đó gọi tới hàm tạo sao
chép để khởi gán v theo u.
Ví dụ sau sẽ minh họa cách dùng hàm tạo sao chép mặc định:
Trong chương trình đưa vào lớp PS (phân số):
- Các thuộc tính gồm: t (tử số) và m (mẫu).
- Trong lớp không có phương thức nào cả mà chỉ có 2 hàm bạn là các hàm toán tử nhập (>>) và xuất (<<).
Nội dung chương trình là: Dùng lệnh khai báo để tạo một đối tượng u (kiểu PS) có nội dung như đối tượng đã có d.
b/- Cách xây dựng hàm tạo sao chép
- Hàm tạo sao chép sử dụng một đối kiểu tham chiếu đối tượng để khởi gán cho đối tượng mới. Hàm tạo sao chép được viết theo mẫu:
- Ví dụ có thể xây dựng hàm tạo sao chép cho lớp PS như sau:
Hết phần 6
Nguồn: Internet