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ỳ.

 

ppt9 trang | Chuyên mục: C/C++ | Chia sẻ: dkS00TYs | Lượt xem: 2162 | Lượt tải: 1download
Tóm tắt nội dung 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, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
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:

  • pptBà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