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