Kĩ thuật lập trình - Chương 5: Lớp và ₫ối tượng
Bạn đang xem tài liệu "Kĩ thuật lập trình - Chương 5: Lớp và ₫ối tượng", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- ki_thuat_lap_trinh_chuong_5_lop_va_oi_tuong.pdf
Nội dung text: Kĩ thuật lập trình - Chương 5: Lớp và ₫ối tượng
- Kỹ thuật lập trình Phần III: Lập trình hướng ₫ối tượng ng 1 ươ 010101010101010110000101010101010101011000010101010101010101100001 Chương 5: LớpvàStateController010101010010101010010101010101001010101001010101010100101010100101₫ốitượng start() 101001100011001001001010100110001100100100101010011000110010010010 Ch stop() 110010110010001000001011001011001000100000101100101100100010000010 010101010101010110000101010101010101011000010101010101010101100001 010101010010101010010101010101001010101001010101010100101010100101 N Ơ 101001100011001001001010100110001100100100101010011000110010010010y = A*x + B*u; 110010110010001000001011001011001000100000101100101100100010000010x = C*x + d*u; LQGController010101010101010110000101010101010101011000010101010101010101100001 start() 010101010010101010010101010101001010101001010101010100101010100101 stop() 101001100011001001001010100110001100100100101010011000110010010010 110010110010001000001011001011001000100000101100101100100010000010 9/28/2005 2004, HOÀNG MINH S ©
- Nộidung chương 5 5.1 Khái niệm 5.2 Từ cấutrúcsang lớp 5.3 Biếnthànhviên 5.4 Hàm thành viên 5.5 Kiểmsoáttruynhập N Ơ Ch2004, HOÀNG MINH S ương 5: Lớpvàđốitượng 2 © 2005 - HMS ©
- 5.1 Khái niệm Đối tượng là gì? Thực thể phần mềm Mô hình/₫ại diện của một ₫ốitượng vật lý: — Tank, Heater, Furnace — Motor, Pump, Valve — Sensor, Thermometer, Flowmeter — Control Loop, Control System Hoặc một ₫ốitượng logic ("conceptual object): — Trend, Report, Button, Window N — Matrix, Vector, Polynomial Ơ Ch2004, HOÀNG MINH S ương 5: Lớpvàđốitượng 3 © 2005 - HMS ©
- Một ₫ối tượng có Hành vi  Các thuộc tính (attributes) sủa, cắn, chạy chạy khi gặp nguy hiểm  Trạng thái (state) •Dữ liệu Trạng thái • Quan hệ tư thế  Hành vi (behavior) sức khỏe • Các phép toán Thuộc tính • Đặc tính phản ứng Căn cước màu lông: vàng Tên: Rex N  Căn cước (identity) giống: Berge Ơ  Ngữ nghĩa/trách nhiệm ID: 007 (semantic/responsibilities) Ngữ nghĩa Chó giữ nhà Ch2004, HOÀNG MINH S ương 5: Lớpvàđốitượng 4 © 2005 - HMS ©
- Lớplàgì? Mộtlớplàthựcthicủacác₫ốitượng có chung —Ngữ nghĩa —Thuộctính —Quanhệ —Hànhvi Lớp= Đóng gói [Cấutrúcdữ liệu + hàm thao tác] —Lớp các vector, lớp các ma trận(dữ liệuphầntử + các phép truy nhậpvàphéptoáncơ bản) —Lớp các hình chữ nhật(cácdữ liệutọa ₫ộ + phép vẽ, xóa, ) —Lớp các mô hình hàm truyền(cáchệ số₫athứctử/mẫu, các phép toán xác ₫ịnh tính ổn ₫ịnh, xác ₫ịnh các ₫iểmcực, ) N Các dữ liệucủamộtlớp=> biến thành viên Ơ Các hàm củamộtlớp => hàm thành viên Các biếncủamộtlớp=> một ₫ốitượng, mộtthể nghiệm Ch2004, HOÀNG MINH S ương 5: Lớpvàđốitượng 5 © 2005 - HMS ©
- Lập trình hướng ₫ối tượng (object-oriented programming, OOP) Trừu tượng hóa (abstraction): giúp ₫ơn giản hóa vấn ₫ề, dễ sử dụng lại Đóng gói dữ liệu/che dấu thông tin (data encapsulation/ information hiding): nâng cao giá trị sử dụng lại và ₫ộ tin cậy của phần mềm Dẫn xuất/thừa kế (subtyping/inheritance): giúp dễ sử dụng lại mã phần mềm và thiết kế Đa hình/₫a xạ (polymorphism): giúp phản ánh trung thực thế giới thực và nâng cao tính linh hoạt của phần mềm N Ơ Phương pháp luậnhướng ₫ốitượng cho phép tư duy ở mức trừutượng cao nhưng gầnvớithế giớithực! Ch2004, HOÀNG MINH S ương 5: Lớpvàđốitượng 6 © 2005 - HMS ©
- 5.2 Từ cấutrúcsang lớp struct Time { void addSec(Time& t, int s) { int hour; // gio t.sec += s; int min; // phut if (t.sec > 59) { int sec; // giay addMin(t, t.sec/60); }; t.sec %= 60; void addHour(Time& t, int h) { } t.hour += h; else if (t.sec 59) { } t.hour += t.min/60; } t.min %= 60; void main() { N } Time t = {1, 0, 0}; Ơ else if (t.min < 0) { addMin(t,60); t.hour += (t.min/60 - 1); addMin(t,-5); t.min = (t.min % 60) + 60; addSec(t,25); } } } Ch2004, HOÀNG MINH S ương 5: Lớpvàđốitượng 7 © 2005 - HMS ©
- Mộtsố vấn ₫ề củacấutrúc Truy nhậpdữ liệutrựctiếp, không có kiểmsoátcóthể dẫn ₫ến không an toàn Time t1 = {1, 61, -3}; // ??! Time t2; // Uncertain values int h = t2.hour; // ??! int m = 50; t2.min = m + 15; // ??! Không phân biệtgiữa“chi tiết bên trong” và “giao diệnbên ngoài”, mộtthay₫ổinhỏởchi tiếtbêntrongcũng bắtngườisử dụng phảithay₫ổimãsử dụng theo! Ví dụ: cấutrúcTime ₫ượcsửalạitênbiếnthànhviên: struct Time { N Ơ int h, m, s; }; Đoạnmãcũ sẽ không biên dịch ₫ược: Time t; t.hour = 5; Ch2004, HOÀNG MINH S ương 5: Lớpvàđốitượng 8 © 2005 - HMS ©
- Đóng gói hay "lớphóa" class Time { int hour; // gio int min; // phut Biến thành viên int sec; // giay (member variable) public: Time() {hour=min=sec=0;} Hàm tạo (constructor) void setTime(int h, int m, int s) { hour = h; min = sec = 0; addSec(s); addMin(m); } Hàm thành viên N int getHour() { return hour; } Ơ (member functions) int getMin() { return min; } int getSec() { return sec; } void addHour(int h) { hour += h; } Ch2004, HOÀNG MINH S ương 5: Lớpvàđốitượng 9 © 2005 - HMS ©
- void addMin(int m) { void main() min += m; if (min > 59) { { hour += min/60; Time t; min %= 60; t.addHour(1); } else if (min 59) { t.setTime(1, 65, -3); addMin(sec/60); int h = t.getHour(); sec %= 60; } int m = t.getMin(); N else if (sec < 0) { Ơ int s = t.getSec(); addMin(sec/60 - 1); sec = (sec % 60) + 60; } } } }; Ch2004, HOÀNG MINH S ương 5: Lớpvàđốitượng 10 © 2005 - HMS ©
- 5.3 Biếnthànhviên Khai báo biếnthànhviêncủamộtlớptương tự như cấutrúc class Time { int hour, min, sec; }; Mặc ₫ịnh, các biến thành viên củamộtlớp không truy nhập ₫ượctừ bên ngoài (biếnriêng), ₫ương nhiên cũng không khởi tạo ₫ượctheocáchcổ₫iển: Time t = {1, 0, 0}; // error! t.hour = 2; // error! Có thể làm cho mộtbiếnthànhviêntruynhập ₫ượctừ bên N Ơ ngoài (biếncôngcộng), tuy nhiên ít khi có lý do cầnlàmnhư thế: class Point { public: int x,y; }; Ch2004, HOÀNG MINH S ương 5: Lớpvàđốitượng 11 © 2005 - HMS ©
- Kiểmsoátviệctruynhập các biếnriêngthôngqua cáchàm thành viên Cách duy nhất ₫ể khởitạogiátrị cho các biếnthànhviênlàsử dụng hàm tạo: class Time { public: Time() {hour=min=sec=0;} }; Time t; // t.hour = t.min = t.sec = 0; Mộtsố biến thành viên có vai trò lưutrữ trạng thái bên trong của ₫ốitượng, không nên cho truy nhậptừ bên ngoài (ngay cả gián tiếpqua cáchàm) N class PID { Ơ double Kp, Ti, Td; // controller parameters double I; // internal state }; Ch2004, HOÀNG MINH S ương 5: Lớpvàđốitượng 12 © 2005 - HMS ©
- 5.4 Hàm thành viên Định nghĩacấutrúc& hàm Định nghĩalớp struct Time { class Time { int hour, min, sec int hour,min,sec; }; public: void addHour(Time& t, int h) { void addHour(int h) { t.hour += h; hour += h; } } }; Gọihàmvớibiếncấutrúc Gọihàmthànhviêncủa ĐT Time t; Time t; N Ơ addHour(t,5); t.addHour(5); Ở₫ây có sự khác nhau về cách viết, nhưng chưacósự khác nhau cơ bản Ch2004, HOÀNG MINH S ương 5: Lớpvàđốitượng 13 © 2005 - HMS ©
- Khai báo và ₫ịnh nghĩa hàm thành viên Thông thường, lớp cùng các hàm thành viên ₫ược khai báo trong tệptin ₫ầu(*.h). Vídụ trong tệp có tên “mytime.h”: class Time { int hour,min,sec; public: void addHour(int h); void addMin(int m); void addSec(int s); }; Các hàm thường ₫ược ₫ịnh nghĩa trong tệptin nguồn(*.cpp): N Ơ #include “mytime.h” void Time::addHour(int h) { hour += h; } Ch2004, HOÀNG MINH S ương 5: Lớpvàđốitượng 14 © 2005 - HMS ©
- Có thể₫ịnh nghĩamộthàmthànhviêntrongtệptin ₫ầudướidạng mộthàminline (chỉ nên áp dụng vớihàm₫ơngiản), ví dụ: inline void Time::addHour(int h) { hour += h;} Mộthàmthànhviêncũng có thể₫ược ₫ịnh nghĩatrongphần khai báo lớp=> mặc ₫ịnh trở thành hàm inline, ví dụ class Time { int hour,min,sec; public: void addHour(int h) { hour += h; } }; Khi ₫ịnh nghĩa hàm thành viên, có thể sử dụng các biếnthành viên và gọihàmthànhviênkhácmàkhông cần (thậm chí không thể₫ược) ₫ưatênbiến ₫ốitượng, ví dụ: N Ơ void Time::addSec(int s) { addMin(sec/60); } Ch2004, HOÀNG MINH S ương 5: Lớpvàđốitượng 15 © 2005 - HMS ©
- Bảnchấtcủa hàm thành viên? class Time { int hour,min,sec; public: Time() { hour=min=sec=0; } void addHour(int h) { this->hour += h; // con trỏ this chính là ₫ịachỉ của } // ₫ốitượng gọi hàm thành viên }; void main() { Time t1,t2; // Tự₫ộng gọihàmtạo Time() cho t1 và t2 t1.addHour(5); // Có thể hiểunhư là addHour(&t1,5); N Ơ t2 = t1; // OK t2.addHour(5); // Có thể hiểunhư là addHour(&t2,5); } Ch2004, HOÀNG MINH S ương 5: Lớpvàđốitượng 16 © 2005 - HMS ©
- 5.5 Kiểm soát truy nhập public: Các thành viên công cộng, có thể sử dụng ₫ượctừ bên ngoài private: Các thành viên riêng, không thể truy nhập ₫ượctừ bên ngoài, ngay cả trong lớpdẫnxuất(sẽ₫ềcậpsau) class Time { private: int hour,min,sec; }; Mặc ₫ịnh, khi ₫ã khai báo class thì các thành viên là private. N Ơ protected: Các thành viên ₫ượcbảovệ, không thể truy nhập ₫ượctừ bên ngoài, nhưng truy nhập ₫ượccáclớpdẫnxuất(sẽ₫ề cậpsau) Ch2004, HOÀNG MINH S ương 5: Lớpvàđốitượng 17 © 2005 - HMS ©
- 5.6 Con trỏ₫ốitượng #include "mytime.h" void main() { Time t; // call constructor Time() t.addHour(5); Time *pt = &t; // pt is identical to this pointer pt->addSec(70); pt = new Time; // call constructor Time() pt->addMin(25); delete pt; pt = new Time[5]; // call constructor 5 times for (int i=0; i < 5; ++ i) N Ơ pt[i].addSec(10); delete [] pt; } Ch2004, HOÀNG MINH S ương 5: Lớpvàđốitượng 18 © 2005 - HMS ©
- Bài tậpvề nhà Dựatrêncấu trúc Vector và các hàm liên quan ₫ãthựchiện trong chương 4, hãy xây dựng lớp ₫ốitượng Vector vớicáchàm thành viên cầnthiết. N Ơ Ch2004, HOÀNG MINH S ương 5: Lớpvàđốitượng 19 © 2005 - HMS ©