Lập trình hướng đối tượng C/C++ -OOP 05 the law of the big three
Trang 1GV
GV Nguyễn Nguyễn Minh Minh Huy Huy
Ba
Trang 2Ba Ba vấn vấn đề đề con con trỏ trỏ
Trang 3The Law of The Big Three
Ví dụ 1:
class Array
{{
private:
int m_size;
int *m_data;
public:
void main() {{
Array a1(5);
>
}}
public:
Array(int size);
};
Array::Array(int size)
{{
m_size = size;
m_data = new int[m_size];
Trang 4The Law of The Big Three
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
m_data
Phải dùng hàm hủy để dọn dẹp!!
1 2 3 4 5 101
Rò rỉ bộ nhớ!!
5
Trang 5The Law of The Big Three
Ví dụ 1:
class Array
{{
private:
int m_size;
int *m_data;
public:
void main() {{
Array a1(5);
>
}}
public:
Array(int size);
~Array();
};
Array::~Array()
{{
delete []m_data;
Trang 6The Law of The Big Three
Ví dụ 2:
class Array
{{
private:
int m_size;
int *m_data;
public:
void main() {{
Array a1(5);
Array a2(a1);
>
}}
public:
Array(int size);
~Array();
};
}}
Trang 7The Law of The Big Three
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.
Dùng chung
bộ nhớ!! Mất bộ nhớ!!
m_size
m_data
Phải cài đặt lại hàm dựng sao chép!!
1 2 3 4 5 101
m_data
101 5
Trang 8The Law of The Big Three
Ví dụ 2:
class Array
{{
private:
int m_size;
int *m_data;
public:
Array::Array(const Array &a) {{
m_size m_size = = a.m_size a.m_size;;
m_data m_data = new = new int int[[m_size m_size]; ];
for ( for (int int ii = 0; = 0; ii < < m_size m_size; ; ii++) ++)
m_data m_data[ [ ii ] = ] = a.m_data a.m_data[ [ ii ]; ];
public:
Array(int size);
Array(const Array &a);
~Array();
};
void main() {{
Array a1(5);
Array a2(a1);
>
}}
m_data m_data[ [ ii ] = ] = a.m_data a.m_data[ [ ii ]; ]; }}
Trang 9The Law of The Big Three
Ví dụ 3:
class Array
{{
private:
int m_size;
int *m_data;
public:
void main() {{
Array a1(5);
Array a2(6);
>
a2 = a1;
public:
Array(int size);
Array(const Array &a);
~Array();
};
a2 = a1;
>
}}
Trang 10The Law of The Big Three
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ớ!!
Dùng chung
m_size
m_data
Phải cài đặt lại toán tử gán!!
1 2 3 4 5 101
m_data 405
6
1 2 3 4 5 6 101
5
Trang 11The Law of The Big Three
Ví dụ 2:
class Array
{{
private:
int m_size;
int *m_data;
public:
Array & Array::operator =(const Array &a) {{
delete delete m_data m_data;;
m_size m_size = = a.m_size a.m_size;;
m_data m_data = new = new int int[[m_size m_size]; ];
for ( for (int int ii = 0; = 0; ii < < m_size m_size; ; ii++) ++)
public:
Array(int size);
Array(const Array &a);
~Array();
Array & operator =(const Array &a);
};
void main() {{
Array a1(5);
Array a2(6);
>
for ( for (int int ii = 0; = 0; ii < < m_size m_size; ; ii++) ++)
m_data m_data[ [ ii ] = ] = a.m_data a.m_data[ [ ii ]; ];
return *this;
}}
Trang 12The Law of The Big Three
Dr Guru khuyên: Dr Guru khuyên: luật “ba ông lớ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
class HocSinh
{{
private:
char *m_hoTen;
public:
HocSinh(const HocSinh &h);
~HocSinh();
HocSinh & operator =(const HocSinh &h);
Trang 13Bài Bài tập tập 5.1: 5.1:
Xây
Xây dựng dựng lớp lớp ma ma trận trận có có những những phương phương thức thức cần cần thiết thiết để để đoạn đoạn
chương
chương trình trình sau sau chạy chạy đúng đúng ngữ ngữ nghĩa nghĩa
void main()
{{
MaTran
MaTran<<intint> m1(3, 5);> m1(3, 5); // // KhởiKhởi tạotạo ma ma trậntrận 3 x 5, 3 x 5, cáccác phầnphần tửtử = 0.= 0 MaTran
MaTran<<intint> m2 = m1;> m2 = m1; // // KhởiKhởi tạotạo m2 m2 từtừ m1.m1
MaTran MaTran<<intint> m2 = m1;> m2 = m1; // // KhởiKhởi tạotạo m2 m2 từtừ m1.m1
MaTran MaTran<<intint> m3 = m1 + m2; // > m3 = m1 + m2; // CộngCộng ma ma trậntrận
int int max = m3.timMax();max = m3.timMax(); // // TìmTìm phầnphần tửtử lớnlớn nhấtnhất
cout cout << m3;<< m3; // // XuấtXuất phầnphần tửtử ma ma trậntrận
}}
Trang 14Bài Bài tập tập 5.2: 5.2:
Xây
Xây dựng dựng lớp lớp con con trỏ trỏ an an toàn toàn cho cho mọi mọi kiểu kiểu dữ dữ liệu liệu::
((Nhóm Nhóm tạo tạo hủy hủy))
Khởi Khởi tạo tạo mặc mặc định định con con trỏ trỏ NULL NULL.
Khởi Khởi tạo tạo với với kích kích thước thước bộ bộ nhớ nhớ được được cấp cấp phát phát cho cho trước trước
Khởi Khởi tạo tạo từ từ một một đối đối tượng tượng con con trỏ trỏ khác khác
Khởi Khởi tạo tạo từ từ một một đối đối tượng tượng con con trỏ trỏ khác khác
Hủy Hủy con con trỏ trỏ, , thu thu hồi hồi bộ bộ nhớ nhớ
((Nhóm Nhóm toán toán tử tử))
Toán Toán tử tử số số học học: +, : +, , = , =.
Toán Toán tử tử một một ngôi ngôi: ++, : ++,
Toán Toán tử tử con con trỏ trỏ: *, &, [ ] : *, &, [ ].
Toán Toán tử tử ép ép kiểu kiểu: ( : (int int) ).
Toán Toán tử tử cấp cấp phát phát và và hủy hủy vùng vùng nhớ nhớ: new, delete : new, delete.