Bài giảng Nguyên lý lập trình hướng đối tượng - Bài 4: Hàm tạo và các công cụ khác - Lý Anh Tuấn

pdf 29 trang Gia Huy 17/05/2022 2160
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 4: Hàm tạo và các công cụ khác - 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_4_ham_tao.pdf

Nội dung text: Bài giảng Nguyên lý lập trình hướng đối tượng - Bài 4: Hàm tạo và các công cụ khác - Lý Anh Tuấn

  1. NGUYÊN LÝ LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Bài 4: Hàm tạo và các công cụ khác Giảng viên: TS. Lý Anh Tuấn Email: tuanla@tlu.edu.vn
  2. Nội dung 1. Hàm tạo ◦ Định nghĩa ◦ Lời gọi 2. Các công cụ khác ◦ Bổ từ const cho các tham số ◦ Hàm nội tuyến ◦ Dữ liệu thành viên tĩnh 2
  3. Hàm tạo  Khởi tạo các đối tượng ◦ Khởi tạo một vài hoặc tất cả các biến thành viên ◦ Cũng cho phép thực hiện các hành động khác  Một kiểu hàm thành viên đặc biệt ◦ Được gọi tự động khi khai báo đối tượng  Là một công cụ hữu ích ◦ Là nguyên tắc cơ bản của lập trình hướng đối tượng 3
  4. Định nghĩa hàm tạo  Giống như các hàm thành viên khác ngoại trừ: ◦ Phải có cùng tên với tên lớp ◦ Không trả về giá trị, thậm chí là void  VD: Định nghĩa lớp với hàm tạo class DayOfYear { public: DayOfYear(int dayValue, int monthValue); //Hàm tạo khởi tạo day & month void input(); void output(); private: int day; int month; } 4
  5. Gọi hàm tạo  Khai báo đối tượng: DayOfYear date1(4, 7), date2(5, 5);  Các đối tượng được tạo theo cách: ◦ Hàm tạo được gọi ◦ Các giá trị trong ngoặc được truyền như là các đối số cho hàm tạo ◦ Các biến thành viên day, month được khởi tạo: date1.day 4 date1.month 7 date2.day 5 date2.month 5 5
  6. Gọi hàm tạo  Xét ví dụ: DayOfYear date1, date2 date1.DayOfYear(4, 7);// Không hợp lệ! date2.DayOfYear(5, 5);// Không hợp lệ!  Không thể gọi hàm tạo giống như các hàm thành viên khác 6
  7. Định nghĩa hàm tạo  Giống như các hàm thành viên khác: DayOfYear::DayOfYear(int dayValue, int monthValue) { day = dayValue; month = monthValue; }  Một cách định nghĩa khác DayOfYear::DayOfYear(int dayValue, int monthValue) : day(dayValue), month(monthValue)  { } ◦ Dòng thứ 2 được gọi là “phần khởi tạo” ◦ Phần thân để trống 7
  8. Mục đích khác của hàm tạo  Không chỉ khởi tạo dữ liệu  Phần thân không cần để trống ◦ Như trong phiên bản khởi tạo  Dùng để xác thực dữ liệu! ◦ Đảm bảo chỉ gán dữ liệu phù hợp cho các biến thành viên private 8
  9. Nạp chồng hàm tạo  Có thể nạp chồng hàm tạo giống như những hàm khác  Nhắc lại: một tín hiệu hàm bao gồm ◦ Tên hàm ◦ Danh sách tham số  Cung cấp các hàm tạo với tất cả các danh sách tham số có thể có 9
  10. Ví dụ hàm tạo Hàm tạo mặc định 10
  11. Ví dụ hàm tạo Việc này gây ra một lời gọi đến hàm tạo mặc định. Lưu ý là không có cặp dấu ngoặc Một lời gọi tường minh đến hàm tạo 11
  12. Ví dụ hàm tạo Kết quả thực hiện: 12
  13. Hàm tạo không đối số  Tránh nhầm lẫn với hàm chuẩn không đối số  Gọi hàm chuẩn không đối số : callMyFunction();  Khai báo đối tượng không có các khởi tạo: DayOfYear date1; // Đúng! DayOfYear date(); // Sai! 13
  14. Gọi hàm tạo tường minh  Có thể gọi lại hàm tạo sau khi đối tượng được khai báo  Việc này tạo ra một “đối tượng vô danh”, nó sau đó được gán cho đối tượng hiện tại  Ví dụ: DayOfYear holiday(4, 7); ◦ Hàm tạo được gọi ở thời điểm khai báo đối tượng ◦ Sau đó được goi tường minh để khởi tạo lại đối tượng: holiday = DayOfYear(5, 5); 14
  15. Hàm tạo mặc định  Được định nghĩa là hàm tạo không đối  Nên định nghĩa nó trong mọi trường hợp  Được khởi tạo tự động? ◦ Đúng: nếu không định nghĩa bất kỳ hàm tạo nào ◦ Sai: nếu đã định nghĩa ít nhất một hàm tạo  Nếu không có hàm tạo mặc định ◦ Không thể khai báo: MyClass myObject; 15
  16. Biến thành viên kiểu lớp  Biến thành viên lớp có thể là một đối tượng của một lớp khác  Có một ký pháp đặc biệt: ◦ Cho phép gọi hàm tạo của đối tượng thành viên ◦ Bên trong hàm tạo của lớp bao chứa 16
  17. Ví dụ biến thành viên lớp 17
  18. Ví dụ biến thành viên lớp Biến thành viên của một kiểu lớp Các lời gọi hàm tạo từ lớp DayOfYear 18
  19. Ví dụ biến thành viên lớp Kết quả thực hiện: 19
  20. Các phương pháp truyền tham số  Hiệu quả của việc truyền tham số ◦ Truyền giá trị ◦ Truyền tham biến ◦ Không khác biệt với các kiểu đơn giản ◦ Với kiểu lớp -> lợi ích rõ rệt  Nên sử dụng truyền tham biến ◦ Cho dữ liệu “lớn”, chẳng hạn như kiểu lớp 20
  21. Bổ từ const cho các tham số  Với kiểu dữ liệu lớn (chẳng hạn như lớp) ◦ Nên sử dụng phương pháp truyền tham biến ◦ Thậm chí hàm không thực hiện sửa đổi gì  Bảo vệ đối số ◦ Sử dụng tham số hằng còn được gọi là tham số tham chiếu hằng ◦ Đặt từ khóa const trước kiểu ◦ Làm cho tham số chỉ đọc ◦ Mọi nỗ lực sửa đổi sẽ dẫn đến lỗi biên dịch  Áp dụng cho các tham số hàm thành viên lớp 21
  22. Hàm nội tuyến  Với hàm không phải là hàm thành viên: ◦ Sử dụng từ khóa inline trong khai báo hàm và đầu mục hàm  Với hàm thành viên lớp ◦ Đặt thi hành của hàm trong định nghĩa lớp -> nội tuyến tự động  Chỉ sử dụng cho những hàm rất ngắn  Mã lệnh thực sự được chèn vào nơi gọi ◦ Loại bỏ phụ phí ◦ Hiệu quả hơn, nhưng chỉ sử dụng với hàm ngắn 22
  23. Thành viên tĩnh  Biến thành viên tĩnh ◦ Tất cả đối tượng của lớp chia sẻ một bản sao ◦ Một đối tượng thay đổi nó tất cả đều thấy sự thay đổi  Sử dụng cho việc “giám sát” ◦ Một hàm thành viên có được gọi thường xuyên không ◦ Có bao nhiêu đối tượng tồn tại ở một thời điểm cho trước  Đặt từ khóa static trước kiểu 23
  24. Hàm tĩnh  Hàm thành viên có thể là tĩnh ◦ Nếu hàm không truy cập tới dữ liệu của bất kỳ đối tượng nào ◦ Và vẫn là thành viên của lớp ◦ Làm cho nó trở thành một hàm tĩnh  Có thể được gọi bên ngoài lớp ◦ Từ các đối tượng không lớp VD: Server::getTurn(); ◦ Và bởi các đối tượng lớp VD: myObject.getTurn();  Chỉ có thể sử dụng dữ liệu tĩnh, hàm tĩnh 24
  25. Ví dụ thành viên tĩnh 25
  26. Ví dụ thành viên tĩnh 26
  27. Ví dụ thành viên tĩnh Vì getTurn là tĩnh, chỉ các thành viên tĩnh mới có thể được tham chiếu ở đây 27
  28. Ví dụ thành viên tĩnh  Kết quả thực hiện: 28
  29. Tóm tắt  Hàm tạo: tự động khởi tạo dữ liệu lớp ◦ Được gọi khi khai báo đối tượng ◦ Hàm tạo có cùng tên với lớp  Hàm tạo mặc định không có tham số ◦ Nên được định nghĩa trong mọi trường hợp  Biến thành viên lớp có thể là đối tượng của một lớp khác  Có thể nội tuyến các định nghĩa hàm rất ngắn -> thi hành hiệu quả hơn  Các biến thành viên tĩnh được chia sẻ bởi các đối tượng thuộc cùng một lớp 29