Bài giảng Phương pháp Lập trình hướng đối tượng - Bài 5: Thành phần tĩnh, Ba vấn đề con trỏ - Trần Phước Tuấn

 Thành phần tĩnh.  Ba vấn đề con trỏ.  Bài tập. 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

pdf24 trang | Chia sẻ: candy98 | Lượt xem: 436 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Bài giảng Phương pháp Lập trình hướng đối tượng - Bài 5: Thành phần tĩnh, Ba vấn đề con trỏ - Trần Phước Tuấn, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
1Phương pháp lập trình hướng đối tượng. Thành phần tĩnh, Ba vấn đề con trỏ 2Phương pháp lập trình hướng đối tượng. Nội dung  Thành phần tĩnh.  Ba vấn đề con trỏ.  Bài tập. 3Phương pháp lập trình hướng đối tượng. Nội dung  Thành phần tĩnh.  Ba vấn đề con trỏ.  Bài tập. 4Phương pháp lập trình hướng đối tượng. 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 Tử số Mẫu số 2 1PhanSo Tử số Mẫu số Giá trị lớn nhất Giá trị nhỏ nhất p2: PhanSo Tử số Mẫu số 3 2 Thành phần dùng chung cho MỌI đối tượng của lớp!! 5Phương pháp lập trình hướng đối tượng. 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 { private: static int m_giaTriLN; public: static int layGiaTriLN(); private: int m_tuSo; int m_mauSo; }; PhanSo::m_giaTriLN = 10000; void main() { PhanSo p1(1, 2); PhanSo p2(2, 3); int x1 = PhanSo::layGiaTriLN(); int x2 = p1.layGiaTriLN(); } 6Phương pháp lập trình hướng đối tượng. Nội dung  Thành phần tĩnh.  Ba vấn đề con trỏ.  Bài tập. 7Phương pháp lập trình hướng đối tượng. Ba vấn đề con trỏ  Ví dụ 1: class Array { private: int m_size; int *m_data; public: Array(int size); }; Array::Array(int size) { m_size = size; m_data = new int[m_size]; } void main() { Array a1(5); } 8Phương pháp lập trình hướng đối tượng. 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 m_size m_data Phải dùng hàm hủy để dọn dẹp!! 1 2 3 4 5101 Rò rỉ bộ nhớ!! 5 9Phương pháp lập trình hướng đối tượng. Ba vấn đề con trỏ  Ví dụ 1: class Array { private: int m_size; int *m_data; public: Array(int size); ~Array(); }; Array::~Array() { delete m_data; } void main() { Array a1(5); } 10Phương pháp lập trình hướng đối tượng. Ba vấn đề con trỏ  Ví dụ 2: class Array { private: int m_size; int *m_data; public: Array(int size); ~Array(); }; void main() { Array a1(5); Array a2(a1); } 11Phương pháp lập trình hướng đối tượng. 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 thuộc tính. a1: Array m_size m_data Phải cài đặt lại hàm dựng sao chép!! 1 2 3 4 5101 5 a2: Array m_size m_data Dùng chung bộ nhớ!! Mất bộ nhớ!! 12Phương pháp lập trình hướng đối tượng. Ba vấn đề con trỏ  Ví dụ 2: class Array { private: int m_size; int *m_data; public: Array(int size); Array(const Array &a); ~Array(); }; void main() { Array a1(5); Array a2(a1); } Array::Array(const Array &a) { m_size = a.m_size; m_data = new int[m_size]; for (int i = 0; i < m_size; i++) m_data[ i ] = a.m_data[ i ]; } 13Phương pháp lập trình hướng đối tượng. Ba vấn đề con trỏ  Ví dụ 3: class Array { private: int m_size; int *m_data; public: Array(int size); Array(const Array &a); ~Array(); }; void main() { Array a1(5); Array a2(6); a2 = a1; } 14Phương pháp lập trình hướng đối tượng. 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 tính. a1: Array m_size m_data Phải cài đặt lại toán tử gán!! 1 2 3 4 5101 5 a2: Array m_size m_data 405 6 1 2 3 4 5 6 Rò rỉ bộ nhớ!! Dùng chung bộ nhớ!! Mất bộ nhớ!! 15Phương pháp lập trình hướng đối tượng. Ba vấn đề con trỏ  Ví dụ 2: class Array { private: int m_size; int *m_data; public: Array(int size); Array(const Array &a); ~Array(); Array & operator =(const Array &a); }; void main() { Array a1(5); Array a2(6); a2 = a1; } Array & Array::operator =(const Array &a) { delete m_data; m_size = a.m_size; m_data = new int[m_size]; for (int i = 0; i < m_size; i++) m_data[ i ] = a.m_data[ i ]; return *this; } 16Phương pháp lập trình hướng đối tượng. 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); }; 17Phương pháp lập trình hướng đối tượng. 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. 18Phương pháp lập trình hướng đối tượng. Nội dung  Thành phần tĩnh.  Ba vấn đề con trỏ.  Bài tập. 19Phương pháp lập trình hướng đối tượng. 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. 20Phương pháp lập trình hướng đối tượng. 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. 21Phương pháp lập trình hướng đối tượng. 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 đó. 22Phương pháp lập trình hướng đối tượng. 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: >, =, <=, !=  Toán tử đạo hàm (!), nguyên hàm (~).  Toán tử nhập xuất: >>, <<. 23Phương pháp lập trình hướng đối tượng. 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. 24Phương pháp lập trình hướng đối tượng. 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: >, =, <=, !=  Toán tử mảng: [ ].  Toán tử ép kiểu: (char *).  Toán tử nhập xuất: >>, <<.