Thành phần tĩnh, Ba vấn đề con trỏ

Phương pháp lập trình hướng đối tượng.

1

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.

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.

3

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.

Tử số Mẫu số

p1: PhanSo 1 PhanSo PhanSo

2

Thành phần dùng chung cho MỌI đối tượng của lớp!!

Tử số Tử số Mẫu số Mẫu số Giá trị lớn nhất Giá trị lớn nhất Giá trị nhỏ nhất Giá trị nhỏ nhất

Tử số Mẫu số

p2: PhanSo 2

Phương pháp lập trình hướng đối tượng.

4

3

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ử ::.

PhanSo::m_giaTriLN = 10000;

class PhanSo { private:

static int m_giaTriLN; void main() {

public:

static int layGiaTriLN(); PhanSo p1(1, 2); PhanSo p2(2, 3);

private: int int m_tuSo; m_mauSo; int x1 = PhanSo::layGiaTriLN(); int x2 = p1.layGiaTriLN();

Phương pháp lập trình hướng đối tượng.

5

}; }

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.

6

Ba vấn đề con trỏ

void main() {

Array a1(5); …

 Ví dụ 1: class Array { private: int int

} m_size; *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.

7

}

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ớ!!

5

m_size 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.

8

Ba vấn đề con trỏ

void main() {

Array a1(5); …

 Ví dụ 1: class Array { private: int int

} m_size; *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.

9

}

Ba vấn đề con trỏ

void main() {

 Ví dụ 2: class Array { private: int int

Array a1(5); Array a2(a1); … m_size; *m_data;

} public:

Array(int size); ~Array();

Phương pháp lập trình hướng đối tượng.

10

};

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.

Mất bộ nhớ!!

Dùng chung bộ nhớ!!

a1: Array

a2: Array

5 5

m_size m_data

m_size m_data

101 101

1 2 3 4 5

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.

11

Ba vấn đề con trỏ

 Ví dụ 2: class Array { private: int int

Array::Array(const Array &a) {

m_size; *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 ]; public:

}

Array(int size); Array(const Array &a); ~Array(); void main() {

};

Array a1(5); Array a2(a1); …

Phương pháp lập trình hướng đối tượng.

12

}

Ba vấn đề con trỏ

 Ví dụ 3: class Array { private: int int

void main() {

m_size; *m_data;

public:

Array a1(5); Array a2(6); … a2 = a1; …

}

Array(int size); Array(const Array &a); ~Array();

Phương pháp lập trình hướng đối tượng.

13

};

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.

Rò rỉ bộ nhớ!!

Mất bộ nhớ!!

Dùng chung bộ nhớ!!

a1: Array

a2: Array

1 2 3 4 5 6

5 5

6

m_size m_data

m_size m_data

101 101

1 2 3 4 5

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.

14

Ba vấn đề con trỏ

 Ví dụ 2: class Array { private: int int

Array & Array::operator =(const Array &a) {

m_size; *m_data;

public:

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;

} void main() {

Array(int size); Array(const Array &a); ~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.

15

}

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.

16

};

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.

17

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.

18

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.

19

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.

20

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.

21

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: >>, <<.

Phương pháp lập trình hướng đối tượng.

22

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.

23

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: >>, <<.

Phương pháp lập trình hướng đối tượng.

24