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

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ộ

pdf43 trang | Chia sẻ: huongnhu95 | Lượt xem: 547 | Lượt tải: 0download
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:

  • pdfgiao_trinh_phuong_phap_lap_trinh_huong_doi_tuong_tuan_9_lop.pdf