Tuần 03:
Lớp và đối tượng (tt)
Nhắc lại - Lớp và đối tượng
Lập trỡnh hướng đối tượng là phương phỏp lập
trỡnh dựa trờn kiến trỳc lớp (class) và đối
tượng (object)
Mỗi đối tượng bao gồm 2 thành phần: thuộc
tớnh (attributes) và hành động (methods)
Kiểu dữ liệu lớp đối tượng: class
Đúng gúi: chứa đựng dữ liệu và cỏc hàm/thủ tục
liờn quan
Che giấu dữ liệu: cỏc thực thể phần mềm khỏc
khụng can thiệp trực tiếp vào dữ liệu bờn trong
ủược mà phải thụng qua cỏc phương thức cho
phộ
43 trang |
Chia sẻ: huongnhu95 | Lượt xem: 547 | Lượt tải: 0
Tóm tắt tài liệu Giáo trình Phương pháp lập trình hướng đối tượng - Tuần 9: Lớp và đối tượng (Tiếp theo) - Phạm Tú San, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
p
Tách thành phần khai báo và cài đặt
File header (interface): .h
Chứa các thơng tin về khai báo của lớp.
File xử lý (implementation): .cpp
Chứa các cài đặt về xử lý của lớp.
CON TRỎ THIS
Con trỏ this
Xét đoạn code sau
Đoạn code này cĩ đúng khơng? Về cú pháp và ngữ
nghĩa?
class PhanSo
{
private:
int mTuSo;
int mMauSo;
Public:
void GanTuSo(int mTuSo)
{
mTuSo = mTuSo;
}
};
void main()
{
PhanSo a;
a.GanTuSo (2);
PhanSo b;
b.GanTuSo(5);
}
Con trỏ this (tt)
Làm sao trong phần cài đặt, chúng ta biết được
mTuSo nào đang được dùng?
a
+ mTuSo
+ mMauSo
b
+ mTuSo
+ mMauSo
c
+ mTuSo
+ mMauSo
void PhanSo::LayTuSo()
{
return mTuSo;
}
Con trỏ this
Trong C++, trình biên dịch tự động thêm
vào trong các đối số của hàm 1 con trỏ this
Con trỏ this trỏ tới đối tượng tương ứng
hiện tại.
void PhanSo::LayTuSo( PhanSo* const this )
{
return this->mTuSo;
}
void main()
{
PhanSo a;
int t = a.LayTuSo();
}
void main()
{
PhanSo a;
int t = a.LayTuSo(&a);
}
Con trỏ this
Đoạn code đầu tiên:
Tuy nhiên, trong trường hợp này do các đối số bị trùng
tên với thành phần dữ liệu nên mới xảy ra vấn đề vừa
nêu. Nếu khơng, hàm sẽ tự động ngầm hiểu con trỏ this
cho các biến cĩ tên thuộc lớp đối tượng tương ứng
class PhanSo
{
private:
int mTuSo;
int mMauSo;
Public:
void GanTuSo(int mTuSo)
{
this->mTuSo = mTuSo;
}
};
Con trỏ this
Trong các hàm, con trỏ this (trỏ tới đối tượng
được khởi tạo tương ứng) được truyền vào
hàm 1 cách khơng tường minh.
Các đối số khác được khai báo bình thường
trong hàm.
float Diem::tinhKhoangCach(Diem d)
{
return sqrt( (this->x – d.x)*(this->x – d.x)
+(this->y – d.y)*(this->y – d.y) );
}
NẠP CHỒNG HÀM
Nạp chồng hàm
Mỗi hàm đều cĩ 1 “chữ ký hàm”
Phân biệt giữa các hàm.
Đặt trưng của một hàm:
Tên hàm.
Danh sách tham số (số lượng, kiểu)
Chương trình cĩ thể cĩ
nhiều hàm trùng tên
(nhưng khác tham số)
Nạp chồng hàm
Lớp phân số cĩ thể cĩ nhiều hàm cộng
Trình biên dịch sẽ căn cứ vào danh sách các đối
số truyền vào và so sánh chúng với tham số trong
nguyên mẫu hàm để xác định đúng phương án
thực hiện.
Nạp chồng hàm
Lưu ý: kiểu trả về khơng thuộc chữ kí hàm
PhanSo PhanSo::Cong(PhanSo );
float PhanSo::Cong(PhanSo );
Getter/Setter
Qui tắc đĩng gĩi kín
Đĩng gĩi hở: Mở một số
thuộc tính ra “public” cho
mọi người sử dụng trực
tiếp nguy hiểm!
Đĩng gĩi kín: Mọi thuộc
tính đều “private”, muốn
đọc giá trị của nĩ cũng phải
thơng qua phương thức!
Đối tượng kiểm sốt được
mọi tác động đến thuộc
tính của mình.
học tập
làm
việc
ăn chơi khoe
tiền
kiến thức
tiền
Kỹ_sư_CNTT a
Đạo_tặc b
cướp
ngân hàng
trộm cắp
ăn chơi buơn lậu
tiền
a.tiền = 0;
cout<<“Tên này cĩ ”<<a.khoeTiền()<<“ đơ”
<<“ mà ta khơng lấy được!”;
Getter/setter
Quy tắc đĩng kín
Truy xuất thơng qua getter: int ĐồngHồ::hiệnGiờ()
Truy nhập thơng qua setter: void ĐồngHồ::đặtGiờ(int h)
Các loại thuộc tính:
Thuộc tính nội bộ khơng cĩ get/setter.
Thuộc tính chỉ đọc chỉ cĩ getter
Thuộc tính ảo cĩ getter (setter), nhưng khơng cĩ thực
trong bộ nhớ. Thường là cơng thức tương đương với
những thuộc tính thực khác. VD: (giờ, phút, giây) ~
i_giây
Thuộc tính cơng cộng cĩ cả getter và setter nhưng mọi
truy cập đến thuộc tính đều được kiểm sốt.
VD: PhânSố::đặtMẫu(float ≠ 0)
Getter/Setter
Các thuộc tính của lớp SinhVien
Thuộc tính Get Set PThức khác Ghi chú
MSSV x thiLT(), thiTH(), làmNhĩm() Định danh
Tên x thiLT(), thiTH(), làmNhĩm() Định danh
MS Nhĩm x x làmNhĩm()
điểm LT (x) thiLT()
điểm TH (x) thiTH()
điểm Cộng (x) làmNhĩm()
điểm TK x Xác định bởi đ. LT, đ.
TH, đ. Cộng
HÀM DỰNG(CONSTRUCTOR)
Tại sao cần hàm dựng?
Khi đối tượng vừa được tạo:
Giá trị các thuộc tính bằng bao nhiêu?
Một số đối tượng cần cĩ thơng tin ban đầu.
PhanSo
Tử số??
Mẫu số??
Khởi tạo
HocSinh
Họ tên??
Điểm văn??
Điểm tốn??
Khởi tạo
void main()
{
PhanSo a;
a.Xuat();
HocSinh b;
b.Xuat();
} Giải pháp:
Xây dựng phương thức khởi tạo.
Người dùng quên gọi?!
Tính chất hàm dựng
Tính chất hàm dựng (constructor):
Tự động thực hiện khi đối tượng được tạo.
Cĩ thể nạp chồng nhiều hàm dựng.
Trong C++, hàm dựng cĩ tên trùng tên lớp
Khơng cĩ kiểu trả về
class PhanSo
{
private:
int m_iTuSo;
int m_iMauSo;
public:
PhanSo(int iTuSo, int iMauSo);
PhanSo(int iGiaTri);
};
void main()
{
PhanSo p1(1, 2);
PhanSo *p2 = new PhanSo(5);
}
Các loại hàm dựng
Hàm dựng mặc định
Hàm dựng sao chép
Hàm dựng với tham số đầy đủ
Các hàm dựng khác
Hàm dựng mặc định
Khi lớp đối tượng khơng cĩ hàm dựng nào thì
hàm dựng mặc định (default constructor) sẽ
được tự động thêm vào
Tính chất:
Khơng tham số.
Khởi tạo mặc định các thuộc tính.
Ví dụ hàm dựng mặc định
class PhanSo
{
private:
int mTuSo;
int mMauSo;
public:
PhanSo()
{
this->mTuSo = 0;
this->mMauSo = 1;
}
};
}
void main()
{
PhanSo p1;
p1.Xuat();
Lưu ý: hàm dựng mặc định
Hàm dựng mặc định chỉ được thêm vào nếu lớp
đối tượng khơng cĩ 1 hàm dựng nào cả.
class Ngay
{
public:
Ngay(int ngMoi)
{ng = ngMoi;}
private:
int ng, th, nm;
};
int main()
{
Ngay homnay;
return 0;
}
Báo lỗi
int main()
{
PhanSo a;
PhanSo b(a); // gọi copy constructor
PhanSo c = a.Cong(b); // copy constructor
//được gọikhi b là tham trị
}
Hàm dựng sao chép mặc định
Mỗi lớp, nếu khơng định nghĩa 1 hàm dựng sao chép
thì trình biên dịch sẽ cung cấp 1 hàm dựng sao chép
mặc định. Hàm này giúp khởi tạo 1 đối tượng thuộc
lớp này bằng 1 đối tượng khác thuộc cùng lớp.
26
Hàm dựng sao chép
Hàm dựng sao chép (copy constructor):
Cĩ tham số là đối tượng cùng lớp.
Dùng khởi tạo từ đối tượng cùng loại.
class PhanSo
{
private:
int m_iTuSo;
int m_iMauSo;
public:
PhanSo(const PhanSo &p);
};
void main()
{
PhanSo p1(1, 2);
PhanSo p2(p1);
PhanSo p3 = p2;
}
Hàm dựng sao chép mặc định
Hàm dựng sao chép mặc định chỉ sao chép
từng bit (bitwise copy) của các thành phần
trong đối tượng nguồn sang đối tượng
đích
Đối tượng nguồn Đối tượng đích
b b
a a
ptr ptr
Hàm dựng sao chép
Do tính chất sao chép từng bit (bitwise copy)
của hàm dựng mặc định, nếu đối tượng cĩ
chứa con trỏ và nĩ đang trỏ tới 1 vùng nhớ nào
đĩ thì việc sao chép sẽ gây ra vấn đề nghiêm
trọng.
Cụ thể, khi đĩ 2 biến con trỏ của 2 đối tượng khác
nhau cùng trỏ tới 1 vùng nhớ.
Hàm dựng sao chép
Cần lưu ý vào đặc thù của lớp đối tượng mà cĩ
nên xây dựng hàm dựng sao chép hay khơng.
Cụ thể: khi đối tượng cĩ thành phần dữ liệu là con
trỏ
HocSinh:: HocSinh(const HocSinh & h)
{
int size = h.HoTen.length();
this->HoTen= new char[size];
strcpy(this->HoTen, h.HoTen);
}
30
Hàm dựng
Một lớp nên cĩ tối thiểu 3 hàm dựng sau:
Hàm dựng mặc định.
Hàm dựng cĩ đầy đủ tham số.
Hàm dựng sao chép.
class PhanSo
{ private:
int m_iTuSo;
int m_iMauSo;
public:
PhanSo();
PhanSo(int iTuSo, int iMauSo);
PhanSo(const PhanSo &p);
};
PHƯƠNG THỨC HỦY
(DESTRUCTOR)
32
Hàm hủy
Vấn đề rị rỉ bộ nhớ (memory leak):
Khi hoạt động, đối tượng cĩ cấp phát bộ nhớ.
Khi hủy đi, bộ nhớ cĩ được thu hồi?
Làm cách nào để thu hồi?
Xây dựng phương thức thu hồi.
Người dùng quên gọi?!
HocSinh
Họ tên
Điểm văn
Điểm tốn
Thu hồi
Rị rỉ bộ nhớ!!
Hàm hủy vào cuộc!!
33
Hàm hủy
Tính chất hàm hủy (destructor):
Tự động thực hiện khi đối tượng bị hủy.
Mỗi lớp cĩ duy nhất một hàm hủy.
Khơng cĩ giá trị trả về và tham số
Trong C++, hàm hủy cĩ tên ~
class HocSinh
{
private:
char *HoTen;
float DiemVan;
float DiemToan;
public:
~HocSinh() { delete HoTen; }
};
void main()
{
HocSinh h;
HocSinh *p = new HocSinh;
delete p;
}
BÀI TẬP
Bài tập – 3.1
Khai báo và cài đặt lớp phân số với các hàm sau
Nhập, xuất
Getter/setter
Cộng, trừ, nhân, chia 1 phân số với 1 số thực
Cộng trừ nhân chia phân số với số thực
Rút gọn, nghịch đảo phân số
So sánh 2 phân số
Xét dấu phân số (nhỏ hơn 0, bằng 0, lớn hơn 0)
Kiểm tra phân số cĩ tối giản hay khơng?
Kiểm tra phân số cĩ nhỏ hơn 0 hay khơng?
Bài 3.1 (tt)
Bổ sung vào lớp phân số những phương thức sau:
(Nhĩm tạo hủy)
Khởi tạo mặc định phân số = 0.
Khởi tạo với tử và mẫu cho trước.
Khởi tạo với giá trị phân số cho trước.
Khởi tạo từ một phân số khác.
Bài tập – 3.1 (tt)
Viết chương trình cho phép
Nhập vào một mảng các phân số
Xuất ra phân số nhỏ nhất/ lớn nhất
Sắp xếp theo thứ tự tăng dần/ giảm dần
Tạo mảng phân số mới từ các phân số cĩ tử là số
nguyên tố
Xĩa các phân số cĩ tử là 0
Cứ mỗi 2 phân số, chèn vào một phân số bằng tổng
của 2 phân số trước đĩ
Bài tập – 3.2
Khai báo và cài đặt lớp điểm trong khơng gian
Oxy với các hàm sau:
Nhập, xuất điểm
Getter/setter
Tìm khoảng cách giữa 2 điểm
Tìm điểm đối xứng qua trục Ox, Oy, gốc tọa độ Oxy
Bài tập – 3.3
Khai báo và cài đặt lớp tam giác với các hàm sau
Nhập, xuất tam giác
Getter/setter đỉnh A
Tính chu vi, diện tích
Tìm tọa độ trọng tâm
Tính tổng khoảng cách từ điểm P đến 3 đỉnh
Bài tập – 3.4
Thơng tin một sinh viên bao gồm:
MSSV
Họ tên
Ngày tháng năm sinh
Năm nhập học
Điểm trung bình tích lũy
Viết chương trình cho phép thực hiện các thao tác trên kiểu sinh
viên:
Nhập, xuất thơng tin sinh viên.
Xét tốt nghiệp cho sinh viên – các sinh viên từ khĩa 08
trở về trước, cĩ điểm trung bình tích lũy trên 5.0 thì được
tốt nghiệp
41
Bài tập – 3.4
Bổ sung vào lớp sinh viên những phương thức sau:
(Nhĩm tạo hủy)
Khởi tạo với MSSV
Khởi tạo với các thơng tin đầy đủ
Khởi tạo từ một sinh viên khác.
Bài tập – 3.4
Viết chương trình cho phép
Nhập vào
Tham khảo
Bài giảng mơn PPLTHĐT của
Thầy Đinh Bá Tiến
Thầy Nguyễn Minh Huy
Thầy Lê Xuân Định
Các file đính kèm theo tài liệu này:
- giao_trinh_phuong_phap_lap_trinh_huong_doi_tuong_tuan_9_lop.pdf