KỸ THUẬT LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG - Chương 4
lượt xem 25
download
Tài liệu tham khảo dành cho giáo viên, sinh viên chuyên ngành công nghệ thông tin - Giáo trình lập trình hướng đối tượng.
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: KỸ THUẬT LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG - Chương 4
- MỤC TIÊU LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG • Hiểu rõ phương thức thiết lập, huỷ bỏ và thiết lập sao chép. Chương 4: • Xây dựng lớp có các phương thức tự động thực hiện. • Sử dụng được các lớp theo nghĩa hướng về với đối tượng PHƯƠNG THỨC (tạo đối tượng, thì đối tượng tự giải quyết vấn đề nào đó) TỰ THỰC HIỆN Giáo viên: Võ Hồng Bảo Châu Khoa CNTT trường ĐH Lạc Hồng OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC 2 HIỆN NỘI DUNG CHI TIẾT Phương thức tự động thực hiện 4 • KHÁI NiỆM • Trong C++ có 2 phương thức thuộc loại này: – Phương thức thiết lập (constructor) • PHƯƠNG THỨC THIẾT LẬP – Phương thức hủy bỏ (destructor) • PHƯƠNG THỨC HỦY BỎ • Chương trình mang đúng nghĩa hướng về với đối tượng: • PHƯƠNG THỨC THIẾT LẬP TẠO BẢN SAO – Khi tạo ra đối tượng, một số hành vi sẽ thực thi vào thời điểm đó. OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC 3 4 HIỆN HIỆN 1
- Khi đó, Phương thức thiết lập 5 6 Được thực hiện một cách tự động ngay sau khi đối tượng • Đối tượng không chỉ đơn thuần là dữ liệu có cấu trúc đã được tạo ra. được tạo ra. Nhằm thực hiện một số công việc ban đầu như: • Mà còn, Tạo ra vùng bộ nhớ – Mang tính hành động: một hoặc một số hành vi nào đó của nó Sao chép, khởi tạo giá trị ban đầu cho dữ liệu được thi hành. v.v... • Và ngược lại, Lớp trong C++ có thể có hoặc không có phương thức thiết lập – Khi đối tượng mất đi, sẽ có một số hành động được thực thi. Khi không có, một số hành động sau được thực hiện: Dành bộ nhớ cho các dữ liệu Khởi tạo giá trị không cho tất cả các byte của dữ liệu OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC 5 6 HIỆN HIỆN 7 8 • Trong C++, phương thức thiết lập có tên trùng với tên của • Khi tạo đối tượng, nếu không chỉ định thêm bất kỳ điều gì. lớp, không có kiểu trả về. Chẳng hạn, Chẳng hạn, STACK S; • Thì phương thức thiết lập chuẩn được gọi thực hiện một phương thức thiết lập, cách tự động. tên giống tên lớp Không có phương thức thiết lập Tạo ra đối tượng p Không báo lỗi vì có pthức thiết lập chuẩn Tự động gọi phương được gọi tự động thức thiết lập OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC 7 8 HIỆN HIỆN 2
- Vậy, thế nào là constructor chuẩn 9 10 • Phương thức thiết lập chuẩn là phương thức thiết lập class Point { Một lớp có thể có nhiều không có tham số. int xVal, yVal; phương thức thiết lập. public: Point () // Hàm thiết lập chuẩn • Hoặc phương thức thiết lập với tất cả các tham số được Chúng khác nhau qua { xVal = 0; yVal = 0; } gán giá trị đầu. Chẳng hạn, Point (int x, int y) { danh sách tham số. xVal = x; yVal = y; STACK( unsigned int = 1237 ); } Đây chính là khả năng định void OffsetPt (int , int ); … VECTOR( int = 2;double = 3.5 ); nghĩa chồng lên nhau }; void main() { (overloading) của các hành Point p1; Point p2(10,20); vi trong lớp. } Phương thức thiết lập có thuộc tính truy cập là public. OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC 9 10 HIỆN HIỆN Gợi ý khi xây dựng constructor • Việc thường làm là gán trị cho các thành phần dữ liệu của đối tượng. • Số constructor có trong một lớp thường là những dạng dữ liệu của đối tượng mà ta muốn có ngay lúc ban đầu. OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC 11 12 HIỆN HIỆN 3
- Phương thức hủy bỏ 13 Phương thức hủy bỏ (destructor) được thực hiện trước khi đối tượng bị mất đi (trước khi vùng bộ nhớ dành cho đối tượng bị thu hồi). Sử dụng mang tính dọn dẹp, hoặc thông báo về sự kết thúc hoạt Tổng cộng động. có bao nhiêu Trong C++, phương thức hủy bỏ được viết như sau: lần lần hàm hủy được gọi ? ~ClassName() Một lớp chỉ có 1 phương thức hủy bỏ Trong các thành phần của lớp, thành phần nào được khai báo trước, phương thức thiết lập sẽ thực hiện trước. Trong các thành phần của lớp, thành phần nào được khai báo trước, phương thức hủy bỏ sẽ thực hiện sau. OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC 13 14 HIỆN HIỆN BÀI TẬP LÀM TẠI LỚP Xây dựng lớp PhanSo gồm 2 thành phần tử số và mẫu số. Viết Xây dựng lớp NhietDo gồm 2 thành phần giá trị (số thực) và hàm thiết lập (có và không có tham số) và hàm hủy bỏ đáp ứng loại (ký tự, C hoặc F). Viết các hàm cần thiết để hàm main yêu cầu của hàm main sau: sau đây chạy đúng void main() void main() { { PhanSo a; NhietDo a(20,’C’),b(135,’F’); PhanSo b(1,2),c(3,4); getch(); NhietDo c,d; } } Cho biết hàm thiết lập, hủy bỏ được gọi bao nhiêu lần và thứ tự Cho biết thứ tự thực hiện của hàm thiết lập và hủy bỏ thiết lập, hủy bỏ các đối tượng. Thời gian làm bài: 5 phút. Thời gian làm bài: 5 phút. OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC 15 16 HIỆN HIỆN 4
- Phương thức thiết lập tạo bản sao Trường hợp tạo bản sao 17 18 • Còn gọi là Copy Constructor. • Khi cần tạo bản sao, có thể viết như sau: • Mục tiêu EXAMPLE A; – Nhằm để tạo ra bản sao của đối tượng, trong đó quản lý chặt chẽ EXAMPLE B = A; những gì được làm, được sao chép • Khi đó B là bản sao của đối tượng A, những gì được làm – Quản lý bản sao của đối tượng được tạo ra khi sao chép sẽ được quy định trong phương thức thiết lập tạo bản sao của lớp EXAMPLE. Đây là phương thức có trong C++ OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC 17 18 HIỆN HIỆN Cách thức viết copy constructor 19 20 • Với cách viết EXAMPLE B = A, chẳng qua để dễ sử dụng – • Phương thức thiết lập tạo bản sao là một phương thức như đồng nhất việc gán với việc sao chép. Thực chất, câu lệnh m ọi phương thức khác, nên chứa các câu lệnh cần thực này là: hiện. • Tuy nhiên, do đặc thù là được điều khiển một cách tự EXAMPLE B(A) động, nên tên gọi và tham số được quy ước: • Cũng cần lưu ý thêm, câu lệnh gán chỉ gán giá trị ClassName( ClassName& ) B = A; • Hoàn toàn khác câu lệnh – tạo đối tượng EXAMPLE B = A; OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC 19 20 HIỆN HIỆN 5
- Ví dụ 21 22 • Trong lớp này, khi một bảo sao của đối tượng (được truyền qua tham số) được tạo ra, chỉ thành phần dữ liệu n của lớp m ới có giá trị giống giá trị n của bản gốc • Nói cách khác, nó chỉ "bắt chước" thành phần dữ liệu n. OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC 21 22 HIỆN HIỆN 23 • Một lớp luôn luôn có 1 phương thức thiết lập tạo bản sao. • Phương thức đó có thể hiện thực hay không hiện thực. • Khi không hiện thực, một phương thức tạo bản sao chuẩn sẽ âm thầm tồn tại. Nguy hiểm trong lập trình là khi mọi thứ diễn Không có hàm thiết lập sao chép, hàm thiết lập ra một cách âm thầm, người lập trình không sao chép chuẩn sẽ được gọi hay biết OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC 23 24 HIỆN HIỆN 6
- 25 • Phương thức thiết lập tạo bản sao được thi hành khi: – Khởi tạo đối tượng bởi đối tượng đã có – Tham số thực được truyền cho tham số giá trị của một phương thức nào đó. – Phương thức trả đối tượng của lớp trở về thông qua tên gọi (return Obj) Hàm thiết lập sao chép được gọi khi tham số thực được truyền cho tham số giá trị của một phương thức nào đó. OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC 25 26 HIỆN HIỆN • VẬY NẾU KHÔNG VIẾT COPY CONSTRUCTOR THÌ COPY CONSTRUCTOR CHUẨN SẼ ĐƯỢC GỌI • => COPY CONSTRUCTOR CÓ CŨNG ĐƯỢC, KHÔNG CÓ CŨNG ĐƯỢC • =>COPY CONSTRUCTOR KHÔNG CẦN THIẾT? ? Hàm thiết lập tạo bản sao được gọi khi phương thức trả đối tượng của lớp trở về thông qua tên gọi (return Obj) OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC 27 28 HIỆN HIỆN 7
- Xét lớp VECTOR như sau Lưu ý 29 30 class VECTOR{ • Vấn đề chỉ nảy sinh phức tạp khi việc cấp phát và thu hồi bộ nhớ được thực thi. int size; • Bởi khi đó, có thể vô tình thu hồi vùng bộ nhớ đang được double *data; sử dụng bởi một bản sao nào đó. public: VECTOR( int = 2 ); VECTOR( VECTOR& );//copy constructor ~VECTOR(); void setData( double = 0.0 ); void outData(); } OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC 29 30 HIỆN HIỆN Chúng ta xem xét cụ thể hơn 31 32 VECTOR::VECTOR( int n ){ • Nếu không có phương thức thiết lập tạo bản sao, hoặc viết không đúng yêu cầu. Một vùng bộ nhớ bị thu hồi hai lần size = n; • Bởi thực chất có 2 đối tượng, nhưng trong trường hợp này data = new double[size]; cả hai đối tượng này có chung một vùng bộ nhớ. setData(); cout
- Có phương thức Khởi tạo đối tượng copy constructor Hai đối tượng có 2 vùng nhớ 33 34 VECTOR::VECTOR( VECTOR& V ){ void main(){ Object at 0x8f7d128e size = V.size; 0, 0, VECTOR u; copy constructor data = new double[size]; Object at 0x8f7d12a2 u.outData(); cout
- 37 38 double VECTOR::scalar(VECTOR v){ • Chương trình gọi có thể viết double t = 0.0; for(int i = 0; i
- Hàm trả về đối tượng 41 42 • Phương thức thiết lập tạo bản sao sẽ được gọi để tạo ra • Chẳng hạn, tổng của 2 vector: bản sao khi hàm trả về một đối tượng của lớp. VECTOR VECTOR::add(VECTOR v){ VECTOR t(size); for(int i=0; i
- Phép toán gán Lý do 45 46 • Nhưng khi dùng phép toán gán • Phép toán gán chuẩn sẽ gán từng byte của đối tượng này cho đối tượng kia, khi đó các biến liên quan đến địa chỉ VECTOR t(3); cũng hoàn toàn giống nhau. t = u.add(v); t.outData(); Phương thức thiết lập tạo bản sao sẽ tạo ra • Kết quả không như mong đợi một đối tượng mới; còn phép toán gán chỉ làm thay đổi giá trị của đối tượng OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC 45 46 HIỆN HIỆN TỰ KẾT LUẬN 47 • KHI NÀO BẮT BUỘC PHẢI CÓ PHƯƠNG THỨC COPY • Có thể bổ sung thêm hàm assign() để gán giá trị: CONSTRUCTOR TƯỜNG MINH? VECTOR VECTOR::assign(VECTOR v){ size = v.size(); for(int i = 0; i < size; i++ ) data[i] = v.data[i]; return *this; } OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC 47 48 HIỆN HIỆN 12
- TÓM TẮT • CÓ 3 LOẠI PHƯƠNG THỨC TỰ THỰC HIỆN: THIẾT LẬP, HỦY BỎ, SAO CHÉP • CÁCH KHAI BÁO TỪNG LOẠI? • PHƯƠNG THỨC CHUẨN? THANK YOU • KHI NÀO CẦN PHƯƠNG THỨC COPY CONSTRUCTOR? OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC OOP-CHƯƠNG 4-PHƯƠNG THỨC TỰ THỰC 49 50 HIỆN HIỆN 13
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Lập trình hướng đối tượng_ Chapter 5
9 p | 246 | 121
-
Lập trình hướng đối tượng_ Chapter 2
19 p | 214 | 107
-
Lập trình hướng đối tượng_ Chapter 6
13 p | 239 | 99
-
Chương 1: Giới thiệu về lập trình hướng đối tượng
3 p | 225 | 78
-
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG - Chương 0
2 p | 120 | 39
-
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG - Chương 7
8 p | 111 | 34
-
KỸ THUẬT LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG - Chương 5
10 p | 131 | 27
-
Lập trình hướng đối tượng-Khuôn hình
13 p | 115 | 15
-
Bài giảng môn Lập trình hướng đối tượng - Chương 1: Tổng quan về cách tiếp cận hướng đối tượng
20 p | 147 | 9
-
Bài giảng Lập trình hướng đối tượng trong C++ - Phạm Thị Quỳnh
12 p | 81 | 6
-
Bài giảng Kỹ thuật lập trình: Chương 0 - Trường Đại học Ngoại ngữ - Tin học TP.HCM
7 p | 15 | 6
-
Bài giảng Lập trình hướng đối tượng: Chương 6 - Hà Văn Sang
13 p | 60 | 5
-
Bài giảng Lập trình hướng đối tượng: Chương 5 - Hà Văn Sang
9 p | 57 | 5
-
Bài giảng Kỹ thuật lập trình cơ bản (C++): Chương 0 - ThS. Trần Nguyễn Anh Chi
4 p | 65 | 4
-
Bài giảng Lập trình hướng đối tượng - Chương 1: Lập trình hướng đối tượng
15 p | 93 | 3
-
Bài giảng Kỹ thuật lập trình: Chương 1 - Trần Quang Hải Bằng
15 p | 63 | 3
-
Bài giảng Kỹ thuật lập trình: Chương 0 - ThS Trần Duy Thanh
11 p | 34 | 3
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn