NGÔN NGỮ LẬP TRÌNH KHUÔN MẪU -...
Transcript of NGÔN NGỮ LẬP TRÌNH KHUÔN MẪU -...
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 1
NGÔN NGỮ LẬP TRÌNH
KHUÔN MẪU
fit.hnue.edu.vn/~dungntp/NNLT
Nội dung
• Khuôn mẫu hàm
• Khuôn mẫu lớp
• Khuôn mẫu và thừa kế
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 2
Xét ví dụ
• Viết chương trình cho phép:
– Nhập vào 2 số nguyên a, b. Thực hiện việc hoán đổi giá trị 2 biến a, b cho nhau.
– Nhập vào 2 ký tự x, y. Thực hiện việc hoán đổi giá trị 2 biến x, y cho nhau.
– Nhập vào 2 chuỗi str1, str2. Thực hiện việc hoán đổi giá trị 2 biến str1, str2 cho nhau.
– ……
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 3
=> phải nạp chồng các hàm hoán đổi như sau
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 4
Nếu yêu cầu hoán đổi 2 đối tượng
khác nữa thì sao?
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 5
Sử dụng
Khuôn mẫu hàm
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 6
Khuôn mẫu hàm
• Là một mô hình (mẫu) giúp tạo định nghĩa
chung cho những hàm Chỉ khác nhau về kiểu
dữ liệu mà chúng thao tác.
• Khuôn mẫu hàm khác với nạp chồng ở chỗ
đoạn mã định nghĩa hàm chỉ cần viết MỘT
LẦN
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 7
Cú pháp của khuôn mẫu hàm
• Sử dụng tiền tố khuôn mẫu template <class T>
• Sau đó đến khai báo và định nghĩa hàm mà
trong đó sử dụng T là một kiểu được thay thế
cho bất kỳ 1 kiểu nào
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 8
Như ví dụ trên
• Thay tất cả các hàm hoán đổi bằng MỘT mẫu
hàm như sau:
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 9
Ví dụ
• Lúc này trong hàm main gọi:
– doicho(a, b) thì T sẽ được hiểu là kiểu int
– doicho(a1, b1) thì T sẽ được hiểu là kiểu bool
– doicho(a2, b2) thì T sẽ được hiểu là kiểu string
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 10
Cách thức hoạt động của khuôn mẫu
• Khi gọi một khuôn mẫu hàm với một kiểu dữ liệu, trình biên dịch sẽ tạo một định nghĩa hàm thực sự từ khuôn mẫu này dựa theo kiểu dữ liệu của tham số
• Khuôn mẫu hàm không sử dụng bộ nhớ
• Mã thực sự chỉ được tạo khi tên khuôn mẫu được gọi
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 11
Cách thức hoạt động của khuôn mẫu
• Mọi kiểu dữ liệu chỉ định trong khuôn mẫu
hàm phải được dùng bên trong thân của khuôn
mẫu hàm
• Lời gọi hàm phải truyền đầy đủ tham số (với
kiểu dữ liệu) được chỉ định trong khuôn mẫu
hàm
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 12
Cách thức hoạt động của khuôn mẫu
• Khuôn mẫu hàm có thể được nạp chồng với
danh sách tham số khác nhau
• Giống như các hàm thông thường, khuôn mẫu
hàm phải được định nghĩa trước khi gọi
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 13
Bài tập
• Tạo khuôn mẫu hàm tìm max của 2 tham số.
• Viết chương trình tìm max của 2 số nguyên, 2
số thực, 2 chuỗi.
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 14
Khuôn mẫu lớp
• Tương tự như khuôn mẫu hàm
• Khuôn mẫu lớp được dùng để tạo ra một lớp
khái quát hơn cho các kiểu của dữ liệu và các
hàm thành phần
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 15
Cú pháp định nghĩa khuôn mẫu lớp
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 16
Tiền tố khuôn mẫu
Ví dụ khuôn mẫu lớp
• Tạo ra một lớp chứa 1 cặp đôi các giá trị kiểu T
– Nếu T là int thì đối tượng của lớp này sẽ chứa 1 cặp
2 số nguyên
– Nếu T là char thì đối tượng của lớp này sẽ chứa 1
cặp 2 ký tự
– ….
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 17
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 18
Khai báo khuôn
mẫu lớp
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 19
Định nghĩa các hàm thành viên
• Giống như định nghĩa các hàm thành viên của các lớp thông thường
• Chỉ khác ở chỗ nó là một khuôn mẫu hàm
• => Cần chú ý: – Phải có tiền tố khuôn mẫu trước mỗi
định nghĩa
– Tên lớp trước toán tử phân giải phạm vi ::
Sử dụng khuôn mẫu lớp
• Khuôn mẫu lớp có thể được sử dụng thay thế
cho bất kỳ chỗ nào sử dụng các kiểu chuẩn
• Để tạo các đối tượng của lớp
• Để làm tham số cho hàm
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 20
Ví dụ sử dụng khuôn mẫu lớp để tạo ra
các đối tượng của lớp
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 21
Ví dụ sử dụng khuôn mẫu lớp để tạo ra
các đối tượng của lớp
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 22
• A là đối tượng của
khuôn mẫu lớp
cap
• Sử dụng A như
một đối tượng của
lớp thông thường
Ví dụ sử dụng khuôn mẫu lớp để làm
tham số cho hàm
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 23
Khuôn mẫu lớp cap làm tham số cho hàm tong
Truyền đối tượng của khuôn mẫu lớp cap vào
hàm tong
Khuôn mẫu và kế thừa
• Có thể sử dụng khuôn mẫu trong thừa kế
– Tạo ra một lớp khuôn mẫu dẫn xuất từ một lớp
khuôn mẫu cơ sở
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 24
Ví dụ kế thừa khuôn mẫu lớp
• Khai báo khuôn
mẫu lớp SoPhuc
kế thừa từ khuôn
mẫu lớp cap
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 25
Ví dụ kế thừa khuôn mẫu lớp
• Định nghĩa các hàm thành phần cho khuôn mẫu
SoPhuc
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 26
Ví dụ kế thừa khuôn mẫu lớp
• Sử dụng khuôn
mẫu lớp SoPhuc
cho 2 kiểu int và
float:
02/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 27
Bạn đã từng dùng khuôn mẫu lớp nào
03/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 28
Vector
• Vector là một kiểu khuôn mẫu lớp
• Vector cho phép tạo ra các loại mảng với
những kiểu dữ liệu khác nhau
• Vector cho phép thay đổi kích thước mảng khi
chương trình đang chạy
03/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 29
Vector
• Để sử dụng được vector cần khai báo thư viện
vector bằng câu lệnh #include<vector>
• Một số cách khai báo vector vector<int> a; Khai báo một vector a có kiểu int
vector<int> a(10); Khai báo một vector a có 10 phần tử kiểu
int
vector<int> a(10, 2); khai báo một vector a có 10 phần tử
kiểu int, khởi tạo cho cả 10 phần tử bằng 2.
03/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 30
Một số toán tử và phương thức của khuôn mẫu lớp vector
Toán tử/Phương
thức
Mô tả
= Gán vector
[chỉ-số] Truy nhập tới phần tử của vector theo chỉ số
.size() Lấy số phần tử của vector
.resize(n) Thay đổi số phần tử của vector (có n phần tử)
.at(chỉ-số) Truy nhập tới phần tử của vector theo chỉ số
.front() Truy nhập vào phần tử đầu tiên của vector
.back() Truy nhập vào phần tử cuối cùng của vector
03/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 31
Một số toán tử và phương thức của khuôn mẫu lớp vector
Phương thức Mô tả
.push_back(pt) Thêm phần tử pt vào cuối dãy. Số phần tử của dãy
tăng lên 1.
.pop_back() Xoá phần tử khỏi dãy. Số phần tử của dãy giảm 1
.insert(pos, giatri) Chèn 1 phần tử vào vị trí pos của dãy
.insert(pos, n, giatri) Chèn n phần tử vào vị trí pos của dãy
.erase(pos) Xóa phần tử vị trí thứ pos của dãy.
.erase(vt1, vt2) Xóa phần tử từ vị trí 1 đến vị trí 2 trong dãy
.clear() Xóa hết các phần tử của vector
.swap(vector2) Hoán đổi 2 vector
03/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 32
Bài tập
03/05/2018 Nguyễn Thị Phương Dung - Khoa CNTT - ĐHSPHN 33