TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
KỸ THUẬT LẬP TRÌNH HỆ CƠ ĐIỆN
TỬ
Programming Engineering in Mechatronics
Giảng viên: TS. TS. Đặng Thái Việt
Đơn vị: Bộ mơn Cơ điện tử, Viện Cơ khí
Hà Nội, 09/2017
1
CHƯƠNG 13. C++ nâng cao
13.1 Xử lý ngoại lệ (Exception Handling)
13.2 Bộ nhớ động
13.3 Namespace
13.4 Template
13.5 Bộ tiền xử lý (Preprocessor)
13.6 Xử lý tín hiệu (Signal Handling)
13.7 Đa luồng (Multithread)
13.8 Một số lớp quan trọng
2
Xử lý ngoại lệ (Exception Handling)
Giới thiệu
•
•
Một Exception (ngoại lệ) là một vấn đề xuất hiện trong
khi thực thi một chương trình. Một Exception trong C++ là
một phản hồi về một tình huống ngoại lệ mà xuất hiện
trong khi một chương trình đang chạy, ví dụ như chia cho
số 0.
Exception cung cấp một cách để truyền điều khiển từ một
phần của một chương trình tới phần khác. Exception
Handling (Xử lý ngoại lệ) trong C++ được xây dựng dựa
trên 3 từ khóa là: try, catch, và throw.
3
Xử lý ngoại lệ (Exception Handling)
Giới thiệu
§
§
§
throw: Một chương trình ném một Exception khi một vấn
đề xuất hiện. Việc này được thực hiện bởi sử dụng từ
khóa throw trong C++.
catch: Một chương trình bắt một Exception với một
Exception Handler tại vị trí trong một chương trình nơi
bạn muốn xử lý vấn đề đó. Từ khóa catch trong C++ chỉ
dẫn việc bắt một exception.
try: Một khối try có thể được bắt bởi một số lượng cụ
thể exception. Nó được theo sau bởi một hoặc nhiều
khối catch.
4
Xử lý ngoại lệ (Exception Handling)
Giới thiệu
•
Giả sử một khối sẽ tạo một Exeption, một phương thức
bắt một exception bởi sử dụng kết hợp các từ
khóa try và catch. Một khối try/catch được đặt xung
quanh code mà có thể tạo một exception. Code bên trong
một khối try/catch được xem như là code được bảo vệ,
và cú pháp để sử dụng try/catch trong C++ như sau:
5
Xử lý ngoại lệ (Exception Handling)
Giới thiệu
6
Xử lý ngoại lệ (Exception Handling)
Ném Exception trong C++
•
Exception có thể bị ném ở bất cứ đâu bên trong một khối
code bởi sử dụng các lệnh throw trong C++. Tốn hạng
của lệnh throw quyết định kiểu cho exception và có thể là
bất kỳ biểu thức nào và kiểu kết quả của biểu thức quyết
định kiểu của exception bị ném.
7
Xử lý ngoại lệ (Exception Handling)
Bắt Exception trong C++
•
Khối catch theo sau khối try trong C++ sẽ bắt bất kỳ
exception nào. Bạn có thể xác định kiểu của exception
bạn muốn bắt và điều này được xác định bởi khai báo
exception mà xuất hiện trong các dấu ngoặc đơn theo
sau từ khóa catch trong C++.
8
Xử lý ngoại lệ (Exception Handling)
Bắt Exception trong C++
•
Code trên sẽ bắt một exception có kiểu
là ten_Exception. Nếu bạn muốn xác định rằng một khối
catch nến xử lý bất kỳ kiểu exception nào bị ném trong
một khối try, bạn phải đặt một dấu ba chấm (…) trong các
dấu ngoặc đơn theo sau từ khóa catch, như sau:
9
Xử lý ngoại lệ (Exception Handling)
Ví dụ
10
Xử lý ngoại lệ (Exception Handling)
Ví dụ
11
Xử lý ngoại lệ (Exception Handling)
Standard Exception trong C++
•
C++ cung cấp một danh sách các Standard Exception
được định nghĩa trong <exception> mà chúng ta có thể
sử dụng trong các chương trình. Những exception này
được sắp xếp theo cấu trúc thứ tự cha-con như sau:
12
Xử lý ngoại lệ (Exception Handling)
Standard Exception trong C++
13
Xử lý ngoại lệ (Exception Handling)
Standard Exception trong C++
•
C++ cung cấp một danh sách các Standard Exception
được định nghĩa trong <exception> mà chúng ta có thể
sử dụng trong các chương trình. Những exception này
được sắp xếp theo cấu trúc thứ tự cha-con như sau:
14
Xử lý ngoại lệ (Exception Handling)
Standard Exception trong C++
Exception
Miêu tả
std::exception
Một exception và lớp cha của tất cả Standard Exception trong C++
std::bad_alloc
Có thể được ném bởi new
std::bad_cast
Có thể được ném bởi dynamic_cast
std::bad_exception
Đây là thiết bị hữu ích để xử lý Unexpected Exception trong một chương trình C++
std::bad_typeid
Có thể được ném bởi typeid
std::logic_error
Một exception mà theo lý thuyết có thể được phát hiện bởi việc đọc code
std::domain_error
Đây là một exception được ném khi một miền tốn học khơng hợp lệ được sử dụng
std::invalid_argument
Được ném do các tham số khơng hợp lệ
std::length_error
Được ném khi một std::string q lớn được tạo ra
std::out_of_range
Có thể được ném bởi một phương thức, ví dụ std::vector và std::bitset<>::operator[]().
std::runtime_error
Một exception mà theo lý thuyết khơng thể được phát hiện bởi việc đọc code
std::overflow_error
Được ném nếu một sự tràn luồng tốn học (mathematical overflow) xuất hiện
std::range_error
Xuất hiện khi bạn cố gắng lưu giữ một giá trị bên ngồi dãy giá trị
std::underflow_error
Được ném nếu một mathematical underflow (sự tràn dưới) xuất hiện
15
Xử lý ngoại lệ (Exception Handling)
Định nghĩa Exception mới trong C++
•
Bạn có thể định nghĩa các exception cho riêng bạn bằng
việc kế thừa và ghi đè tính năng lớp exception trong C++.
Ví dụ sau minh họa cách bạn có thể sử dụng lớp
std::exception để triển khai exception của riêng bạn theo
một cách chuẩn trong C++:
16
Xử lý ngoại lệ (Exception Handling)
Định nghĩa Exception mới trong C++
17
Bnhng
Khỏinim
ã
Đ
Đ
ã
B nh trong chng trỡnh C/C++ ca bn c phõn
thnhhaiphn:
Stack:Ttcbinckhaibỏobờntronghmsnhnb
nhtstacktrongC/C++.
Heap: Được sử dụng để cấp phát bộ nhớ động khi chương
trình chạy.
Nhiều khi, bạn khơng biết trước bao nhiêu bộ nhớ bạn
sẽ cần để lưu thông tin cụ thể trong một biến đã được
định nghĩa và kích cỡ bộ nhớ cần thiết có thể được
quyết định tại run time.
18
Bộ nhớ động
Khái niệm
•
•
Bạn có thể cấp phát bộ nhớ tại run time bên trong Heap
cho biến đó với một kiểu đã cho bởi sử dụng một tốn tử
đặc biệt trong C/C++ mà trả về địa chỉ của khơng gian đã
cấp phát. Tốn tử này gọi là tốn tử new trong C/C++.
Nếu bạn khơng cần thiết bộ nhớ động đã cấp phát nữa,
bạn có thể sử dụng tốn tử delete trong C/C++, sẽ giải
phóng bộ nhớ đã được cấp phát trước đó bởi tốn tử
new.
19
Bộ nhớ động
Tốn tử new và delete trong C/C++
•
•
Đây là cú pháp chung để sử dụng tốn tử new để cấp
phát bộ nhớ động cho bất kỳ kiểu dữ liệu nào trong C/C+
+:
Ở đây, kieu_du_lieu có thể là bất kỳ kiểu dữ liệu có sẵn
nào ví dụ như mảng hoặc các kiểu dữ liệu tự định nghĩa
như lớp hoặc cấu trúc.
20
Bộ nhớ động
Ví dụ
21
Bộ nhớ động
Tốn tử new và delete trong C/C++
•
Tại bất kỳ thời điểm, khi bạn cảm thấy một biến đã được
cấp phát động là khơng cần thiết nữa, bạn có thể giải
phóng bộ nhớ mà nó đã chiếm giữ trong phần bộ nhớ rỗi
với tốn tử delete trong C/C++, như sau:
22
Bộ nhớ động
Ví dụ
23
Bộ nhớ động
Cấp phát bộ nhớ động cho Mảng trong C/C++
24
Bộ nhớ động
Cấp phát bộ nhớ động cho Đối tượng
25