Bài giảng Phương pháp lập trình hướng đối tượng - Thành phần tĩnh, ba vấn đề con trỏ - Nguyễn Minh Huy

ppt 24 trang hapham 1360
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Phương pháp lập trình hướng đối tượng - Thành phần tĩnh, ba vấn đề con trỏ - Nguyễn Minh Huy", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pptbai_giang_phuong_phap_lap_trinh_huong_doi_tuong_thanh_phan_t.ppt

Nội dung text: Bài giảng Phương pháp lập trình hướng đối tượng - Thành phần tĩnh, ba vấn đề con trỏ - Nguyễn Minh Huy

  1. Thành phần tĩnh, Ba vấn đề con trỏ Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy 1
  2. Nội dung ◼ Thành phần tĩnh. ◼ Ba vấn đề con trỏ. ◼ Bài tập. Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy 2
  3. Nội dung ◼ Thành phần tĩnh. ◼ Ba vấn đề con trỏ. ◼ Bài tập. Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy 3
  4. Thành phần tĩnh ◼ Thành phần của lớp (class members): ◼ Thành phần đối tượng (instance members). ➢ Thuộc tính và phương thức thông thường. ➢ Mỗi đối tượng có bản sao riêng. ◼ Thành phần tĩnh (static members). ➢ Thuộc tính và phương thức tĩnh. ➢ Các đối tượng dùng chung. p1: PhanSo PhanSo ▪Tử số 1 ▪Tử số ▪Mẫu số 2 Thành phần dùng chung cho ▪Mẫu số MỌI đối tượng của lớp!! p2: PhanSo ▪Giá trị lớn nhất ▪Tử số 2 ▪Giá trị nhỏ nhất ▪Mẫu số 3 Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy 4
  5. Thành phần tĩnh ◼ Khai báo và sử dụng: ◼ Dùng từ khóa static. ◼ Truy xuất bằng toán tử ::. class PhanSo PhanSo::m_giaTriLN = 10000; { private: void main() static int m_giaTriLN; { public: PhanSo p1(1, 2); static int layGiaTriLN(); PhanSo p2(2, 3); private: int m_tuSo; int x1 = PhanSo::layGiaTriLN(); int m_mauSo; int x2 = p1.layGiaTriLN(); }; } Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy 5
  6. Nội dung ◼ Thành phần tĩnh. ◼ Ba vấn đề con trỏ. ◼ Bài tập. Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy 6
  7. Ba vấn đề con trỏ ◼ Ví dụ 1: class Array void main() { { private: Array a1(5); int m_size; int *m_data; } public: Array(int size); }; Array::Array(int size) { m_size = size; m_data = new int[m_size]; } Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy 7
  8. Ba vấn đề con trỏ ◼ Vấn đề rò rỉ bộ nhớ: ◼ Lớp có thuộc tính con trỏ. ◼ Đối tượng của lớp bị hủy, bộ nhớ không thu hồi. a1: Array Rò rỉ bộ nhớ!! ▪m_size 5 ▪m_data 101 1 2 3 4 5 Phải dùng hàm hủy để dọn dẹp!! Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy 8
  9. Ba vấn đề con trỏ ◼ Ví dụ 1: class Array void main() { { private: Array a1(5); int m_size; int *m_data; } public: Array(int size); ~Array(); }; Array::~Array() { delete m_data; } Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy 9
  10. Ba vấn đề con trỏ ◼ Ví dụ 2: class Array void main() { { private: Array a1(5); int m_size; Array a2(a1); int *m_data; public: } Array(int size); ~Array(); }; Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy 10
  11. Ba vấn đề con trỏ ◼ Vấn đề sao chép bộ nhớ (hdsc mặc định): ◼ Hàm dựng sao chép mặc định sao chép giá trị từng Dùng chung thuộc tính. Mất bộ nhớ!! bộ nhớ!! a1: Array a2: Array ▪m_size 5 ▪m_size ▪m_data 101 1 2 3 4 5 ▪m_data Phải cài đặt lại hàm dựng sao chép!! Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy 11
  12. Ba vấn đề con trỏ ◼ Ví dụ 2: class Array Array::Array(const Array &a) { { private: m_size = a.m_size; int m_size; m_data = new int[m_size]; int *m_data; for (int i = 0; i < m_size; i++) public: m_data[ i ] = a.m_data[ i ]; Array(int size); } Array(const Array &a); void main() ~Array(); { }; Array a1(5); Array a2(a1); } Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy 12
  13. Ba vấn đề con trỏ ◼ Ví dụ 3: class Array void main() { { private: Array a1(5); int m_size; Array a2(6); int *m_data; public: a2 = a1; Array(int size); Array(const Array &a); } ~Array(); }; Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy 13
  14. Ba vấn đề con trỏ ◼ Vấn đề sao chép bộ nhớ (ttg mặc định): ◼ Toán tử gán mặc định sao chép giá trị từng thuộc Dùng chung tính. Rò rỉ bộ nhớ!! Mất bộ nhớ!! bộ nhớ!! a1: Array a2: Array 1 2 3 4 5 6 ▪m_size 5 ▪m_size 6 ▪m_data 101 1 2 3 4 5 ▪m_data 405 Phải cài đặt lại toán tử gán!! Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy 14
  15. Ba vấn đề con trỏ ◼ Ví dụ 2: class Array Array & Array::operator =(const Array &a) { { private: delete m_data; int m_size; m_size = a.m_size; int *m_data; m_data = new int[m_size]; public: for (int i = 0; i < m_size; i++) Array(int size); m_data[ i ] = a.m_data[ i ]; return *this; Array(const Array &a); void main() } ~Array(); { Array & operator =(const Array &a); Array a1(5); }; Array a2(6); a2 = a1; } Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy 15
  16. Ba vấn đề con trỏ ◼ Dr. Guru khuyên: luật “ba ông lớn” ◼ Lớp có thuộc tính con trỏ, phải luôn kèm theo: ➢ Hàm hủy: thu hồi bộ nhớ. ➢ Hàm dựng sao chép: sao chép bộ nhớ. ➢ Toán tử gán: sao chép bộ nhớ. class HocSinh { private: char *m_hoTen; public: HocSinh(const HocSinh &h); ~HocSinh(); HocSinh & operator =(const HocSinh &h); }; Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy 16
  17. Tóm tắt ◼ Thành phần tĩnh: ◼ Thuộc tính và phương thức thuộc phạm vi lớp. ◼ Các đối tượng dùng chung thành phần tĩnh của lớp. ◼ Phương thức tĩnh chỉ truy xuất được thành phần tĩnh. ◼ Ba vấn đề con trỏ: ◼ Khi lớp có thuộc tính con trỏ: ➢ Phải có hàm hủy. ➢ Phải có hàm dựng sao chép. ➢ Phải có toán tử gán. Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy 17
  18. Nội dung ◼ Thành phần tĩnh. ◼ Ba vấn đề con trỏ. ◼ Bài tập. Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy 18
  19. Bài tập ◼ Bài tập 5.1: Dùng thành phần tĩnh để xây dựng bộ đếm đối tượng cho lớp Time. (Gợi ý) ◼ Khai báo thuộc tính tĩnh lưu số đối tượng được tạo ra. ◼ Tăng giá trị thuộc tính này khi khởi tạo đối tượng. ◼ Giảm giá trị thuộc tính này khi hủy đối tượng. ◼ Xây dựng phương thức tĩnh để truy xuất thuộc tính này. Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy 19
  20. Bài tập ◼ Bài tập 5.2: Bổ sung vào lớp Date phương thức tĩnh cho phép tạo đối tượng từ chuỗi “dd/MM/yyyy” cho trước. (Gợi ý) ◼ Phân tích chuỗi “dd/MM/yyyy” ra thành ngày, tháng, năm. ◼ Khởi tạo đối tượng từ ngày, tháng, năm vừa phân tích. ◼ Trả về đối tượng vừa tạo. Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy 20
  21. Bài tập ◼ Bài tập 5.3: Xây dựng lớp đa thức có những phương thức sau: (Nhóm tạo hủy) ◼ Khởi tạo mặc định đa thức = 0. ◼ Khởi tạo với bậc và mảng hệ số cho trước. ◼ Khởi tạo từ một đối tượng đa thức khác. ◼ Hủy đa thức, thu hồi bộ nhớ. (Nhóm truy xuất thông tin) ◼ Lấy bậc đa thức. ◼ Lấy hệ số tại bậc nào đó. Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy 21
  22. Bài tập ◼ Bài tập 5.3: Xây dựng lớp đa thức (tiếp theo): (Nhóm xử lý nghiệp vụ) ◼ So sánh với đa thức khác. ◼ Rút gọn đa thức. ◼ Tính giá trị, đạo hàm, nguyên hàm. (Nhóm toán tử) ◼ Toán tử số học: +, -, *, /, =. ◼ Toán tử so sánh: >, =, >, <<. Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy 22
  23. Bài tập ◼ Bài tập 5.4: Xây dựng lớp chuỗi có những phương thức sau: (Nhóm tạo hủy) ◼ Khởi tạo mặc định chuỗi rỗng. ◼ Khởi tạo với từ chuỗi ký tự cho trước . ◼ Khởi tạo từ một đối tượng chuỗi khác. ◼ Hủy chuỗi, thu hồi bộ nhớ. (Nhóm truy xuất thông tin) ◼ Lấy chiều dài chuỗi. Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy 23
  24. Bài tập ◼ Bài tập 5.4: Xây dựng lớp chuỗi (tiếp theo): (Nhóm xử lý nghiệp vụ) ◼ So sánh với chuỗi khác. ◼ Đổi chữ hoa, thường. ◼ Tìm chuỗi con. ◼ Trích chuỗi con. (Nhóm toán tử) ◼ Toán tử số học: +, =, +=. ◼ Toán tử so sánh: >, =, >, <<. Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy 24