Lập trình C++ số 7
Chia sẻ bởi Đặng Anh Tuấn |
Ngày 29/04/2019 |
52
Chia sẻ tài liệu: lập trình C++ số 7 thuộc Tin học 9
Nội dung tài liệu:
Chương 7: Khuôn hình
Nội dung chính
Khuôn hình cho phép xây dựng các hàm và lớp tổng quát
Khuôn hình hàm
Khuôn hình lớp
1. Định nghĩa khuôn hình
Template cho phép định nghĩa một hàm có đặc điểm chung.
C++ sử dụng template để tạo ra những thể hiện cụ thể của hàm khi cần thiết.
Ví dụ: định nghĩa hàm max
template
kind max(kind d1, kind d2)
{
if (d1 > d2)
return (d1);
return (d2);
}
Cấu trúc báo cho C++ biết rằng kind có thể được thay thế bởi bất kỳ kiểu nào, kể cả là class hoặc một kiểu bất kỳ.
Định nghĩa khuôn hình…
Ví dụ: Sử dụng template
main()
{
float f = max(3.5, 8.7);
int i = max(100, 800);
char ch = max(`A`, `Q`);
int i2 = max(600, 200);
}
Khi C++ phát hiện câu lệnh: float f = max(3.5, 8.7); nó sẽ kiểm tra để xác định xem hàm max(float, float) đã có mã lệnh hay chưa và nó sẽ tự động tạo ra mã lệnh nếu chưa có.
Chú ý rằng khi gặp câu lệnh int i2 = max(600, 200); thì nó sẽ không tạo ra mã lệnh cho hàm max(int,int) nữa vì nó đã tạo ra từ trước.
Chuyên biệt hoá hàm
Khi sử dụng hàm max để so sánh hai string như sau:
main()
{
char *namel = "Able";
char *name2 = "Baker";
cout << max(namel, name2) << ` `;
}
Vì string được biểu diễn bởi một con trỏ (char *), nên câu lệnh if (dl > d2) sẽ so sánh giá trị của con trỏ chứ không phải nội dụng của con trỏ.
Mà ta muốn C++ vẫn sử dụng cách so sánh với những dữ liệu thông thường, riêng đối với string thì phải sử dụng strcmp.
Chuyên biệt hoá hàm …
Thực hiện quá trình chuyên biết hoá (specialization). Ta định nghĩa lại hàm max chỉ dùng cho kiểu string.
char *max(char *dl, char *d2)
{
if (strcmp(dl, d2) < 0)
return (dl);
return (d2);
}
Khi C++ phát hiện ra câu lệnh cout << max(namel, name2) << ` `; thì nó sẽ tìm những hàm thông thường có dạng max(char *, char *) , sau đó nó mới tìm đến template max(kind d1, kind d2).
2. Khuôn hình lớp
#include
#include
const int STACK_SIZE = 100; // số lượng phần tử lớn nhất trong Stack
template
class stack {
private:
int count; // Số lượng phần tử của Stack
kind data[STACK_SIZE]; // Mảng chứa các phần tử của Stack
public:
stack (void) {count = 0; // Stack ban đầu rỗng}
void push(const kind item) {
data[count] = item;
++count;
}
kind pop(void) {
--count;
return (data[count]);
}
};
Khuôn hình lớp …
Nếu ta khai báo:
stack a_stack; // câu lệnh không hợp lệ
Stack là một template chung.
Khi C++ nhìn thấy lệnh khai báo này, nó sẽ hỏi “stack nào?”.
Phải xác định một kiểu dữ liệu cụ thể được lưu trong stack.
Phải khai báo:
stack a_stack; // Các phần tử trong stack là kiểu số nguyên
Sau đó, ta có thể sử dụng stack như sau:
a_stack.push(l);
x = a_stack.pop();
Khuôn hình lớp …
Định nghĩa các hàm thành phần bên ngoài định nghĩa lớp như sau:
template
inline void stack::push(const kind item)
{
data[count] = item;
++count;
}
Chuyên biệt hoá lớp
templatestack { ...}
Giới thiệu cho C++ biết cách tạo ra một tập các lớp có tên là stack, stack, stack,…
C++ sẽ tự động tạo ra các hàm thành viên như: stack: :push, stack: :push, và stack::push.
Nếu khai báo một hàm thành viên một cách tường minh thì C++ sẽ sử dụng định nghĩa này trước.
inline void stack::push(const char * item)
{
data[count] = strdup(item);
++count;
}
Từ khoá template nói cho C++ biết ”Đây là class chung, hãy tạo ra một phiên bản tương ứng với nó”.
Nếu không có từ khoá template, C++ sẽ hiểu đây là hàm chính thức và phải sử dụng nó trước.
Nội dung chính
Khuôn hình cho phép xây dựng các hàm và lớp tổng quát
Khuôn hình hàm
Khuôn hình lớp
1. Định nghĩa khuôn hình
Template cho phép định nghĩa một hàm có đặc điểm chung.
C++ sử dụng template để tạo ra những thể hiện cụ thể của hàm khi cần thiết.
Ví dụ: định nghĩa hàm max
template
kind max(kind d1, kind d2)
{
if (d1 > d2)
return (d1);
return (d2);
}
Cấu trúc
Định nghĩa khuôn hình…
Ví dụ: Sử dụng template
main()
{
float f = max(3.5, 8.7);
int i = max(100, 800);
char ch = max(`A`, `Q`);
int i2 = max(600, 200);
}
Khi C++ phát hiện câu lệnh: float f = max(3.5, 8.7); nó sẽ kiểm tra để xác định xem hàm max(float, float) đã có mã lệnh hay chưa và nó sẽ tự động tạo ra mã lệnh nếu chưa có.
Chú ý rằng khi gặp câu lệnh int i2 = max(600, 200); thì nó sẽ không tạo ra mã lệnh cho hàm max(int,int) nữa vì nó đã tạo ra từ trước.
Chuyên biệt hoá hàm
Khi sử dụng hàm max để so sánh hai string như sau:
main()
{
char *namel = "Able";
char *name2 = "Baker";
cout << max(namel, name2) << ` `;
}
Vì string được biểu diễn bởi một con trỏ (char *), nên câu lệnh if (dl > d2) sẽ so sánh giá trị của con trỏ chứ không phải nội dụng của con trỏ.
Mà ta muốn C++ vẫn sử dụng cách so sánh với những dữ liệu thông thường, riêng đối với string thì phải sử dụng strcmp.
Chuyên biệt hoá hàm …
Thực hiện quá trình chuyên biết hoá (specialization). Ta định nghĩa lại hàm max chỉ dùng cho kiểu string.
char *max(char *dl, char *d2)
{
if (strcmp(dl, d2) < 0)
return (dl);
return (d2);
}
Khi C++ phát hiện ra câu lệnh cout << max(namel, name2) << ` `; thì nó sẽ tìm những hàm thông thường có dạng max(char *, char *) , sau đó nó mới tìm đến template max(kind d1, kind d2).
2. Khuôn hình lớp
#include
#include
const int STACK_SIZE = 100; // số lượng phần tử lớn nhất trong Stack
template
class stack {
private:
int count; // Số lượng phần tử của Stack
kind data[STACK_SIZE]; // Mảng chứa các phần tử của Stack
public:
stack (void) {count = 0; // Stack ban đầu rỗng}
void push(const kind item) {
data[count] = item;
++count;
}
kind pop(void) {
--count;
return (data[count]);
}
};
Khuôn hình lớp …
Nếu ta khai báo:
stack a_stack; // câu lệnh không hợp lệ
Stack là một template chung.
Khi C++ nhìn thấy lệnh khai báo này, nó sẽ hỏi “stack nào?”.
Phải xác định một kiểu dữ liệu cụ thể được lưu trong stack.
Phải khai báo:
stack
Sau đó, ta có thể sử dụng stack như sau:
a_stack.push(l);
x = a_stack.pop();
Khuôn hình lớp …
Định nghĩa các hàm thành phần bên ngoài định nghĩa lớp như sau:
template
inline void stack
{
data[count] = item;
++count;
}
Chuyên biệt hoá lớp
template
Giới thiệu cho C++ biết cách tạo ra một tập các lớp có tên là stack
C++ sẽ tự động tạo ra các hàm thành viên như: stack
Nếu khai báo một hàm thành viên một cách tường minh thì C++ sẽ sử dụng định nghĩa này trước.
inline void stack
{
data[count] = strdup(item);
++count;
}
Từ khoá template nói cho C++ biết ”Đây là class chung, hãy tạo ra một phiên bản tương ứng với nó”.
Nếu không có từ khoá template, C++ sẽ hiểu đây là hàm chính thức và phải sử dụng nó trước.
* Một số tài liệu cũ có thể bị lỗi font khi hiển thị do dùng bộ mã không phải Unikey ...
Người chia sẻ: Đặng Anh Tuấn
Dung lượng: |
Lượt tài: 0
Loại file:
Nguồn : Chưa rõ
(Tài liệu chưa được thẩm định)