Bài giảng Nguyên lý lập trình hướng đối tượng - Bài 3: Cấu trúc và lớp - Lý Anh Tuấn

pdf 43 trang Gia Huy 17/05/2022 2110
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Nguyên lý lập trình hướng đối tượng - Bài 3: Cấu trúc và lớp - Lý Anh Tuấn", để 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:

  • pdfbai_giang_nguyen_ly_lap_trinh_huong_doi_tuong_bai_3_cau_truc.pdf

Nội dung text: Bài giảng Nguyên lý lập trình hướng đối tượng - Bài 3: Cấu trúc và lớp - Lý Anh Tuấn

  1. NGUYÊN LÝ LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Bài 3: Cấu trúc và lớp Giảng viên: TS. Lý Anh Tuấn Email: tuanla@tlu.edu.vn
  2. Nội dung 1. Cấu trúc ◦ Các kiểu cấu trúc ◦ Cấu trúc là đối số hàm ◦ Khởi tạo cấu trúc 2. Lớp ◦ Định nghĩa, hàm thành viên ◦ Các thành phần public và private ◦ Hàm truy cập và hàm biến đổi ◦ Cấu trúc vs. Lớp 2
  3. Cấu trúc  Là kiểu dữ liệu gộp giống như mảng  Điểm khác biệt so với mảng: ◦ Mảng: tập các giá trị có cùng kiểu ◦ Cấu trúc: tập các giá trị có kiểu khác nhau  Định nghĩa cấu trúc: ◦ Trước khi khai báo biến ◦ Ở phạm vi toàn cục ◦ Việc định nghĩa không cấp phát bộ nhớ 3
  4. Cấu trúc  Ví dụ: struct CDAccountV1  tên của kiểu cấu trúc mới { double balance;  tên thành viên double interestRate; int term; };  Khai báo biến cho kiểu mới này CDAccountV1 account; ◦ Giống như khai báo các kiểu đơn giản ◦ Biến account có kiểu là CDAccountV1 ◦ Nó bao chứa các giá trị thành viên 4
  5. Truy cập các thành viên cấu trúc  Dùng toán tử . để truy cập các thành viên ◦ account.balance ◦ account.interestRate ◦ account.term  Được gọi là các biến thành viên ◦ Là thành phần của biến cấu trúc ◦ Các cấu trúc khác nhau có thể có các biến thành viên cùng tên 5
  6. Ví dụ về cấu trúc 6
  7. Ví dụ về cấu trúc 7
  8. Ví dụ về cấu trúc  Kết quả thực thi 8
  9. Lỗi thường gặp với cấu trúc  Quên dấu chấm phẩy sau định nghĩa cấu trúc struct WeatherData { double temperature; double windVelocity; };  Cần có dấu chấm phẩy!  Bạn cũng có thể khai báo các biến cấu trúc ở vị trí trước dấu ; 9
  10. Phép gán cấu trúc  Cho trước một cấu trúc tên là CropYield  Khai báo hai biến cấu trúc: CropYield apples, oranges; ◦ Cả hai là biến thuộc kiểu cấu trúc CropYield ◦ Cho phép thực hiện phép gán đơn giản: apples = oranges; ◦ Việc này sao chép giá trị mỗi biến thành viên của oranges vào các biến thành viên của apples 10
  11. Cấu trúc là đối số hàm  Có thể được truyền giống như các kiểu dữ liệu đơn giản ◦ Truyền giá trị ◦ Truyền tham chiếu ◦ Hoặc kết hợp  Cũng có thể được trả về bởi hàm ◦ Kiểu trả về là kiểu cấu trúc ◦ Lệnh trả về trong định nghĩa hàm gửi biến cấu trúc trở lại lời gọi 11
  12. Khởi tạo cấu trúc  Có thể khởi tạo lúc khai báo  Ví dụ: struct Date { int day; int month; int year; }; Date dueDate = {31, 12, 2003};  Khai báo cung cấp dữ liệu khởi tạo cho cả ba biến thành viên 12
  13. Lớp  Lớp bao gồm: ◦ Dữ liệu thành viên (giống cấu trúc) ◦ Có thêm hàm thành viên  Cần cho lập trình hướng đối tượng ◦ Tập trung vào các đối tượng  Đối tượng: Bao gồm dữ liệu và thao tác  Trong C++, biến kiểu lớp là đối tượng 13
  14. Định nghĩa lớp  Định nghĩa tương tự cấu trúc  Ví dụ: class DayOfYear  tên của kiểu lớp mới { public: void output();  hàm thành viên! int day; int month; };  Lưu ý: chỉ có nguyên mẫu của hàm thành viên, thi hành hàm nằm ở nơi khác 14
  15. Khai báo đối tượng  Khai báo tương tự các biến ◦ Kiểu có sẵn, kiểu cấu trúc  Ví dụ: DayOfYear today, birthday;  Khai báo hai đối tượng kiểu lớp DayOfYear  Các đối tượng bao gồm ◦ Dữ liệu: thành viên day, month ◦ Thao tác (hàm thành viên): output() 15
  16. Truy cập thành viên lớp  Truy cập thành viên lớp tương tự như cấu trúc  Ví dụ: today.day today.month ◦ Để truy cập hàm thành viên: today.output();  gọi hàm thành viên 16
  17. Hàm thành viên lớp  Cần định nghĩa hoặc “thi hành” hàm thành viên lớp  Giống như định nghĩa hàm ◦ Có thể đặt sau hàm main() ◦ Cần chỉ rõ lớp  Ví dụ: void DayOfYear::output() { } ◦ :: là toán tử phân giải phạm vi ◦ Nói cho trình biên dịch biết thành viên từ lớp nào ◦ Tên lớp trước :: được gọi là từ định kiểu 17
  18. Định nghĩa hàm thành viên lớp  Xem định nghĩa của hàm thành viên output() (ví dụ trang sau)  Tham chiếu đến dữ liệu của lớp  Hàm được sử dụng cho tất cả các đối tượng của lớp ◦ Khi được gọi sẽ tham chiếu đến dữ liệu của đối tượng ◦ Ví dụ: today.output();  hiển thị dữ liệu của đối tượng today 18
  19. Ví dụ lớp hoàn chỉnh Khai báo hàm thành viên 19
  20. Ví dụ lớp hoàn chỉnh (2) Lời gọi hàm thành viên Định nghĩa hàm thành viên 20
  21. Ví dụ lớp hoàn chỉnh (3) 21
  22. Ví dụ lớp hoàn chỉnh (4)  Kết quả thực thi 22
  23. Toán tử . và toán tử ::  Dùng để chỉ chúng là thành viên của cái gì  Toán tử dấu chấm: ◦ Chỉ rõ thành viên của đối tượng  Toán tử phân giải phạm vi: ◦ Chỉ rõ định nghĩa hàm tới từ lớp nào 23
  24. Vai trò của lớp  Lớp là một kiểu đầy đủ: ◦ giống như các kiểu dữ liệu int, double,  Có thể có biến kiểu lớp: ◦ được gọi là đối tượng  Có thể có tham số kiểu lớp: ◦ truyền tham trị ◦ truyền tham chiếu  Có thể sử dụng kiểu lớp như bất kỳ kiểu dữ liệu nào khác 24
  25. Đóng gói  Kiểu dữ liệu bất kỳ bao gồm ◦ Dữ liệu (phạm vi của dữ liệu) ◦ Thao tác (thi hành trên dữ liệu)  Ví dụ: kiểu dữ liệu int có Dữ liệu: +-32,767 Thao tác: +, -, *, /, %, so sánh,  Với lớp: ◦ Chúng ta chỉ rõ dữ liệu, và các thao tác phụ thuộc dữ liệu 25
  26. Kiểu dữ liệu trừu tượng  “Trừu tượng” ◦ Người lập trình không biết chi tiết  Viết tắt là “ADT” ◦ Tập giá trị dữ liệu và tập thao tác cơ bản trên giá trị  ADT thường “độc lập ngôn ngữ” ◦ Chúng ta cài đặt ADT trong C++ bằng lớp ◦ Các ngôn ngữ khác cũng hỗ trợ ADT 26
  27. Đóng gói (2)  Đóng gói ◦ Nghĩa là “Nhóm lại với nhau làm một”  Khai báo một lớp nhận một đối tượng  Đối tượng là “đóng gói” của ◦ Giá trị dữ liệu ◦ Thao tác trên dữ liệu (hàm thành viên) 27
  28. Các nguyên tắc OOP  Ẩn thông tin ◦ Người dùng lớp không biết chi tiết thao tác làm việc như thế nào  Trừu tượng dữ liệu ◦ người dùng không biết chi tiết dữ liệu được vận hành như thế nào trong ATD/lớp  Đóng gói: ◦ Nhóm dữ liệu thao tác với nhau, nhưng ẩn đi các chi tiết 28
  29. Thành viên public và private  Dữ liệu trong lớp thường được khai báo private trong định nghĩa ◦ Duy trì các quy tắc OOP ◦ Ẩn dữ liệu với người dùng ◦ Chỉ cho phép vận hành bởi các thao tác (hàm thành viên)  Các mục public (thường là các hàm thành viên) cho phép “truy cập mức người dùng” 29
  30. Ví dụ public và private  Sửa lại ví dụ trước: class DayOfYear { public: void input(); void output(); private: int day; int month; };  Dữ liệu bây giờ là private  Đối tượng không thể truy cập trực tiếp 30
  31. Ví dụ public và private (2)  Sử dụng ví dụ trước  Khai báo đối tượng: DayOfYear today;  Đối tượng today chỉ có thể truy cập các thành viên public ◦ cin >> today.day; // Không được phép! ◦ cout << today.month; // Không được phép!  Thay vào đó phải gọi các thao tác public ◦ today.input(); ◦ today.output(); 31
  32. Cách sử dụng public và private  Có thể pha trộn & kết hợp public & private  public thường được đặt trước ◦ Giúp người lập trình dễ xem phần có thể được họ sử dụng ◦ Dữ liệu private là “ẩn”, do vậy không liên quan đến người dùng  Không thể thay đổi (hoặc truy cập) dữ liệu private bên ngoài định nghĩa lớp 32
  33. Hàm truy cập và hàm biến đổi  Đối tượng cần làm việc với dữ liệu của nó  Hàm thành viên truy cập ◦ Cho phép đối tượng đọc dữ liệu ◦ Còn được gọi “hàm thành viên get” ◦ Truy hồi dữ liệu thành viên  Hàm thành viên biến đổi ◦ Cho phép đối tượng thay đổi dữ liệu ◦ Được vận hành tùy thuộc ứng dụng 33
  34. Ví dụ lớp sửa đổi Khai báo hàm thành viên Lời gọi hàm nhập dữ liệu 34
  35. Ví dụ lớp sửa đổi (2) Lời gọi hàm truy cập Định nghĩa hàm thành viên 35
  36. Ví dụ lớp sửa đổi (3)  Kết quả thực thi 36
  37. Tách biệt giao diện và thi hành  Người dùng lớp không cần biết chi tiết lớp được thi hành như thế nào ◦ Nguyên tắc OOP đóng gói  Người dùng chỉ cần các “luật” ◦ Được gọi là “giao diện” của lớp  Trong C++, bao gồm các hàm thành viên và các chú thích liên quan  Ẩn đi sự thi hành lớp ◦ Định nghĩa hàm thành viên nằm ở chỗ khác ◦ Người dùng không cần thấy chúng 37
  38. Cấu trúc vs. Lớp  Cấu trúc ◦ Tất cả thành viên thường là public ◦ Không có hàm thành viên  Lớp ◦ Tất cả dữ liệu thành viên thường là private ◦ Các hàm thành viên giao diện là public  Về cơ bản, tương tự nhau ◦ Tạo cảm giác sử dụng các kỹ thuật rất khác nhau 38
  39. Về các đối tượng  Chú ý sự thay đổi trong việc lập trình ◦ Trước đây thuật toán là pha trung tâm ◦ OOP tập trung vào dữ liệu  Thuật toán vẫn tồn tại ◦ Chúng đơn giản là tập trung vào dữ liệu của chúng ◦ Được làm cho khớp với dữ liệu  Thiết kế giải pháp phần mềm ◦ Định nghĩa các đối tượng khác nhau và cách chúng tương tác 39
  40. Bài tập Định nghĩa và thực thi một lớp HinhTron, bao gồm hai dữ liệu thành viên: bankinh (kiểu double), mausac (kiểu string) và các hàm thành viên: getBankinh(), getMausac(), Dientich(), input(), output(). Trong hàm main() tạo hai đối tượng hình tròn là c1, c2, sau đó gọi đến các hàm input(), output() để kiểm tra sự thực thi. 40
  41. Lời giải 41
  42. Lời giải 42
  43. Tóm tắt  Cấu trúc là một tập các kiểu khác nhau  Lớp được sử dụng để kết hợp dữ liệu và hàm vào trong một đơn vị duy nhất -> đối tượng  Biến thành viên và hàm thành viên ◦ Có thể là public được truy cập bên ngoài lớp ◦ Có thể là private chỉ được truy cập bên trong một định nghĩa hàm  Kiểu lớp và kiểu cấu trúc có thể làm tham số hình thức cho hàm  Định nghĩa lớp C++ nên tách biệt hai phần chính ◦ Giao diện: cái người dùng cần ◦ Sự thi hành: chi tiết lớp làm việc như thế nào 43