Bài giảng Phương pháp lập trình hướng đối tượng – Tuần 3: Lớp và đối tượng cung cấp cho người học các kiến thức: Con trỏ this, nạp chồng hàm, Getter/Setter, hàm dựng(constructor), phương thức hủy. Cuối bài giảng có phần bài tập để người học ôn tập và củng cố lại kiến thức đã học.
Tuần 03: Lớp đối tượng (tt) Nhắc lại - Lớp đối tượng Lập trình hướng đối tượng phương pháp lập trình dựa kiến trúc lớp (class) đối tượng (object) Mỗi đối tượng bao gồm thành phần: thuộc tính (attributes) hành động (methods) Kiểu liệu lớp đối tượng: class Đóng gói: chứa đựng liệu hàm/thủ tục liên quan Che giấu liệu: thực thể phần mềm khác không can thiệp trực tiếp vào liệu bên ñược mà phải thông qua phương thức cho phép Tách thành phần khai báo cài đặt File header (interface): h Chứa thông tin khai báo lớp File xử lý (implementation): cpp Chứa cài đặt xử lý lớp CON TRỎ THIS Con trỏ this Xét đoạn code sau Đoạn code có khơng? Về cú pháp 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) a b c + mTuSo + mMauSo + mTuSo + mMauSo + mTuSo + mMauSo void PhanSo::LayTuSo() { return mTuSo; } Làm phần cài đặt, biết mTuSo dùng? Con trỏ this Trong C++, trình biên dịch tự động thêm vào đối số hàm trỏ this Con trỏ this trỏ tới đối tượng tương ứng 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: class PhanSo { private: int mTuSo; int mMauSo; Public: void GanTuSo(int mTuSo) { this->mTuSo = mTuSo; } }; Tuy nhiên, trường hợp đối số bị trùng tên với thành phần liệu nên xảy vấn đề vừa nêu Nếu không, hàm tự động ngầm hiểu trỏ this cho biến có tên thuộc lớp đối tượng tương ứng Con trỏ this Trong hàm, trỏ this (trỏ tới đối tượng khởi tạo tương ứng) truyền vào hàm cách không tường minh Các đối số khác khai báo bình thường 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 Hàm dựng chép Cần lưu ý vào đặc thù lớp đối tượng mà có nên xây dựng hàm dựng chép hay không Cụ thể: đối tượng có thành phần liệu trỏ HocSinh:: HocSinh(const HocSinh & h) { int size = h.HoTen.length(); this->HoTen= new char[size]; strcpy(this->HoTen, h.HoTen); } Hàm dựng Một lớp nên có tối thiểu hàm dựng sau: Hàm dựng mặc định Hàm dựng có đầy đủ tham số Hàm dựng chép class PhanSo { private: int m_iTuSo; int m_iMauSo; public: PhanSo(); PhanSo(int iTuSo, int iMauSo); PhanSo(const PhanSo &p); }; 30 PHƯƠNG THỨC HỦY (DESTRUCTOR) Hàm hủy Vấn đề rò rỉ nhớ (memory leak): Khi hoạt động, đối tượng có cấp phát nhớ Khi hủy đi, nhớ có thu hồi? Làm cách để 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 32 Rị rỉ nhớ!! Hàm hủy vào cuộc!! Hàm hủy Tính chất hàm hủy (destructor): Tự động thực đối tượng bị hủy Mỗi lớp có hàm hủy Khơng có giá trị trả tham số Trong C++, hàm hủy có tên ~ class HocSinh { private: char *HoTen; float DiemVan; float DiemToan; public: ~HocSinh() { delete HoTen; } }; 33 void main() { HocSinh h; HocSinh *p = new HocSinh; delete p; } BÀI TẬP Bài tập – 3.1 Khai báo cài đặt lớp phân số với hàm sau Nhập, xuất Getter/setter Cộng, trừ, nhân, chia phân số với 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 phân số Xét dấu phân số (nhỏ 0, 0, lớn 0) Kiểm tra phân số có tối giản hay khơng? Kiểm tra phân số có nhỏ hay không? Bài 3.1 (tt) Bổ sung vào lớp phân số phương thức sau: (Nhóm tạo hủy) Khởi tạo mặc định phân số = Khởi tạo với tử mẫu cho trước Khởi tạo với giá trị phân số cho trước Khởi tạo 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ảng phân số Xuất phân số nhỏ nhất/ lớn Sắp xếp theo thứ tự tăng dần/ giảm dần Tạo mảng phân số từ phân số có tử số nguyên tố Xóa phân số có tử Cứ phân số, chèn vào phân số tổng phân số trước Bài tập – 3.2 Khai báo cài đặt lớp điểm không gian Oxy với hàm sau: Nhập, xuất điểm Getter/setter Tìm khoảng cách đ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 cài đặt lớp tam giác với 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 đỉnh Bài tập – 3.4 Thông tin 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 thao tác 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 – sinh viên từ khóa 08 trở trước, có điểm trung bình tích lũy 5.0 tốt nghiệp Bài tập – 3.4 Bổ sung vào lớp sinh viên phương thức sau: (Nhóm tạo hủy) Khởi tạo với MSSV Khởi tạo với thông tin đầy đủ Khởi tạo từ sinh viên khác 41 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 Thầy Đinh Bá Tiến Thầy Nguyễn Minh Huy Thầy Lê Xuân Định ...Nhắc lại - Lớp đối tượng Lập trình hướng đối tượng phương pháp lập trình dựa kiến trúc lớp (class) đối tượng (object) Mỗi đối tượng bao gồm thành phần: thuộc tính (attributes)... trước Bài tập – 3. 2 Khai báo cài đặt lớp điểm không gian Oxy với hàm sau: Nhập, xuất điểm Getter/setter Tìm khoảng cách đ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... float DiemToan; public: ~HocSinh() { delete HoTen; } }; 33 void main() { HocSinh h; HocSinh *p = new HocSinh; delete p; } BÀI TẬP Bài tập – 3. 1 Khai báo cài đặt lớp phân số với hàm sau Nhập, xuất