Bài giảng Lập trình hướng đối tượng trong C++ - Phạm Thị Quỳnh - Chương 5: Khuôn mẫu
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<class kind>
kind max(kind d1, kind d2)
{
if (d1 > d2)
return (d1);
return (d2);
}
Cấu trúc <class kind> 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ỳ.
Chương 5: Khuôn mẫu (Template) Định nghĩa 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 Template … Ví dụ: Sử dụng template main(void) { 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(void) { char *namel = "Able"; char *name2 = "Baker"; cout 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) #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]); } }; Class Template … 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(); Class Template … Đị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 template stack { ...} 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.
File đính kèm:
- Bài giảng Lập trình hướng đối tượng trong C++ - Phạm Thị Quỳnh - Chương 5 Khuôn mẫu.ppt