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
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:
 bai_giang_nguyen_ly_lap_trinh_huong_doi_tuong_bai_4_ham_tao.pdf bai_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
- 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
- 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
- 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
- Đị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
- 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
- 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
- Đị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
- 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
- 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
- Ví dụ hàm tạo Hàm tạo mặc định 10
- 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
- Ví dụ hàm tạo Kết quả thực hiện: 12
- 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
- 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
- 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
- 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
- Ví dụ biến thành viên lớp 17
- 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
- Ví dụ biến thành viên lớp Kết quả thực hiện: 19
- 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
- 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
- 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
- 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
- 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
- Ví dụ thành viên tĩnh 25
- Ví dụ thành viên tĩnh 26
- 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
- Ví dụ thành viên tĩnh  Kết quả thực hiện: 28
- 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






