Tải bản đầy đủ (.pdf) (14 trang)

OOP 05 the law of the big three -

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (444.73 KB, 14 trang )

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

×