BaBa
vấnvấn
đềđề
con con
trỏtrỏ
GV. GV. NguyễnNguyễn Minh Minh HuyHuy
BaBa
vấnvấn
đềđề
con con
trỏtrỏ
1Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
NộiNội dungdung
BaBa vấnvấn đềđề con con trỏtrỏ
2Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
The Law of The Big ThreeThe Law of The Big Three
Ví dụ 1:Ví dụ 1:
class Arrayclass Array
{{
private:private:
intint m_size;m_size;
intint *m_data;*m_data;
public:public:
void main()void main()
{{
Array a1(5);Array a1(5);
}}
3Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
public:public:
Array(int size);Array(int size);
};};
Array::Array(int size)Array::Array(int size)
{{
m_size = size;m_size = size;
m_data = new int[m_size];m_data = new int[m_size];
}}
The Law of The Big ThreeThe Law of The Big Three
Vấn đề rò rỉ bộ nhớ:Vấn đề rò rỉ bộ nhớ:
Lớp có thuộc tính con trỏ.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.Đối tượng của lớp bị hủy, bộ nhớ không thu hồi.
a1: Array
Rò rỉ bộ nhớ!!
4Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
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
The Law of The Big ThreeThe Law of The Big Three
Ví dụ 1:Ví dụ 1:
class Arrayclass Array
{{
private:private:
intint m_size;m_size;
intint *m_data;*m_data;
public:public:
void main()void main()
{{
Array a1(5);Array a1(5);
}}
5Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
public:public:
Array(int size);Array(int size);
~Array();~Array();
};};
Array::~Array()Array::~Array()
{{
delete []m_data;delete []m_data;
}}
The Law of The Big ThreeThe Law of The Big Three
Ví dụ 2:Ví dụ 2:
class Arrayclass Array
{{
private:private:
intint m_size;m_size;
intint *m_data;*m_data;
public:public:
void main()void main()
{{
Array a1(5);Array a1(5);
Array a2(a1);Array a2(a1);
}}
6Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
public:public:
Array(int size);Array(int size);
~Array();~Array();
};};
}}
The Law of The Big ThreeThe Law of The Big Three
Vấn đề sao chép bộ nhớ (hdsc mặc định):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 Hàm dựng sao chép mặc định sao chép giá trị từng
thuộc tính.thuộc tính.
a1: Array a2: Array
Dùng chung
bộ nhớ!!
Mất bộ nhớ!!
7Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
m_size
m_data
Phải cài đặt lại hàm dựng sao chép!!
1 2 3 4 5101
5
m_size
m_data
101
5
The Law of The Big ThreeThe Law of The Big Three
Ví dụ 2:Ví dụ 2:
class Arrayclass Array
{{
private:private:
intint m_size;m_size;
intint *m_data;*m_data;
public:public:
Array::Array(const Array &a)Array::Array(const Array &a)
{{
m_sizem_size = = a.m_sizea.m_size;;
m_datam_data = new = new intint[[m_sizem_size];];
for (for (intint ii = 0; = 0; ii < < m_sizem_size; ; ii++)++)
m_datam_data
[ [
ii
] = ] =
a.m_dataa.m_data
[ [
ii
];];
8Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
public:public:
Array(int size);Array(int size);
Array(const Array &a);Array(const Array &a);
~Array();~Array();
};};
void main()void main()
{{
Array a1(5);Array a1(5);
Array a2(a1);Array a2(a1);
}}
m_datam_data
[ [
ii
] = ] =
a.m_dataa.m_data
[ [
ii
];];
}}
The Law of The Big ThreeThe Law of The Big Three
Ví dụ 3:Ví dụ 3:
class Arrayclass Array
{{
private:private:
intint m_size;m_size;
intint *m_data;*m_data;
public:public:
void main()void main()
{{
Array a1(5);Array a1(5);
Array a2(6);Array a2(6);
a2 = a1;a2 = a1;
9Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
public:public:
Array(int size);Array(int size);
Array(const Array &a);Array(const Array &a);
~Array();~Array();
};};
a2 = a1;a2 = a1;
}}
The Law of The Big ThreeThe Law of The Big Three
Vấn đề sao chép bộ nhớ (ttg mặc định):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 Toán tử gán mặc định sao chép giá trị từng thuộc
tính.tính.
a1: Array a2: Array
Rò rỉ bộ nhớ!!
Dùng chung
bộ nhớ!!
Mất bộ nhớ!!
10Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
m_size
m_data
Phải cài đặt lại toán tử gán!!
1 2 3 4 5101
5
m_size
m_data
405
6
1 2 3 4 5 6
101
5
The Law of The Big ThreeThe Law of The Big Three
Ví dụ 2:Ví dụ 2:
class Arrayclass Array
{{
private:private:
intint m_size;m_size;
intint *m_data;*m_data;
public:public:
Array & Array::operator =(const Array &a)Array & Array::operator =(const Array &a)
{{
delete delete m_datam_data;;
m_sizem_size = = a.m_sizea.m_size;;
m_datam_data = new = new intint[[m_sizem_size];];
for (for (
intint
ii
= 0; = 0;
ii
< <
m_sizem_size
; ;
ii
++)++)
11Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
public:public:
Array(int size);Array(int size);
Array(const Array &a);Array(const Array &a);
~Array();~Array();
Array & operator =(const Array &a);Array & operator =(const Array &a);
};};
void main()void main()
{{
Array a1(5);Array a1(5);
Array a2(6);Array a2(6);
a2 = a1;a2 = a1;
}}
for (for (
intint
ii
= 0; = 0;
ii
< <
m_sizem_size
; ;
ii
++)++)
m_datam_data[ [ ii ] = ] = a.m_dataa.m_data[ [ ii ];];
return *this;return *this;
}}
The Law of The Big ThreeThe 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: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 hủy: thu hồi bộ nhớ.
Hàm dựng sao chép: sao chép bộ nhớ.Hàm dựng sao chép: sao chép bộ nhớ.
Toán tử gán: sao chép bộ nhớ.Toán tử gán: sao chép bộ nhớ.
class HocSinhclass HocSinh
12Phương pháp lập trình hướng đối tượng – GV. Nguyễn Minh Huy
class HocSinhclass HocSinh
{{
private:private:
charchar *m_hoTen;*m_hoTen;
public:public:
HocSinh(const HocSinh &h);HocSinh(const HocSinh &h);
~HocSinh();~HocSinh();
HocSinh & operator =(const HocSinh &h);HocSinh & operator =(const HocSinh &h);
};};
BàiBài tậptập
BàiBài tậptập 5.1:5.1:
XâyXây dựngdựng lớplớp ma ma trậntrận cócó nhữngnhững phươngphương thứcthức cầncần thiếtthiết đểđể đoạnđoạn
chươngchương trìnhtrình sausau chạychạy đúngđúng ngữngữ nghĩanghĩa
void main()void main()
{{
MaTranMaTran<<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.
MaTranMaTran
<<
intint
> m2 = m1;> m2 = m1;
// //
KhởiKhởi
tạotạo
m2 m2
từtừ
m1.m1.
MaTranMaTran
<<
intint
> m2 = m1;> m2 = m1;
// //
KhởiKhởi
tạotạo
m2 m2
từtừ
m1.m1.
MaTranMaTran<<intint> m3 = m1 + m2; // > m3 = m1 + m2; // CộngCộng ma ma trậntrận
intint max = m3.timMax();max = m3.timMax(); // // TìmTìm phầnphần tửtử lớnlớn nhấtnhất
coutcout << m3;<< m3; // // XuấtXuất phầnphần tửtử ma ma trậntrận
}}
13Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy
BàiBài tậptập
BàiBài tậptập 5.2:5.2:
XâyXây dựngdựng lớplớp con con trỏtrỏ an an toàntoàn chocho mọimọi kiểukiểu dữdữ liệuliệu::
((NhómNhóm tạotạo hủyhủy))
KhởiKhởi tạotạo mặcmặc địnhđịnh con con trỏtrỏ NULL.NULL.
KhởiKhởi tạotạo vớivới kíchkích thướcthước bộbộ nhớnhớ đượcđược cấpcấp phátphát chocho trướctrước
KhởiKhởi
tạotạo
từtừ
mộtmột
đốiđối
tượngtượng
con con
trỏtrỏ
kháckhác
KhởiKhởi
tạotạo
từtừ
mộtmột
đốiđối
tượngtượng
con con
trỏtrỏ
kháckhác
HủyHủy con con trỏtrỏ, , thuthu hồihồi bộbộ nhớnhớ
((NhómNhóm toántoán tửtử))
ToánToán tửtử sốsố họchọc: +, : +, , =., =.
ToánToán tửtử mộtmột ngôingôi: ++, : ++,
ToánToán tửtử con con trỏtrỏ: *, &, [ ].: *, &, [ ].
ToánToán tửtử épép kiểukiểu: (: (intint).).
ToánToán tửtử cấpcấp phátphát vàvà hủyhủy vùngvùng nhớnhớ: new, delete.: new, delete.
14Phương pháp lập trình hướng đối tượng - Nguyễn Minh Huy