C++ xây dựng tính đóng bằng cách cho phép mọi thành viên của một lớp có thể được khai báo bằng các từ khoá public, private, hay protected. (xem thêm các khái niệm cơ bản trong ngôn ngữ OOP). Một thành viên private chỉ có thể được truy cập từ các phương pháp (hàm nội tại) là thành viên của chính lớp đó hay được truy cập từ các hàm và các lớp được đặc biệt cho phép sử dụng bằng cách dùng từ khóa friend. Một thành viên protected của một lớp sẽ có thể truy cập được từ các thành viên (nào đó) của các lớp có tính kế thừa của nó hay cũng có thể truy cập được từ các thành viện của chính lớp đó và của mọi thành viên friend. Nguyên lý của OOP là mọi và chỉ có các hàm là có thể truy cập được đến các giá trị nội tại của cùng lớp thì nên có tính đóng. C++ có hỗ trợ đặc tính này (qua các hàm thành viên và các hàm friend), nhưng C++ lại không là yêu cầu bắt buộc: người lập trình có thể khai báo các phần hay tất cả các giá trị nội tại là công cộng (public), và cũng cho phép làm cho toàn bộ lớp trở thành công cộng. Lí do là vì C++ hỗ trợ không chỉ lập trình hướng đối tượng mà còn hỗ trợ các mẫu hình yếu hơn như là lập trình môđun. Một thói quen tốt cần có trong thực hành là khai báo mọi dữ liệu đều là riêng tư (private), hay ít nhất ở dạng bảo tồn, và sau đó, tạo ra một giao diện nhỏ (thông qua các phương pháp) cho người dùng của lớp này dấu đi các chi tiết thiết lập bên trong.
1 Lập trình hướng đối tượng OBJECT ORIENTED PROGRAMMING (OOP) 2 Chương I 3 Giới thiệu OOP Được xem là: Cách tiếp cận mới, hiệu quả hơn Giúp tăng năng suất Dễ dàng bảo trì, sửa đổi, nâng cấp Mục đích: Giảm bớt thao tác viết lập trình Mô tả chân thực thế giới thực 4 1. Tổng quan về các kỹ thuật lập trình 1.1 Lập trình tuyến tính 1.2 Lập trình cấu trúc 1.3 Lập trình đơn thể (Module) 1.4 Lập trình hướng đối tượng LT Truyền thống 2 5 1.1 Lập trình tuyến tính Lập trình tuyến tính: • Còn gọi là lập trình phi cấu trúc • Giải quyết các bài toán tương đối nhỏ, đơn giản Đặc điểm: • Chỉ gồm một chương trình chính • Gồm một dãy tuần tự các câu lệnh • Chương trình ngắn (ít hơn 100 dòng) 6 1.1 Lập trình tuyến tính (tiếp) Nhƣợc điểm: Không sử dụng lại được các đoạn mã Không có khả năng kiểm soát phạm vi truy xuất dữ liệu Mọi dữ liệu trong chương trình là toàn cục Dữ liệu có thể bị sửa đổi ở bất cứ vị trí nào trong chương trình Không đáp ứng được việc triển khai phần mềm 7 1.2 Lập trình cấu trúc Ra đời vào những năm 70 Chương trình được chia nhỏ thành chương trình con: Thủ tục (Procedure) Hàm (Function) Các chương trình con: Độc lập với nhau và có dữ liệu riêng Trao đổi qua: tham số và biến toàn cục 8 1.2 Lập trình cấu trúc (tiếp) Xuất hiện khái niệm trừu tượng hoá Là khả năng quan sát sự vật mà: Không quan tâm tới các chi tiết không quan trọng bên trong Không quan tâm tới việc thực hiện như thế nào Trừu tượng hoá dữ liệu Trừu tượng hoá thao tác Ngôn ngữ lập trình cấu trúc: C, Pascal Foxpro … 3 9 1.3 Lập trình đơn thể (Module) Với lập trình đơn thể: Các đơn thể có chung một chức năng được nhóm lại với nhau Chương trình được chia thành nhiều phần nhỏ Các phần tương tác thông qua việc gọi đơn thể Mỗi module có dữ liệu của riêng nó 10 Nhược điểm của lập trình truyền thống Nhƣợc điểm: Chương trình khó kiểm soát Khó khăn trong việc bổ sung, nâng cấp chương trình Khi thay đổi, bổ sung dữ liệu dùng chung thì phải thay đổi gần như tất cả thủ tục/hàm liên quan Khả năng sử dụng lại các đoạn mã chưa nhiều Không mô tả đầy đủ, trung thực hệ thống trong thực tế 11 1.4 Lập trình hướng đối tượng Là phƣơng pháp lập trình: Mô tả chính xác các đối tượng trong thế giới thực Lấy đối tượng làm nền tảng xây dựng thuật toán Thiết kế xoay quanh dữ liệu của hệ thống Chương trình được chia thành các lớp đối tượng Dữ liệu được đóng gói, che dấu và bảo vệ Đối tượng làm việc với nhau qua thông báo 12 1.5 Lập trình hướng đối tượng Program 4 13 2. Một số khái niệm cơ bản 2.1 Hệ thống hướng đối tượng (OOP System) 2.2 Đối tượng (Object) 2.3 Thuộc tính & Phương thức 2.4 Lớp & Lớp con (Class) 2.5 Lớp trừu tượng (Abstract Class) 2.6 Truyền thông điệp (Message) 2.7 Sự trừu tượng hoá 2.8 Sự đóng gói (Encapsulation) 2.9 Sự thừa kế (Inheritance) 2.10 Sự đa hình (Polymophism) 14 2.1 Hệ thống hướng đối tượng Là hệ thống có đặc điểm sau: Gồm tập hợp các đối tượng Các đối tượng có thể kế thừa các đặc tính của đối tượng khác Hoạt động thông qua sự tương tác giữa các đối tượng nhờ cơ chế truyền thông điệp Thông báo Gửi & nhận thông báo 15 2.2 Đối tượng (Object) Là khái niệm trừu tượng phản ánh các thực thể trong thế giới thực Có thể là một thực thể vật lý Có thể là một khái niệm trừu tượng Được định nghĩa là sự thể hiện của một lớp Chính là các thực thể trong hệ thống hướng đối tượng Một đối tượng là sự đóng gói 2 thành phần: Dữ liệu (thuộc tính) Các phƣơng thức (hành vi) 16 2.3 Thuộc tính & phương thức Thuộc tính bao gồm: Hằng, biến. Tham số nội tại Thuộc tính được xác định kiểu, gồm: Kiểu căn bản Kiểu do người dùng định nghĩa Phương thức là: Các hàm nội tại của đối tượng Có kiểu trả về Tên gọi khác: hàm thành viên 5 17 2.4 Lớp (Class) - Lớp con (SubClass) Lớp: là tập hợp các đối tƣợng có cùng thuộc tính và hành vi Một khung mẫu (template, prototype) để tạo đối tượng gồm: Các thành phần dữ liệu Các phương thức Lớp được sử dụng như kiểu dữ liệu người dùng định nghĩa Lớp con: Là lớp thông thường Có thêm tính chất kế thừa đặc tính của lớp khác 18 2.5 Lớp trừu tượng Là lớp mà nó không thể trở thành một lớp thực tế nào Được thiết kế nhằm tạo ra lớp có đặc tính tổng quát Bản thân nó chưa có ý nghĩa nên chưa thể viết mã cho đối tượng Ví dụ: Lớp hình phẳng Lớp động vật 19 2.6 Truyền thông điệp (Message) Thông điệp: Là phương tiện để đối tượng này chuyển yêu cầu tới đối tượng khác. Một thông điệp bao gồm: Phƣơng thức của đối tượng đích (đối tượng chủ) Tên Phƣơng thức cần thực hiện Các thông tin cần thiết khác (tham số) Hệ thống yêu cầu đối tượng thực hiện phương thức như sau: Gửi thông báo và tham số cho đối tượng Kiểm tra tính hợp lệ của thông báo Gọi thực hiện hàm tương ứng phương thức 20 2.7 Sự trừu tượng hoá Khái niệm: Là khả năng bỏ qua hay không để ý tới các thành phần không quan trọng. Các loại trừu tượng hoá: Trừu tượng hoá dữ liệu: không quan tâm các chi tiết không quan trọng bên trong Trừu tượng hoá chức năng: không quan tâm làm thế nào để thực hiện công việc Tóm lại: Chỉ quan tâm tới đặc điểm quan trọng Bỏ qua các chi tiết không liên quan 6 21 2.8 Sự đóng gói (Encapsulation) Khái niệm: Là cơ chế ràng buộc dữ liệu và các thao tác trên dữ liệu thành thể thống nhất. Đóng gói gồm: Bao gói: người dùng giao tiếp với hệ thống qua giao diện Che dấu: ngăn chặn các thao tác không được phép từ bên ngoài Ƣu điểm: Quản lý sự thay đổi Bảo vệ dữ liệu 22 2.9 Sự thừa kế (Inheritance) Khái niệm: Khả năng cho phép xây dựng lớp mới được thừa hưởng các đặc tính của lớp đã có Đặc điểm: Lớp nhận được có thể bổ sung các thành phần Hoặc định nghĩa là các thuộc tính của lớp cha Các loại thừa kế: Đơn thừa kế Đa thừa kế 23 2.10 Sự đa hình (Polymorphism) Khái niệm: Khả năng đưa một phương thức có cùng tên trong các lớp con Thực hiện bởi: Định nghĩa lại Nạp chồng Cơ chế dựa trên sự kết gán: Kết gán sớm Kết gán muộn 24 3. Các bước thiết kế chương trình OOP Các bƣớc chính: Xác định các dạng đối tượng (lớp) Tìm dữ liệu dùng chung, chia sẻ Xác định lớp cơ sở dựa vào dữ liệu dùng chung Xây dựng lớp dẫn xuất từ lớp cơ sở 7 25 4. Ưu điểm của OOP Ƣu điểm chính: Loại bỏ các đoạn mã lặp lại Tạo ra các chương trình an toàn, bảo mật Dễ dàng mở rộng và nâng cấp Rút ngắn thời gian xây dựng hệ thống Tăng năng xuất và hiệu quả hơn Chương trình được thiết kế theo đúng qui trình 28 CHƢƠNG II: Lập trình hƣớng đối tƣợng OBJECT ORIENTED PROGRAMMING (OOP) 29 1. Xây dựng lớp a. Khai báo: class <tên_lớp> { [quyền truy xuất:] //khai báo các thành phần dữ liệu của lớp [quyền truy xuất:] //khai báo các thành phần hàm của lớp }; 30 a. Khai báo Trong đó: <tên_lớp>: do người dùng đặt tuân theo các qui tắc về tên Ví dụ: SV, NGUOI, Hoa_Don, ps, Ma_Tran… 8 31 a. Khai báo [quyền truy xuất:] Là khả năng truy xuất thành phần dữ liệu Mặc định là private private: trong phạm vi lớp đó public: ở mọi nơi nếu đối tượng tồn tại protected: phạm vi lớp đó và các lớp con kế thừa 32 a. Khai báo Thành phần của lớp: Có thể gồm: Dữ liệu (Thuộc tính) Phương thức (Hành vi) 33 a. Khai báo Khai báo thành phần Dữ liệu: Tương tự như khai báo biến <kiểu dữ liệu > <tên_thành_phần>; Chú ý: không được khởi tạo giá trị ban đầu 34 a. Khai báo Khai báo thành phần Hàm thành phần Cách 1: Khai báo trong lớp và định nghĩa ngoài lớp <kiểu trả về > tênlớp::<tên_hàm>([tham số]) { // <thân hàm> } Cách 2: định nghĩa ngay trong lớp 9 35 a. Khai báo Ví dụ 1: Xây dựng cấu trúc dữ liệu mô tả sinh viên: Dữ liệu: họ tên, ngày sinh, giới tính, Điểm toán, lý, hóa, tong Phương thức: nhập, tính tong, in Lớp sinh viên 36 a. Khai báo Ví dụ 2: Xây dựng cấu trúc dữ liệu mô tả các phân số: Dữ liệu: tử số, mẫu số Phương thức: nhập, tối giản, in Lớp các phân số 37 a. Khai báo Ví dụ 3: Xây dựng cấu trúc dữ liệu mô tả các hóa đơn: Dữ liệu: mã vật tư, tên vật tư, loại phiếu, ngày lập, khối lượng, đơn giá, thành tiền… Phương thức: nhập, tính thành tiền, in Lớp các hóa đơn 38 b. Khai báo đối tƣợng Cú pháp: <tên_lớp> <tên_đối_tượng>; Ví dụ: khai báo 2 đối tượng sinh viên SV sv1, sv2; Khi đó sv1, sv2 là hai đối tượng sinh viên 10 39 c. Truy xuất thành phần Dữ liệu <tên_đối_tượng>.<tên_tp_dữ liệu>; Ví dụ: truy xuất họ tên và ngày sinh của sv sv1.ht; sv2.ns; Nếu là con trỏ:<tên_con_trỏ>-><tên_tp_dữ liệu>; 40 c. Truy xuất thành phần Thành phần hàm <tên_đối_tượng>.<tên_hàm>([ds tham số]); Ví dụ: truy xuất phương thức nhập và in của sv sv1.nhap(); sv2.in(); Với con trỏ: <tên_con_trỏ>-><tên_hàm>([tham số]); 41 2. Các phƣơng thức Một đối tượng thường có 4 phương thức cơ bản Các phương thức khởi tạo: Constructor Các phương thức truy vấn: Queries Các phương thức cập nhập: Updates Các phương thức hủy: Destructor 42 a. Hàm khởi tạo Khai báo: <tên_lớp>([ds tham số]); Định nghĩa ngoài lớp: <tên_lớp>::<tên_lớp>([ds tham số]) { //thân hàm } [...]... Các đối tượng không độc lập nhau, chúng có quan hệ với nhau Có 2 loại quan hệ chính: Has a: đối tượng này là 1 thành phần cấu thành nên ĐT kia Ví dụ: ĐT bàn có: đt chân, đt mặt bàn đt xe đạp có: đt bánh xe, đt sườn, đt bàn đạp,… Is a: đối tượng này cũng là đối tượng kia Ví dụ: Thừa kế tạo ra mô hình phân cấp: NGƯỜI PS1 PS2 SV GV Mô hình Thừa kế tạo ra một quan hệ “is a” Ví dụ: một đối tượng. .. không thể thay đối sau khi đối tượng được hình thành Ví dụ: NhanSu(int k=0):scmt(k){…} 88 89 7 Thành phần hằng b Phƣơng thức hằng Khái niệm: Thừa kế (INHERITANCE) là hàm thành phần của lớp nhưng không có khả năng thay đổi thành phần DL trong đối tượng Ví dụ: Với lớp PS thì phương thức in() là hằng Khai báo: Lập trình hướng đối tượng (Object Oriented Programming - OOP) ([tham... khởi tạo mặc định (default constructor) Tên hàm là tên lớp không có tham số Không có kiểu trả về không cần khai báo - Hàm khởi tạo sao chép (copy constructor) Được tự động gọi khi 1 đối tượng của lớp được tạo ra Khai báo: (const &) Nếu không xây dựng thì chương trình tự động sinh hàm khởi tạo mặc định Đối tượng mới sẽ là bản sao của đối tượng đã có - Hàm khởi... thành phần dữ liệu của lớp nhưng không gắn cụ thể với đối tượng nào Khai báo: B a,b; Sẽ tạo ra 2 đối tượng a, b có chung thành phần n: a.n a.x Các đối tượng của lớp đều dùng chung thành phần tĩnh này b.n b.x 80 6 Thành phần tĩnh 81 6 Thành phần tĩnh a Dữ liệu tĩnh a Dữ liệu tĩnh Khai báo: Truy xuất: static ; Theo đối tượng (cách thông thường) Ví dụ: Ví dụ: PS a; a.count=0;... kế từ nhiều hơn một lớp cơ sở Lập trình hướng đối tượng Đa Thừa kế có thể là tính năng rất mạnh nhưng đôi khi gây ra một số vấn đề 112 25 1 Khái niệm về tính đa hình 2 Hàm ảo Đa hình là khả năng cho phép 1 lời gọi đến 1 hàm của lớp chia sẻ, được thực thi bởi hàm tương ứng thuộc lớp con, nếu như đối tượng của lớp cha đang giữ địa chỉ hoặc tham chiếu đến đối tượng thuộc lớp con Định nghĩa: o Hàm... 55 13 4 Mảng và con trỏ của đối tượng Khai báo: [spt]; Ví dụ: SV sinhvien[50]; PS a[8]; Lập trình hướng đối tượng OBJECT ORIENTED PROGRAMMING (OOP) *; Ví dụ: SV *p = sinhvien; 59 Cấp phát mảng động Cú pháp: Kiểu *tên_biến = new Kiểu [số_ptử]; Cấp phát 1 vùng nhớ có số phần tử cho trước còn gọi là cấp phát mảng động trả về địa chỉ của phần tử đầu tiên... bạn bè Thông thường, trong cùng 1 chương trình các đối tượng thuộc cùng 1 lớp chỉ sở hữu các thành phần dữ liệu của riêng nó VD: class A { int n; float x; … }; Khai báo: A a,b; Sẽ tạo ra 2 đối tượng a, b sở hữu riêng biệt 2 vùng dữ liệu khác nhau như h.vẽ: 74 79 17 6 Thành phần tĩnh (static) 6 Thành phần tĩnh (static) Có thể cho phép nhiều đối tượng cùng chia sẽ dữ liệu bằng cách đặt từ khóa static... tuong ++Tao : bay gio co 2 doi tuong Xoa : bay gio con 1 doi tuong Xoa : bay gio con 0 doi tuong Là hàm thành phần của lớp nhưng không gắn với đối tượng cụ thể nào Dùng để thao tác chung cho lớp Trong thân hàm không có đối tượng ẩn static ([tham số]); Ví dụ: xây dựng lớp SV gồm phương thức nhập, in 1 sinh viên Nhập, in danh sách sinh viên 86 87 19 7 Thành phần hằng 7... thể chứa địa chỉ của đối tượng lớp dẫn xuất Khái niệm: là hàm ảo mà không có ĐN hàm Mục đích: 116 o Tránh lãng phí bộ nhớ o Cung cấp một phương thức thống nhất làm giao diện chung Khai báo: virtual ([tsố])=0; 117 26 3 Hàm thuần ảo (pure virtual function)-tt 4 Lớp ảo (virtual class) Đặc điểm: o Không định nghĩa trong lớp cơ sở o Không thể khai báo đối tượng thuộc lớp có... count++;} }; Theo lớp Ví dụ: PS::count=0; 82 83 18 VD: Đếm số đt hiện đang được sử dụng #include 6 Thành phần tĩnh a Dữ liệu tĩnh Chú ý: Tồn tại ngay khi chưa có đối tượng nào Phải được khởi tạo trước khi đối tượng phát sinh Phải khởi tạo ngoài lớp theo cú pháp: :: = ; Ví dụ: int PS::count=0; #include class counter { static int . PhanSo PhanSo:: operator + (PhanSo ps2) { PhanSo tong; tong. tu = this tu*ps2.mau+thismau*ps2.tu; tong. mau=thismau*ps2.mau; return tong; } 54 PhanSo PhanSo:: operator - (PhanSo ps2). thuong.mau=thismau*ps2.tu; return thuong; } void main() { PhanSo ps1,ps2 ,tong, hieu,thuong,tich; cin>>ps1>>ps2; tong= ps1+ps2; // tong= ps1.operator+(ps2) hieu=ps1-ps2; // hieu=ps1.operator-(ps2). liệu mô tả sinh viên: Dữ liệu: họ tên, ngày sinh, giới tính, Điểm toán, lý, hóa, tong Phương thức: nhập, tính tong, in Lớp sinh viên 36 a. Khai báo Ví dụ 2: Xây dựng cấu trúc dữ liệu