Slide Lập trình hướng đối tượng C++

449 1.2K 3
Slide Lập trình hướng đối tượng C++

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG (C++) Giảng viên: Đặng Hồi Phương Bộ môn: Công nghệ phần mềm Khoa: Công nghệ Thông tin Trường Đại học Bách Khoa Đại học Đà Nẵng LOGO LOGO • • • • GIỚI THIỆU Đặng Hồi Phương E-mail: danghoaiphuongdn@gmail.com Tel: 0935578555 Khoa Cơng nghệ thơng tin, trường Đại học Bách khoa, Đại học Đà Nẵng LOGO NỘI DUNG MÔN HỌC Chương 1: Object-Oriented Programming (OOP) Chương 2: Các mở rộng C++ so với C Chương 3: Pointer Chương 4: Class & Object Chương 5: Operator Overloading Chương 6: Inheritance Chương 7: Polymorphism Chương 8: Template Chương 9: Exception LOGO TÀI LIỆU THAM KHẢO Đặng Hồi Phương, Slide giảng Lập trình hướng đối tượng, Khoa CNTT, trường Đại học Bách Khoa, Đại học Đà Nẵng, 2015 Lê Thị Mỹ Hạnh, Giáo trình Lập trình hướng đối tượng, Khoa CNTT, trường Đại học Bách khoa, Đại học Đà Nẵng Phạm Văn Ất, C++ Lập trình hướng đối tượng, NXB Giao thông vận tải Bruce Eckel, Thinking in C++ Second Edition MindView Inc., 2000 LOGO ĐÁNH GIÁ & YÊU CẦU • Chuyên cần tập: 20% o Làm đầy đủ tập nhà • Thi kỳ: 20% o Trắc nghiệm máy tính • Thi cuối kỳ: 60% o Trắc nghiệm máy tính • Yêu cầu: o Mang theo laptop dây cắm nối buổi học; o Chỉ điểm danh 01 lần/học kỳ; ❖Vắng buổi điểm danh → SEE YOU NEXT TIME LOGO CHƯƠNG OBJECT-ORIENTED PROGRAMMING (OOP) LOGO NGÔN NGỮ LẬP TRÌNH • Ngơn ngữ lập trình (NNLT): ngơn ngữ dùng để diễn tả thuật tốn cho máy tính hiểu thực • loại NNLT: o Ngôn ngữ máy (Mã máy): ▪ Các lệnh mã hóa kí hiệu – 1; ▪ Chương trình nạp vào nhớ thực o Hợp ngữ (Assembly): sử dụng từ viết tắt tiếng Anh để diễn tả câu lệnh o Ngơn ngữ bậc cao: ▪ Các lệnh mã hóa ngôn ngữ (gần với Tiếng Anh); ▪ Chương trình phải chuyển đổi thành mã máy thơng qua chương trình dịch LOGO LỊCH SỬ NGƠN NGỮ LẬP TRÌNH LOGO LỊCH SỬ NGƠN NGỮ LẬP TRÌNH LOGO LỊCH SỬ NGƠN NGỮ LẬP TRÌNH LOGO LỚP EXCEPTION • Một số lớp ngoại lệ chuẩn khác dẫn xuất từ lớp sở exception; • File header (cũng thuộc thư viện chuẩn C++) chứa số lớp ngoại lệ dẫn xuất từ exception: o File #include nên dùng không cần #include • Trong có lớp quan trọng dẫn xuất trực tiếp từ exception: o runtime_error; o logic_error LOGO LỚP EXCEPTION • runtime_error dùng để đại diện cho lỗi thời gian chạy (các lỗi kết tình khơng mong đợi, chẳng hạn: hết nhớ); • logic_error dùng cho lỗi logic chương trình (chẳng hạn truyền tham số khơng hợp lệ); • Thông thường, ta dùng lớp (hoặc lớp dẫn xuất chúng) thay dùng trực tiếp exception: o Một lý lớp có constructor nhận tham số string mà kết trả hàm what() LOGO LỚP EXCEPTION • runtime_error có lớp dẫn xuất sau: o range_error: điều kiện sau bị vi phạm; o overflow_error: xảy tràn số học; o bad_alloc: khơng thể cấp phát nhớ • logic_error có lớp dẫn xuất sau: o domain_error: điều kiện trước bị vi phạm; o invaliad_argument: tham số không hợp lệ truyền cho hàm; o length_error: tạo đối tượng lớn độ dài cho phép; o out_of_range: tham số khoảng (chẳng hạn số không hợp lệ LOGO LỚP EXCEPTION • Ta viết lại hàm MyDivide() để sử dụng ngoại lệ chuẩn tương ứng sau: • Ta phải sửa lệnh catch cũ để bắt ngoại lệ kiểu invalid_argument (thay cho kiểu string phiên trước) LOGO LỚP EXCEPTION LOGO KHAI BÁO NGOẠI LỆ • Làm để user biết hàm/phương thức ném ngoại lệ nào? • Đọc thích, tài liệu? o Khơng phải lúc có tài liệu & tài liệu đủ thơng tin; o Không tiện phải kiểm tra cho hàm • C++ cho phép khai báo hàm ném loại ngoại lệ không ném ngoại lệ: o Một phần giao diện hàm; o Ví dụ: hàm MyDivide() ném ngoại lệ invalid_argument LOGO KHAI BÁO NGOẠI LỆ • Cú pháp: từ khóa throw cuối lệnh khai báo hàm, cặp ngoặc “()” chứa nhiều tên kiểu (tách dấu “,”): void MyFunction( ) throw(type1, type2, , typeN) { } • Hàm khơng ném ngoại lệ: void MyFunction( ) throw() { } • Cú pháp tương tự phương thức: bool FlightList::contains(Flight *f) const throw(char *) { } • Nếu khơng có khai báo throw, hàm/phương thức ném loại ngoại lệ LOGO KHAI BÁO NGOẠI LỆ • Chuyện xảy ta ném ngoại lệ thuộc kiểu khơng có khai báo? o Nếu hàm ném ngoại lệ không thuộc kiểu khai báo, hàm unexcepted() gọi; o Theo mặc định, unexcepted() gọi hàm terminate() mà ta nói đến; o Tương tự terminate(), hoạt động unexcepted() thay đổi cách sử dụng hàm set_unexpected() LOGO KHAI BÁO NGOẠI LỆ • Ta phải đặc biệt cẩn trọng làm việc với thừa kế & khai báo ngoại lệ; • Giả sử có lớp sở B chứa phương thức ảo foo(): o Khai báo foo() ném loại ngoại lệ e1 & e2: • Giả sử D lớp dẫn xuất B, D định nghĩa lại foo(): o Cần có hạn chế khả ném ngoại lệ D? LOGO KHAI BÁO NGOẠI LỆ • Khai báo phương thức cốt yếu để tun bố người dùng mong đợi từ phương thức đó: o Đưa ngoại lệ vào khai báo hàm/phương thức hạn chế loại đối tượng ném từ hàm/phương thức • Khi có có mặt thừa kế & đa hình, điều phải áp dụng được; • Do vậy, lớp dẫn xuất override phương thức lớp sở, khơng thể bổ sung kiểu ngoại lệ vào phương thức: o Nếu không, truy nhập phương thức qua trỏ trỏ tới lớp sở gặp phải ngoại lệ mà họ khơng mong đợi (do khơng có khai báo lớp sở) • Tuy nhiên, lớp dẫn xuất phép giảm bớt số loại ngoại lệ ném LOGO KHAI BÁO NGOẠI LỆ • Ví dụ: phiên foo() lớp B ném ngoại lệ thuộc kiểu e1 & e2; phiên override lớp D ném ngoại lệ thuộc loại e1: o Không vi phạm quy định lớp sở B • Tuy nhiên, D bổ sung kiểu ngoại lệ e3 cho ngoại lệ mà foo() D ném: o Do việc vi phạm khẳng định thể D “là” thể B LOGO KHAI BÁO NGOẠI LỆ • Các ràng buộc tương tự áp dụng loại đối tượng ném thuộc thừa kế: o Giả sử ta có thừa kế thứ hai gồm lớp ngoại lệ, BE lớp sở DE lớp dẫn xuất • Nếu phiên foo() B ném đối tượng thuộc lớp DE (lớp dẫn xuất), phiên foo() lớp D ném thể lớp BE (lớp sở) LOGO CONSTRUCTOR & NGOẠI LỆ • Cách tốt để thông báo việc khởi tạo không thành cơng: o Constructor khơng có giá trị trả • Cần ý để đảm bảo constructor không để đối tượng trạng thái khởi tạo dở: o Dọn dẹp trước ném ngoại lệ LOGO DESTRUCTOR & NGOẠI LỆ • Khơng nên để ngoại lệ ném từ destructor; • Nếu destructor trực tiếp gián tiếp ném ngoại lệ, chương trình kết thúc: o Hậu quả: chương trình nhiều lỗi kết thúc bất ngờ mà ta khơng nhìn thấy nguồn gốc lỗi • Vậy, destructor cần bắt tất ngoại lệ ném từ hàm gọi từ LOGO

Ngày đăng: 10/12/2017, 15:03

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan