Sử dụng phương thức lấy địa chỉ trong xây dựng các hàm cơ bản của lớp dẫn xuất... Lớp Class…~1950 ~1970 ♥ Kiểu class Kiểu struct: đây là 1 kiểu dữ liệu chỉ định nghĩa phần D, phần P hoà
Trang 1Sử dụng phương thức lấy địa chỉ trong xây dựng các hàm cơ bản của lớp dẫn xuất
Trang 2I/ Lớp (Class) là gì???
♥ Đại số hệ: α = { D, P}
D- Tập dữ liệu
P – Tập thao tác
♥ Kiểu dữ liệu (type)
Type ≈ α được cài đặt trong một ngôn ngữ lập trình ( trong Nó thành phần D
bị giới hạn)
Ví dụ:
<Đại số hệ số nguyên> = { D, P}
D = { -∞, …., -1,0, 1,…∞}
P = { +, -, *, :…}
Trong ngôn ngữ PASCAL <Kiểu số nguyên (integer)> = { D, P}
D = { -32768 ÷ +32767}
P – giống đại số hệ.
Trong ngôn ngữ lập trình Kiểu dữ liệu phân làm 2 loại:
Kiểu cơ sở: được cài đặt sẵn trong ngôn ngữ lập trình (int, char, float,….)
Kiểu định nghĩa: do nhà lập trình tạo lập (struct, set, class).
Trang 3Lớp (Class)…
~1950
~1970
♥ Kiểu class
Kiểu struct: đây là 1 kiểu dữ liệu chỉ định nghĩa phần D, phần P hoàn toán có thể xây dựng bổ sung tùy thuộc từng bài toán (kiểu dữ liệu chưa đóng gói)
Kiểu class: là kiểu dữ liệu hoàn thiện do nhà lập trình tạo ra hướng tới các đối tượng thực Kiểu dữ liệu này gắn chặt chẽ 2 thành phần D và P để mô tả 1 thực thể trong thế giới thực Đây chính là tính đóng gói của kiểu dữ liệu xây dựng( Có đối tượng thì có
thao tác,và ngược lại)
Trang 4 ♥ Định nghĩa lớp:
Class tên_lớp
{ [private/protected/public]:
// Khai báo các thành phần dữ liệu – D
[private/protected/public]:
// Khai báo các phương thức+ hàm (thao tác –P)
};
Trang 5Các hàm cơ sở…
Ví dụ: Xây dựng lớp chứng minh thư….
Class CMT
{ char scmt[12], ten[25], nguyenquan[45];
Int ngay, thang, nam;
Public:
CMT();
~CMT();
CMT(CMT &);
CMT &operator=(CMT &)
Friend ostream &operator<<(ostream & os, CMT &);
Friend istream &operator>>(istream & is, CMT &);
CMT *laydc();
Int laynam();
…
};
Trang 6Các hàm cơ sở….
♥ Các hàm cơ sở:
Các thao tác P phân thành 2 loại:
- Loại cơ sở: đây là các thao tác cơ bản mà 1 kiểu dữ liệu cần có
- Loại mở rộng: là các thao tác được bổ sung tùy thuộc các loại ứng dụng của lớp
Thao tác cơ sở của các kiểu dữ liệu (hàm cơ sở) gồm:
a/ Hàm tạo (constructor):
Để cấp phát không gian nhớ khi tạo lập (khai báo) các đối tượng mới,
b/Hàm hủy (desconstructor)
Ngược với hàm tạo, dung để thu hồi vùng nhớ khi sử dụng xong đối tượng.
c/ Hàm tạo sao chép (copyconstructor)
Có chức năng tạo ra các đối tượng mới tương tự như các đối tượng đang tồn tại.
d/ Toán tử gán (=)
Dùng để gán các đối tượng đang tồn tại.
e/ Toán tử nhập/xuất (cin>>, cout<<)
Để nhập hoặc xuất giá trị cho các thành phần dữ liệu của đối tượng.
Trang 7IV/ Lớp dẫn xuất là gì?
A
B
Ta co thể xây dựng lớp mới (lớp dẫn xuất B) dựa trên các lớp đang tồn tại (lớp
cơ sở A) Lớp dẫn xuất được thừa kế toàn bộ các thành phần của lớp cơ sở A Ngoại trừ các hàm cơ sở, do vậy cần xây dựng lại các hàm cơ sỏ cho lớp dẫn xuất
Trong đối tượng g1(kiểu B) có 2 thành phần, thừa kế (D_TK) từ lớp A và thành phần riêng (D_R) của lớp dãn xuất.
D_TK d1
Trang 8Xây dựng toán tử gán & phương thức toán tử xuất nhập
của lớp dẫn xuất như thế nào???
♥ Phương thức lấy địa chỉ của lớp cơ sở:
Dùng để lấy địa chỉ phần dữ liệu thừa kế từ lớp cơ sở trong lớp dẫn xuát, cách viết như sau:
Tên_lớp_cơ_sở *tên_phương_thức_lấy_dc() { return this;}
♥Toán tử gán (=):
Dùng để gán 2 đối tượng đang tồn tại.
Cách xây dựng:
[void/Tên lớp] operator = ( Tên lớp & đối tượng bị gán]
{ // Các lệnh gán các thành phần dữ liệu thừa kế(TP_D_TK)
// Các lệnh gán các thành phần dữ liệu riêng(TP_D_R)
[return đối_tượng_bị_gán];}
Trang 9Xây dựng toán tử gán & …
♥ Phương thức toán tử nhập (cin>>):
Cách xây dựng:
Friend ístream &operator>>( istream & is, tên_lớp & đối tượng )
{ // Các lệnh nhập dữ liệu cho thành phần dữ liệu thừa kế(TP_D_TK)
// Các lệnh nhập dữ liệu cho thành phần dữ liệu riêng(TP_D_R)
Return is; };
♥Phương thức toán tử xuất (cout<<):
Cách xây dựng:
Friend ostream &operator<<( ostream & os, tên_lớp & đối tượng )
{ // Các lệnh xuất dữ liệu cho thành phần dữ liệu thừa kế(TP_D_TK)
// Các lệnh xuất dữ liệu cho thành phần dữ liệu riêng(TP_D_R)
Return os; };
Trang 10 Lưu ý:
Trong xây dựng các hàm cơ sở (toán tử gán, toán tử xuất và toán tử
nhập) cho lớp dẫn xuất ta đều phải can thiệp tới các thành phần dữ
liệu thừa kế từ lớp cơ sở (TP_D_TK) Để làm được điều đó ta có 2
cách:
C1: TRuy cập trực tiếp các thành phần thừa kế :
muốn làm theo cách này thì các thành phần dữ liệu cần khai báo
PUBLIC, điều này phá vỡ tính đóng gói của lớp, ngoài ra việc can
thiệp đến nhiều thành phần dữ liệu của lớp sẽ phức tạp & dễ sai sót.
C2: Sử dụng phương thức lấy địa chỉ của lớp cơ sở :
Ưu điểm: bảo toàn tính đóng gói và can thiệp đến thành phần thừa đơn
giản
10
Xây dựng toán tử gán & …
Trang 11Ví dụ
Ví dụ: xây dựng lớp giáo viên dựa trên lớp CMT.
Class GV: public CMT
{ char mscc[12], tentruong[25], tenkhoa[25];
Public://…
GV &operator= (GV &);
Friend ostream &operator<<(ostream &os, GV &);
Friend istream &operator>>(istream &is, GV &);
};
g1
Trang 12Ví dụ
GV &GVoperator= (GV &g)
{ CMT *d1,*d2; d1= (*this).laydc(); d2 = g.laydc(); (*d1)=(*d2);
Strcpy(mscc,g.mscc);strcpy(tentruong,g tentruong);strcpy(tenkhoa,g tenkhoa);
Return g;
};
istream &operator>>(istream &is, GV &g)
{ CMT *d1; d1=g.laydc(); cin>> *d1;
Gets(g.mscc); gets(g.tentruong); gets(g.tenkhoa);
Return is;}
ostream &operator<<(ostream &os, GV &g)
{ CMT *d1; d1=g.laydc(); cout<< *d1;
Cout<<g.mscc<<g.tentruong<<g.tenkhoa;
Return os;}
Void main()
{ GV g1, g2;
Cin>>g1;
g2=g1;
Cout<<g1<< “\n”<<g2;
};
12
D_TK
D_R
d1
D_TK
D_R d2