Bài giảng Phương pháp lập trình hướng đối tượng: Lớp đối tượng cung cấp cho người học các đặc trưng của việc đóng gói, học các hàm xử lý chuỗi, lớp dữ liệu, hoạt cảnh sử dụng đối tượng, thực thể hóa,... Mời các bạn cùng tham khảo nội dung chi tiết.
GV: Lê Xuân Định L.X.Định CuuDuongThanCong.com https://fb.com/tailieudientucntt Nhắc lại chuyện xưa – Struct Bạn gặp struct nào? Nếu khơng dùng struct có khơng? Về lý thuyết, tốn giải khơng cần struct! Tại phải đóng gói thành struct? Rõ ràng: Làm chương trình ngắn gọn, dễ đọc, gần với thực tế; Tiện dụng: Những liệu chung quản lý chung; Tăng tính module: Dễ tái sử dụng struct hàm xử lý struct cho toán quản lý khác; Dễ thay đổi trường liệu mà không làm ảnh hưởng đến hàm quản lý chung L.X.Định CuuDuongThanCong.com https://fb.com/tailieudientucntt “Điểm tổng kết SV” Tính module Struct Hãy viết chương trình cho phép nhập điểm (lý thuyết, thực hành) ba SV từ bàn phím, xuất hình điểm tổng kết struct SinhVien{ float dLT; Do hàm main() sử dụng float dTH; struct SinhVien }; đơn vị (không typedef struct SinhVien SINHVIEN; void Nhap(SINHVIEN & sv); void XuatDTK(SINHVIEN sv); đụng vào thành phần struct) nên void main(){ SINHVIEN An, Binh, Chi; Nhap(An); Nhap(Binh); Nhap(Chi); XuatDTK(An); XuatDTK(Binh); XuatDTK(Chi); } L.X.Định CuuDuongThanCong.com https://fb.com/tailieudientucntt “Điểm tổng kết SV” Tính module Struct Hãy viết chương trình cho phép nhập điểm (lý thuyết, thực hành, điểm cộng) ba SV từ bàn phím, xuất hình điểm tổng kết struct SinhVien{ float dLT, dTH; DoHàm hàmmain() main()hoàn sử dụng float dCong; toàn structkhông SinhVien bị ảnh }; hưởng đơnbởi vị (không việc typedef struct SinhVien SINHVIEN; void Nhap(SINHVIEN & sv); void XuatDTK(SINHVIEN sv); đụng struct vào SinhVien thành phần thêmcủa “điểm struct) cộng”! nên void main(){ SINHVIEN An, Binh, Chi; Nhap(An); Nhap(Binh); Nhap(Chi); XuatDTK(An); XuatDTK(Binh); XuatDTK(Chi); } L.X.Định CuuDuongThanCong.com https://fb.com/tailieudientucntt “Đóng gói Mảng” Tính tiện dụng Struct Đặt vấn đề: Kiểu “mảng” C/Pascal kiểu liệu hồn chỉnh hay khơng? Các thao tác mảng cần mảng? Muốn chép mảng, phải chép phần tử Giải quyết: Đóng gói mảng a[] số phần tử n thành struct struct ArrayT{ T a[…]; int n; }; Lợi ích: Đối xử với tồn mảng đơn vị liệu (1 biến) Truyền tham số: Chỉ cần tham số Tránh trường hợp quên truyền số phần tử (n) Sao chép mảng: Chỉ phép gán (Không cần for()) L.X.Định CuuDuongThanCong.com https://fb.com/tailieudientucntt Đặc trưng việc Đóng gói “Những thứ thường/ln chung với gom lại thành gói.” Tiện dụng: Đối xử với chúng đơn vị “Người sử dụng gói khơng cần quan tâm đến cấu trúc bên gói.” Tính module: Quản lý gói độc lập với xử lý liệu gói L.X.Định CuuDuongThanCong.com https://fb.com/tailieudientucntt Đóng gói Hướng đối tượng “Những thứ thường/ln chung với gom lại thành gói.” Tiện dụng: Đối xử với chúng đơn vị “Người sử dụng gói khơng quan tâm đến cấu trúc & xử lý bên gói.” Tính module: Bên sử dụng gói độc lập với bên xử lý liệu gói Áp dụng nguyên tắc cho hàm (chứ không cho liệu struct), ta có “Phương pháp Lập trình Hướng đối tượng”! L.X.Định CuuDuongThanCong.com https://fb.com/tailieudientucntt Thảo luận “Đóng gói” “Những thứ thường/ln chung với gom lại thành gói.” Tiện dụng: Đối xử với chúng đơn vị “Người sử dụng gói khơng quan tâm đến cấu trúc & xử lý bên gói.” Tính module: Bên sử dụng gói độc lập với bên xử lý liệu gói L.X.Định Trong (biến, thư viện, câu lệnh, mảng, struct, hàm), “gói” nào? Các “gói” tiện dụng sao? Những “gói” có tính module? CuuDuongThanCong.com https://fb.com/tailieudientucntt Họ Hàm Xử lý Chuỗi char s[256]; int void int char* strlen( strcat( strcmp( strstr( char char char char s[] ); s[], char str[] ); s[], char str[] ); s[], char str[] ); Các hàm xử lý chuỗi thư viện “string.h” Đều gắn liền với tham số chuỗi (chuỗi bị xử lý) L.X.Định CuuDuongThanCong.com https://fb.com/tailieudientucntt Họ Hàm Xử lý Chuỗi string char s[256]; int void int char* strlen( strcat( strcmp( strstr( char char char char s[] ); s[], char str[] ); s[], char str[] ); s[], char str[] ); Các hàm xử lý chuỗi thư viện “string.h” Đều gắn liền với tham số chuỗi (chuỗi bị xử lý) Ta gom hàm chuỗi bị xử lý lại thành gói L.X.Định Tạo thành kiểu (gọi lớp): string CuuDuongThanCong.com https://fb.com/tailieudientucntt 10 loại hàm Tạo (Constructor) Hàm tạo mặc định: Khơng có tham số VD sử dụng: string s, as[10]; //gọi 11 lần hàm string() Khởi tạo giá trị mặc định cho tất thuộc tính chưa có giá trị mặc định Lưu ý: Nếu không định nghĩa hàm tạo hết C++ tự định nghĩa hàm tạo mặc định khơng làm hết! Nguy hiểm!!! Vì thuộc tính chưa có giá trị mặc định có giá trị khơng xác định! Hàm tạo có tham số: Khởi tạo cho tất thuộc tính VD sử dụng: string s(“init value"); Hàm tạo chép: Chép từ đtượng khác lớp VD sử dụng: string s(“init value"), t(s), u = s; f(s); Đặc biệt sử dụng truyền tham trị & trả giá trị hàm C++ tự định nghĩa hàm tạo chép L.X.Định https://fb.com/tailieudientucntt CuuDuongThanCong.com Nếu khơng cấp phát động khơng cần định nghĩa lại 42 Tái sử dụng hàm Tạo Mỗi hàm tạo phải khởi tạo giá trị cho tất thuộc tính khơng có giá trị mặc định! Nếu có nhiều hàm tạo với số lượng tham số khác dễ bị lặp code! Giải pháp: Hàm tạo tham số tái sử dụng hàm tạo nhiều tham số hơn, cách đưa vào danh sách khởi tạo VD lớp Hình Chữ Nhật: class Rectangle { float width, height; bool square = false; public: Rectangle(float w, float h); Rectangle(float w); }; L.X.Định CuuDuongThanCong.com Rectangle::Rectangle (float w, float h) : width(w), height(h) {} Rectangle::Rectangle(float w) : Rectangle(w, w) { this->square = true; } https://fb.com/tailieudientucntt 43 Thành phần Tĩnh (static) Các thành phần tĩnh đối tượng Được định qua từ khoá static Còn gọi “thành phần mức lớp”, tức chung lớp không riêng đối tượng cụ thể (Đối lập với “thành phần mức thực thể”.) Thuộc tính tĩnh: Dữ liệu chia sẻ chung cho lớp Các dùng chung cho lớp; Các tham số cấu hình lớp, biến đếm, v.v Phương thức tĩnh: Hàm gọi trực tiếp từ tên lớp “C::f(3)” không cần đến đtượng cụ thể Các thao tác xử lý chung lớp L.X.Định CuuDuongThanCong.com https://fb.com/tailieudientucntt 44 Thuộc tính Tĩnh Thuộc tính tĩnh: Dữ liệu chia sẻ chung cho lớp Các dùng chung cho lớp: Các nguyên khởi tạo khai báo lớp; Các khơng ngun phải khởi tạo ngồi khai báo lớp class C { const static int MAX = 9999; const static float PI; }; const float C::PI = 3.1415; Các tham số cấu hình lớp, biến đếm, v.v class D { constexpr static bool debug = true; constexpr static int count = 0; constexpr static float epsilon = 0.0001; }; L.X.Định CuuDuongThanCong.com https://fb.com/tailieudientucntt 45 Thuộc tính Tĩnh Thuộc tính tĩnh: Dữ liệu chia sẻ chung cho lớp Các dùng chung cho lớp: Các tham số cấu hình lớp, biến đếm, v.v Với C++ trước C++11 (tương ứng VStudio trước VS2015) phải khởi tạo biến tĩnh phần cài đặt lớp khối định nghĩa lớp (trong file cpp) class D { static bool debug; static int count; static float epsilon; }; bool D::debug = true; int D::count = 0; float D::epsilon = 0.0001; L.X.Định CuuDuongThanCong.com https://fb.com/tailieudientucntt 46 Phương thức Tĩnh Phương thức tĩnh: Hàm gọi trực tiếp từ tên lớp “C::f(3)” không cần đến đtượng cụ thể Khơng có khái niệm this pthức tĩnh! Chỉ truy cập đến thuộc tính tĩnh lớp Có thể truy cập đến thành phần private đối tượng lớp (nhận qua tham số) L.X.Định class C { private: constexpr static bool debug = true; int i = 100; //non-static public: static void testStatic(C &obj) { if (debug) { //static attribute, OK! //cout nhapDiem(“diem Ly thuyet”); } void SinhVien::thiTH() { this->dThucHanh = this->nhapDiem(“diem Thuc hanh”); } float SinhVien::tinhDTK() { float dtk = (this->dLyThuyet*6 + this->dThucHanh*4)/10; return dtk; } CuuDuongThanCong.com https://fb.com/tailieudientucntt L.X.Định 57 ... module: Bên sử dụng gói độc lập với bên xử lý liệu gói Áp dụng nguyên tắc cho hàm (chứ khơng cho liệu struct), ta có Phương pháp Lập trình Hướng đối tượng ! L.X .Định CuuDuongThanCong.com https://fb.com/tailieudientucntt... Đối tượng tổng quát học tập kiến thức tiền làm việc ăn chơi Đối tượng Kỹ sư Mỗi đối tượng cấu thành từ phần: Nội dung liệu: Các thuộc tính bên trong, bao bọc Thành phần hành động: Các phương. .. action action Đối tượng tổng quát {return char buf[] !len; } int len {return buf[pos];} Đối tượng string Trên quan điểm sử dụng (nhìn từ ngồi vào): Chỉ thấy giao diện đối tượng Không