1. Trang chủ
  2. » Công Nghệ Thông Tin

OOP 05 the law of the big three -

14 327 2

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề The law of the big three
Tác giả Nguyễn Minh Huy
Trường học Trường Đại Học
Chuyên ngành Lập trình hướng đối tượng
Thể loại Bài giảng
Định dạng
Số trang 14
Dung lượng 444,73 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Lập trình hướng đối tượng C/C++ -OOP 05 the law of the big three

Trang 1

GV

GV Nguyễn Nguyễn Minh Minh Huy Huy

Ba

Trang 2

 Ba Ba vấn vấn đề đề con con trỏ trỏ

Trang 3

The 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 4

The 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 5

The 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 6

The 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 7

The 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 8

The 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 9

The 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 10

The 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 11

The 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 12

The 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 13

 Bà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 14

 Bà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.

Ngày đăng: 12/01/2014, 16:57