Hàm dựng, Hàm dựng, Hàm hủy, Hàm hủy, Hàm toán tử Hàm toán tử
Phương pháp lập trình hướng đối tượng .
1
Nội dung Nội dung
Hàm dựng. Hàm dựng. Hàm hủy. Hàm hủy. Hàm toán tử. Hàm toán tử. Bài tập. Bài tập.
Phương pháp lập trình hướng đối tượng .
2
Nội dung Nội dung
Hàm dựng. Hàm dựng. Hàm hủy. Hàm hủy. Hàm toán tử. Hàm toán tử. Bài tập. Bài tập.
Phương pháp lập trình hướng đối tượng .
3
Hàm dựng Hàm dựng
Khi đối tượng vừa được tạo: Khi đối tượng vừa được tạo:
Giá trị các thuộc tính bằng bao nhiêu? Giá trị các thuộc tính bằng bao nhiêu? Đối tượng cần có thông tin ban đầu. Đối tượng cần có thông tin ban đầu. Giải pháp: Giải pháp:
Xây dựng phương thức cung cấp thông tin. Xây dựng phương thức cung cấp thông tin. Người dùng quên gọi?! Người dùng quên gọi?! Làm khai sinh” cho đối tượng! ““Làm khai sinh” cho đối tượng!
PhanSo PhanSo
HocSinh HocSinh
Tử số?? Tử số?? Mẫu số?? Mẫu số??
Hàm dựng ra đời!! Hàm dựng ra đời!!
Họ tên?? Họ tên?? Điểm văn?? Điểm văn?? Điểm toán?? Điểm toán??
Phương pháp lập trình hướng đối tượng .
4
Hàm dựng Hàm dựng
Tính chất hàm dựng (constructor): Tính chất hàm dựng (constructor): Bắt buộc gọi khi tạo đối tượng. Bắt buộc gọi khi tạo đối tượng. Có thể nạp chồng nhiều hàm dựng. 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. Trong C++, hàm dựng có tên trùng tên lớp.
void main() void main() {{
class PhanSo class PhanSo {{ private: private: int int int int m_tuSo; m_tuSo; m_mauSo; m_mauSo; PhanSo p1(1, 2); PhanSo p1(1, 2); PhanSo p2(2, 3); PhanSo p2(2, 3); PhanSo *p3 = new PhanSo(2, 3); PhanSo *p3 = new PhanSo(2, 3);
public: public: }}
PhanSo(int tuSo, int mauSo); PhanSo(int tuSo, int mauSo); PhanSo(int giaTri); PhanSo(int giaTri);
Phương pháp lập trình hướng đối tượng .
5
};};
Hàm dựng Hàm dựng
Hàm dựng mặc định (default constructor): Hàm dựng mặc định (default constructor):
Không có tham số. Không có tham số. Dùng tạo đối tượng với thông tin mặc định. Dùng tạo đối tượng với thông tin mặc định. Lớp không có hàm dựng. Lớp không có hàm dựng. Trình biên dịch cung cấp. Trình biên dịch cung cấp.
void main() void main() {{
PhanSo p; PhanSo p; PhanSo q = new PhanSo; PhanSo q = new PhanSo; class PhanSo class PhanSo {{ private: private: int int int int m_tuSo; m_tuSo; m_mauSo; m_mauSo;
}} public: public:
PhanSo(); PhanSo();
Phương pháp lập trình hướng đối tượng .
6
};};
Hàm dựng Hàm dựng
Hàm dựng sao chép (copy constructor): Hàm dựng sao chép (copy constructor):
Có tham số là đối tượng cùng lớp. Có tham số là đối tượng cùng lớp. Dùng tạo đối tượng từ đối tượng cùng loại. Dùng tạo đối tượng từ đối tượng cùng loại. Lớp không có hàm dựng sao chép. Lớp không có hàm dựng sao chép. Trình biên dịch cung cấp. Trình biên dịch cung cấp.
void main() void main() {{
PhanSo p1(1, 2); PhanSo p1(1, 2); PhanSo p2(p1); PhanSo p2(p1); PhanSo p3 = p2; PhanSo p3 = p2; class PhanSo class PhanSo {{ private: private: int int int int m_tuSo; m_tuSo; m_mauSo; m_mauSo;
}} public: public:
PhanSo(const PhanSo &p); PhanSo(const PhanSo &p);
Phương pháp lập trình hướng đối tượng .
7
};};
Hàm dựng Hàm dựng
Dr. Guru khuyên: Dr. Guru khuyên:
Một lớp nên có tối thiểu 3 hàm dựng: Một lớp nên có tối thiểu 3 hàm dựng:
Hàm dựng mặc định. Hàm dựng mặc định. Hàm dựng có đầy đủ tham số. Hàm dựng có đầy đủ tham số. Hàm dựng sao chép. Hàm dựng sao chép.
class PhanSo class PhanSo { private: { private: int int int int m_tuSo; m_tuSo; m_mauSo; m_mauSo;
public: public:
PhanSo(); PhanSo(); PhanSo(int tuSo, int mauSo); PhanSo(int tuSo, int mauSo); PhanSo(const PhanSo &p); PhanSo(const PhanSo &p);
Phương pháp lập trình hướng đối tượng .
8
};};
Nội dung Nội dung
Hàm dựng. Hàm dựng. Hàm hủy. Hàm hủy. Hàm toán tử. Hàm toán tử. Bài tập. Bài tập.
Phương pháp lập trình hướng đối tượng .
9
Hàm hủy Hàm hủy
Vấn đề rò rỉ bộ nhớ (memory leak): Vấn đề rò rỉ bộ nhớ (memory leak):
Khi hoạt động, đối tượng có cấp phát bộ nhớ. Khi hoạt động, đối tượng có cấp phát bộ nhớ. Khi hủy đi, bộ nhớ không được thu hồi!! Khi hủy đi, bộ nhớ không được thu hồi!! Giải pháp: Giải pháp:
Xây dựng phương thức thu hồi. Xây dựng phương thức thu hồi. Người dùng quên gọi! Người dùng quên gọi! Làm “khai tử” cho đối tượng. Làm “khai tử” cho đối tượng.
HocSinh HocSinh
Rò rỉ bộ nhớ!!
Họ tên Họ tên Điểm văn Điểm văn Điểm toán Điểm toán
Hàm hủy vào cuộc!! Hàm hủy vào cuộc!!
Thu hồi Thu hồi
Phương pháp lập trình hướng đối tượng .
10
Hàm hủy Hàm hủy
Tính chất hàm hủy (destructor):
Tính chất hàm hủy (destructor):
Tự động gọi khi đối tượng bị hủy.
Tự động gọi khi đối tượng bị hủy.
Mỗi lớp có duy nhất một hàm hủy.
Mỗi lớp có duy nhất một hàm hủy.
~
Trong C++, hàm hủy có tên ~
Trong C++, hàm hủy có tên
class HocSinh class HocSinh {{ private: private: void main() void main() {{
char char float float float float *m_hoTen; *m_hoTen; m_diemVan; m_diemVan; m_diemToan; m_diemToan; HocSinh h; HocSinh h; HocSinh *p = new HocSinh; HocSinh *p = new HocSinh; delete p; delete p;
public: public: }}
~HocSinh() { delete m_hoTen; } ~HocSinh() { delete m_hoTen; }
Phương pháp lập trình hướng đối tượng .
11
};};
Nội dung Nội dung
Hàm dựng. Hàm dựng. Hàm hủy. Hàm hủy. Hàm toán tử. Hàm toán tử. Bài tập. Bài tập.
Phương pháp lập trình hướng đối tượng .
12
Hàm toán tử Hàm toán tử
Khái niệm hàm toán tử: Khái niệm hàm toán tử:
Có thể dùng toán tử đặt tên hàm? Có thể dùng toán tử đặt tên hàm? Trong C++, dùng từ khóa operator. Trong C++, dùng từ khóa operator.
PhanSo operator + PhanSo operator +((const PhanSo &p1, const PhanSo &p2 const PhanSo &p1, const PhanSo &p2););
Hệ quả? Hệ quả?
Định nghĩa lại cách thực hiện toán tử. Định nghĩa lại cách thực hiện toán tử.
PhanSo p1, p2; PhanSo p1, p2; PhanSo p3 = p1 + p2; PhanSo p3 = p1 + p2;
const PhanSo &p, int so););
Định nghĩa nhiều cách thực hiện khác nhau cho toán tử Định nghĩa nhiều cách thực hiện khác nhau cho toán tử bằng nạp chồng hàm. bằng nạp chồng hàm. PhanSo operator + PhanSo float opeartor + float
Phương pháp lập trình hướng đối tượng .
13
operator +((const PhanSo &p, int so const PhanSo &p, float so);); opeartor +((const PhanSo &p, float so
Hàm toán tử Hàm toán tử
Ưu điểm: Ưu điểm:
Thực hiện toán tử trên kiểu dữ liệu tự định nghĩa. Thực hiện toán tử trên kiểu dữ liệu tự định nghĩa.
PhanSo p1, p2; PhanSo p1, p2; PhanSo p3 = p1 + p2; PhanSo p3 = p1 + p2; HocSinh h1, h2; HocSinh h1, h2; if (h1 > h2) if (h1 > h2) h1++; h1++;
Hạn chế: Hạn chế:
Không thể tạo toán tử mới. Không thể tạo toán tử mới. Không thể định nghĩa lại toán tử trên kiểu cơ bản. Không thể định nghĩa lại toán tử trên kiểu cơ bản. Ngôi của toán tử giữ nguyên. Ngôi của toán tử giữ nguyên. Độ ưu tiên của toán tử không đổi. Độ ưu tiên của toán tử không đổi. Đôi khi gây nhầm lẫn!! Đôi khi gây nhầm lẫn!!
Phương pháp lập trình hướng đối tượng .
14
Hàm toán tử Hàm toán tử
Phân loại hàm toán tử: Phân loại hàm toán tử: Toán tử độc lập: Toán tử độc lập:
Không thuộc lớp nào. Không thuộc lớp nào. Ngôi của toán tử là số tham số truyền vào. Ngôi của toán tử là số tham số truyền vào.
operator +((const PhanSo &p1, const PhanSo &p2 const PhanSo &p1, const PhanSo &p2););
operator >((const PhanSo &p1, const PhanSo &p2 const PhanSo &p1, const PhanSo &p2););
Là phương thức của lớp. Là phương thức của lớp. Ngôi của toán tử: đối tượng của lớp + số tham số. Ngôi của toán tử: đối tượng của lớp + số tham số.
PhanSo operator + PhanSo bool operator > bool Toán tử thuộc lớp: Toán tử thuộc lớp:
PhanSo::operator +((const PhanSo &p const PhanSo &p););
PhanSo PhanSo::operator + PhanSo bool PhanSo::operator > bool PhanSo::operator >((const PhanSo &p const PhanSo &p););
Cách sử dụng 2 loại là như nhau!! Cách sử dụng 2 loại là như nhau!!
Phương pháp lập trình hướng đối tượng .
15
Hàm toán tử Hàm toán tử
Toán tử có thể định nghĩa lại: Toán tử có thể định nghĩa lại:
NgôiNgôi
NhómNhóm
Toán tử Toán tử
1 Ngôi (Unary) 1 Ngôi (Unary)
Tăng giảm Tăng giảm
++, -- ++, --
Dấu số học Dấu số học
+, -+, -
Logic Logic
!, ~!, ~
Con trỏ Con trỏ
*, &*, &
Ép kiểu Ép kiểu
int, float, double, … int, float, double, …
2 Ngôi (Binary) 2 Ngôi (Binary)
Số học Số học
+, -, *, /, %, +=, -=, *=, /=, %= +, -, *, /, %, +=, -=, *=, /=, %=
So sánh So sánh
>, <, ==, >=, <=, != >, <, ==, >=, <=, !=
Logic Logic
&&, ||, &, | &&, ||, &, |
Nhập xuất Nhập xuất
<<, >> <<, >>
GánGán
==
Lấy chỉ số mảng Lấy chỉ số mảng
[ ][ ]
Phương pháp lập trình hướng đối tượng .
16
Hàm toán tử Hàm toán tử
Toán tử không thể định nghĩa lại: Toán tử không thể định nghĩa lại:
Toán tử Toán tử Ý nghĩa Ý nghĩa
Truy xuất phần tử Truy xuất phần tử ..
Truy xuất con trỏ phần tử Truy xuất con trỏ phần tử .*.*
Toán tử :: Toán tử :: ::::
Toán tử điều kiện Toán tử điều kiện ? :? :
Chỉ thị tiền xử lý Chỉ thị tiền xử lý ##
Phương pháp lập trình hướng đối tượng .
17
Chỉ thị tiền xử lý Chỉ thị tiền xử lý # ## #
Hàm toán tử Hàm toán tử
Dr. Guru khuyên: Dr. Guru khuyên:
Những lưu ý khi định nghĩa lại toán tử: Những lưu ý khi định nghĩa lại toán tử:
Ngôi: số lượng tham số. Ngôi: số lượng tham số. Toán hạng: kiểu dữ liệu tham số. Toán hạng: kiểu dữ liệu tham số. Kết quả: kiểu trả về. Kết quả: kiểu trả về.
Ví dụ: Ví dụ:
Toán tử >. Toán tử >. Toán tử =. Toán tử =. Toán tử [ ]. Toán tử [ ].
Phương pháp lập trình hướng đối tượng .
18
Tóm tắt Tóm tắt
Hàm dựng: Hàm dựng:
Khởi tạo thông tin ban đầu cho đối tượng. Khởi tạo thông tin ban đầu cho đối tượng. Bắt buộc gọi khi tạo đối tượng. Bắt buộc gọi khi tạo đối tượng. Mỗi lớp có thể có nhiều hàm dựng. Mỗi lớp có thể có nhiều hàm dựng.
Hàm hủy: Hàm hủy:
Dọn dẹp bộ nhớ cho đối tượng. Dọn dẹp bộ nhớ cho đối tượng. Tự động gọi khi đối tượng bị hủy. Tự động gọi khi đối tượng bị hủy. Mỗi lớp có duy nhất một hàm hủy. Mỗi lớp có duy nhất một hàm hủy.
Phương pháp lập trình hướng đối tượng .
19
Tóm tắt Tóm tắt
Hàm toán tử: Hàm toán tử:
Hàm có tên là toán tử. Hàm có tên là toán tử. Dùng định nghĩa lại toán tử. Dùng định nghĩa lại toán tử. Ràng buộc: Ràng buộc:
Ngôi của toán tử giữ nguyên. Ngôi của toán tử giữ nguyên. Độ ưu tiên của toán tử không đổi. Độ ưu tiên của toán tử không đổi. Không thể tạo toán tử mới. Không thể tạo toán tử mới. Không thể định nghĩa lại toán tử cho kiểu cơ bản. Không thể định nghĩa lại toán tử cho kiểu cơ bản.
Có 2 loại hàm toán tử: Có 2 loại hàm toán tử: Toán tử độc lập. Toán tử độc lập. Toán tử thuộc lớp. Toán tử thuộc lớp.
Phương pháp lập trình hướng đối tượng .
20
Nội dung Nội dung
Hàm dựng. Hàm dựng. Hàm hủy. Hàm hủy. Hàm toán tử. Hàm toán tử. Bài tập. Bài tập.
Phương pháp lập trình hướng đối tượng .
21
Bài tập Bài tập
những phương thức sau: phân số những phương thức sau:
Bài tập 3.1: Bài tập 3.1: Bổ sung vào lớp phân số Bổ sung vào lớp (Nhóm tạo hủy) (Nhóm tạo hủy)
Khởi tạo mặc định phân số = 0. 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 tử và mẫu cho trước. Khởi tạo từ giá trị nguyên cho trước. Khởi tạo từ giá trị nguyên cho trước. Khởi tạo từ một phân số khác. Khởi tạo từ một phân số khác.
(Nhóm toán tử) (Nhóm toán tử)
Toán tử số học: +, -, *, /, =, +=, -=. Toán tử số học: +, -, *, /, =, +=, -=. Toán tử so sánh: >, <, ==, >=, <=, !=. Toán tử so sánh: >, <, ==, >=, <=, !=. Toán tử một ngôi: ++, -- (tăng, giảm 1). Toán tử một ngôi: ++, -- (tăng, giảm 1). Toán tử ép kiểu: (float), (int). Toán tử ép kiểu: (float), (int). Toán tử nhập, xuất: >>, <<. Toán tử nhập, xuất: >>, <<.
Phương pháp lập trình hướng đối tượng .
22
Bài tập Bài tập
những phương thức sau: số phức những phương thức sau:
Bài tập 3.2: Bài tập 3.2: Bổ sung vào lớp số phức Bổ sung vào lớp (Nhóm tạo hủy) (Nhóm tạo hủy)
Khởi tạo mặc định số phức = 0. Khởi tạo mặc định số phức = 0. Khởi tạo với phần thực và phần ảo cho trước. Khởi tạo với phần thực và phần ảo cho trước. Khởi tạo từ giá trị thực cho trước. Khởi tạo từ giá trị thực cho trước. Khởi tạo từ một số phức khác. Khởi tạo từ một số phức khác.
(Nhóm toán tử) (Nhóm toán tử)
Toán tử số học: +, -, *, /, =, +=, -=. Toán tử số học: +, -, *, /, =, +=, -=. Toán tử so sánh: >, <, ==, >=, <=, !=. Toán tử so sánh: >, <, ==, >=, <=, !=. Toán tử một ngôi: ++, -- (tăng, giảm 1). Toán tử một ngôi: ++, -- (tăng, giảm 1). Toán tử ép kiểu: (float), (int). Toán tử ép kiểu: (float), (int). Toán tử nhập, xuất: >>, <<. Toán tử nhập, xuất: >>, <<.
Phương pháp lập trình hướng đối tượng .
23
Bài tập Bài tập
những phương thức sau: đơn thức những phương thức sau:
Bài tập 3.3: Bài tập 3.3: Bổ sung vào lớp đơn thức Bổ sung vào lớp (Nhóm tạo hủy) (Nhóm tạo hủy)
Khởi tạo mặc định đơn thức = 0. Khởi tạo mặc định đơn thức = 0. Khởi tạo với hệ số và số mũ cho trước. Khởi tạo với hệ số và số mũ cho trước. Khởi tạo từ một đơn thức khác. Khởi tạo từ một đơn thức khác.
(Nhóm toán tử) (Nhóm toán tử)
Toán tử số học: +, -, *, /, =, +=, -=. Toán tử số học: +, -, *, /, =, +=, -=. Toán tử so sánh: >, <, ==, >=, <=, !=. Toán tử so sánh: >, <, ==, >=, <=, !=. Toán tử một ngôi: Toán tử một ngôi:
Toán tử nhập, xuất: >>, <<. Toán tử nhập, xuất: >>, <<.
Phương pháp lập trình hướng đối tượng .
24
++, -- (tăng, giảm bậc). ++, -- (tăng, giảm bậc). ! (đạo hàm), ~ (nguyên hàm). ! (đạo hàm), ~ (nguyên hàm).
Bài tập Bài tập
những phương thức sau: học sinh những phương thức sau:
Bài tập 3.4: Bài tập 3.4: Bổ sung vào lớp học sinh Bổ sung vào lớp (Nhóm tạo hủy) (Nhóm tạo hủy)
Khởi tạo với họ tên và điểm văn, toán cho trước. Khởi tạo với họ tên và điểm văn, toán cho trước. Khởi tạo với họ tên cho trước, điểm văn, toán = 0. Khởi tạo với họ tên cho trước, điểm văn, toán = 0. Khởi tạo từ một học sinh khác. Khởi tạo từ một học sinh khác. Hủy đối tượng học sinh, thu hồi bộ nhớ. Hủy đối tượng học sinh, thu hồi bộ nhớ.
(Nhóm toán tử) (Nhóm toán tử)
Toán tử so sánh (ĐTB): >, <, ==, >=, <=, !=. Toán tử so sánh (ĐTB): >, <, ==, >=, <=, !=. Toán tử gán: =. Toán tử gán: =. Toán tử nhập, xuất: >>, <<. Toán tử nhập, xuất: >>, <<.
Phương pháp lập trình hướng đối tượng .
25
Bài tập Bài tập
Bài tập 3.5: Bài tập 3.5: những phương thức sau: Bổ sung vào lớp mảngmảng những phương thức sau: Bổ sung vào lớp (Nhóm tạo hủy) (Nhóm tạo hủy)
Khởi tạo mặc định mảng kích thước = 0. Khởi tạo mặc định mảng kích thước = 0. Khởi tạo với kích thước cho trước, các phần tử = 0. Khởi tạo với kích thước cho trước, các phần tử = 0. Khởi tạo từ một mảng int [ ] với kích thước cho trước. Khởi tạo từ một mảng int [ ] với kích thước cho trước. Khởi tạo từ một đối tượng IntArray khác. Khởi tạo từ một đối tượng IntArray khác. Hủy đối tượng mảng, thu hồi bộ nhớ. Hủy đối tượng mảng, thu hồi bộ nhớ.
(Nhóm toán tử) (Nhóm toán tử)
Toán tử gán: =. Toán tử gán: =. Toán tử lấy phần tử: [ ]. Toán tử lấy phần tử: [ ]. Toán tử ép kiểu: (int *). Toán tử ép kiểu: (int *). Toán tử nhập, xuất: >>, <<. Toán tử nhập, xuất: >>, <<.
Phương pháp lập trình hướng đối tượng .
26