Bài giảng lập trình hướng đối tượng chương 7 đh lạc hồng

25 244 0
Bài giảng lập trình hướng đối tượng  chương 7   đh lạc hồng

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Chương Template Nội dung Khuôn mẫu - Template C++ Template Khuôn mẫu hàm Khuôn mẫu lớp Chương Template Ví dụ khuôn mẫu  Hàm hoán vị số nguyên a, b void swap(int& a, int& b) { int temp; temp = a; a = b; b = temp; }  Nếu ta muốn thực việc tương tự cho kiểu liệu khác float?  dùng overload void swap(float& a, float& b) { float temp; temp = a; a = b; b = temp; }  Có cách cài đặt hàm tổng quát không? 29/8/2014 www.lhu.edu.vn Chương Template Ví dụ khuôn mẫu  Ví dụ khác: ta định nghĩa lớp biểu diễn cấu trúc ngăn xếp chứa số nguyên class Stack { public: Stack(); ~Stack(); void push(const int& i); void pop(int& i); bool isEmpty() const; private: int *data; … }; 29/8/2014 www.lhu.edu.vn Chương Template Ví dụ khuôn mẫu  Ta thấy khai báo định nghĩa Stack phụ thuộc mức độ vào kiểu liệu int  Một số phương thức lấy tham số trả kết kiểu int  Nếu ta muốn tạo ngăn xếp cho kiểu liệu khác sao?  Ta có nên định nghĩa lại hoàn toàn lớp Stack (kết tạo nhiều lớp chẳng hạn IntStack, FloatStack, …) hay không?  Có thể cài đặt lớp Stack tổng quát không? 29/8/2014 www.lhu.edu.vn Chương Template Ví dụ khuôn mẫu  Sử dụng trình tiền xử lý C • Trình tiền xử lý thực thay text trước dịch • Do đó, ta dùng #define để kiểu liệu thay đổi chỗ cần #define TYPE int void swap( TYPE & a, TYPE & b) { TYPE temp; temp = a; a = b; b = temp; }  Hai hạn chế: • Không hiệu dễ gây lỗi • cho phép định nghĩa chương trình 29/8/2014 www.lhu.edu.vn Chương Template C++ Template  Template (khuôn mẫu) chế thay mã cho phép tạo cấu trúc mà rõ kiểu liệu cụ thể  Từ khoá template dùng C++ để báo cho trình biên dịch đoạn mã theo sau thao tác nhiều kiểu liệu chưa xác định  Từ khoá template theo sau cặp ngoặc nhọn chứa tên kiểu liệu tuỳ ý cung cấp, gọi tham số template 29/8/2014 www.lhu.edu.vn Chương Template C++ Template  Định nghĩa template cho hàm hoán vị template void swap(T & a, T & b) { T temp; temp = a; a = b; b = temp; }  Lưu ý: Một lệnh template có hiệu khai báo sau nó, từ khoá class dùng chung cho kiểu liệu 29/8/2014 www.lhu.edu.vn Chương Template C++ Template  Hai loại khuôn mẫu bản: • Function template – khuôn mẫu hàm cho phép định nghĩa hàm tổng quát dùng đến kiểu liệu tuỳ ý • Class template – khuôn mẫu lớp cho phép định nghĩa lớp tổng quát dùng đến kiểu liệu tuỳ ý 29/8/2014 www.lhu.edu.vn Chương Template Function Template  Khuôn mẫu hàm dạng khuôn mẫu đơn giản cho phép ta định nghĩa hàm dùng đến kiểu liệu tuỳ ý  Định nghĩa hàm swap() khuôn mẫu: template void swap(T & a, T & b) { T temp; temp = a; a = b; b = temp; }  Cài đặt template hiệu nhiều so với sử dụng #define 29/8/2014 www.lhu.edu.vn Chương Template Function Template  Thực chất, sử dụng template, ta định nghĩa tập vô hạn hàm chồng với tên swap()  Để gọi phiên này, ta cần gọi với kiểu liệu tương ứng int x = float a swap(x, swap(a, 29/8/2014 1, y = 2; = 1.1, b = 2.2; y); // gọi phiên hàm swap(int,int) b);// gọi phiên hàm swap(float,float) www.lhu.edu.vn Chương Template Class Template  Ta định nghĩa template cho struct union template //khuôn mẫu kiểu T struct myStruct { T first; T second; }; template //khuôn mẫu kiểu T U union myUnion { T first; U second; }; 29/8/2014 www.lhu.edu.vn Chương Template Class Template  Để tạo thể template, ta phải dùng ký hiệu cặp ngoặc nhọn  Khác với khuôn mẫu hàm ta bỏ qua kiểu liệu cho tham số, khuôn mẫu class/struct/union, chúng phải cung cấp tường minh myStruct p; // Sai ! myStruct q; //khai báo biến kiểu myStruct myUnion r; //khai báo biến kiểu myUnion  Tại đòi hỏi kiểu tường minh?  Nếu kiểu liệu sử dụng, trình biên dịch làm để biết cần cấp phát nhớ cho biến tạo? 29/8/2014 www.lhu.edu.vn Chương Template Class Template  Tương tự với khuôn mẫu hàm, ta định nghĩa khuôn mẫu lớp (class template) sử dụng thể nhiều kiểu liệu tuỳ ý  Khai báo khuôn mẫu lớp tương tự với khuôn mẫu hàm  Khi thiết kế khuôn mẫu (cho lớp hàm), thông thường, ta nên tạo phiên cụ thể trước, sau chuyển thành template 29/8/2014 www.lhu.edu.vn Chương Template Class Template  Khai báo định nghĩa lớp Stack cho kiểu int class Stack { public: Stack(); ~Stack(); void push(const int& i); void pop(int& i); bool isEmpty() const; bool isFull() const; private: static const int max; int contents[max]; int current; }; 29/8/2014 www.lhu.edu.vn Chương Template Class Template int Stack::max=10;//khởi gán biến static Stack::Stack() { this->current = 0; }// pt thiết lập Stack::~Stack() {} //pt huỷ bỏ void Stack::push(const int& i) { if (this->current < this->max) this->contents[this->current++] = i; else cout 0) i = this->contents[ this->current]; else coutcurrent == this->max); } 29/8/2014 www.lhu.edu.vn Chương Template Class Template  Khai báo định nghĩa template Stack: template class Stack { public: Stack(); ~Stack(); void push(const T& i); void pop(T& i); bool isEmpty() const; bool isFull() const; private: static const int max ; T contents[max]; int current; }; 29/8/2014 www.lhu.edu.vn Chương Template Class Template template int Stack::max=10;//khởi gán biến tĩnh template Stack::Stack(){ this->current = 0;}//pt thiết lập template Stack::~Stack() {} //pt huỷ bỏ template void Stack::push(const T& i) { if (this->current < this->max) this->contents[this->current++]=i; else cout 0) i = this->contents[ this->current]; else coutcurrent == this->max); } 29/8/2014 www.lhu.edu.vn Chương Template Class Template  Sau đó, ta tạo sử dụng thể lớp định nghĩa template ta: int x = 5, y; char c = 'a', d; Stack s; Stack t; s.push(x); t.push(c); s.pop(y); t.pop(d); 29/8/2014 www.lhu.edu.vn Chương Template Các tham số Template  Trong ví dụ Stack, ta có max quy định số lượng tối đa đối tượng mà ngăn xếp chứa  Như vậy, thể có kích thước kiểu đối tượng chứa  Nếu ta muốn Stack có kích thước khác nhau?  Ta thêm tham số kiểu int vào lệnh template (tham số dùng để xác định kích thước Stack)  Lưu ý: ta khai báo tham số Size giống khai báo khác, tham số template khai báo mặc định template //tham số thông thường template //tham số mặc định 29/8/2014 www.lhu.edu.vn Chương Template Các tham số Template template class Stack { public: Stack(); ~Stack(); void push(const T& i); void pop(T& i); bool isEmpty() const; bool isFull() const; private: static const int max; T contents[I]; int current; }; 29/8/2014 www.lhu.edu.vn Chương Template Các tham số Template template int Stack::max=I;//khởi gán biến tĩnh template Stack::Stack(){ this->current = 0;}//thiết lập template Stack::~Stack() {} //pt huỷ bỏ template void Stack::push(const T& i) { if (this->current < this->max) this->contents[this->current++]=i; else cout 0) i = this->contents[ this->current]; else coutcurrent == this->max); } 29/8/2014 www.lhu.edu.vn Chương Template Các tham số Template  Giờ ta tạo thể lớp Stack với kiểu liệu kích thước đa dạng Stack s; // Tạo Stack số nguyên kích thước Stack f; //Stack số thực kích thước 10 Stack u; // Tạo Stack kí tự kích thước 30  Lưu ý lệnh tạo thể lớp khác 29/8/2014 www.lhu.edu.vn Chương Template Các tham số Template  Các ràng buộc sử dụng kiểu thực làm tham số cho lệnh template: • Chỉ dùng kiểu số nguyên, trỏ, tham chiếu • Không gán trị cho tham số lấy địa tham số 29/8/2014 www.lhu.edu.vn [...]... 29/8/2014 www.lhu.edu.vn Chương 7 Template Class Template  Sau đó, ta có thể tạo và sử dụng các thể hiện của các lớp được định nghĩa bởi template của ta: int x = 5, y; char c = 'a', d; Stack s; Stack t; s.push(x); t.push(c); s.pop(y); t.pop(d); 29/8/2014 www.lhu.edu.vn Chương 7 Template Các tham số Template  Trong ví dụ Stack, ta có một hằng max quy định số lượng tối đa các đối tượng mà ngăn xếp... số, đối với khuôn mẫu class/struct/union, chúng phải được cung cấp tường minh myStruct p; // Sai ! myStruct q; //khai báo biến kiểu myStruct myUnion r; //khai báo biến kiểu myUnion  Tại sao đòi hỏi kiểu tường minh?  Nếu không biết các kiểu dữ liệu được sử dụng, trình biên dịch làm thế nào để biết cần cấp phát bao nhiêu bộ nhớ cho biến được tạo? 29/8/2014 www.lhu.edu.vn Chương 7 Template... nó thành một template 29/8/2014 www.lhu.edu.vn Chương 7 Template Class Template  Khai báo và định nghĩa lớp Stack cho kiểu int class Stack { public: Stack(); ~Stack(); void push(const int& i); void pop(int& i); bool isEmpty() const; bool isFull() const; private: static const int max; int contents[max]; int current; }; 29/8/2014 www.lhu.edu.vn Chương 7 Template Class Template int Stack::max=10;//khởi... (this->current == this->max); } 29/8/2014 www.lhu.edu.vn Chương 7 Template Class Template  Khai báo và định nghĩa template Stack: template class Stack { public: Stack(); ~Stack(); void push(const T& i); void pop(T& i); bool isEmpty() const; bool isFull() const; private: static const int max ; T contents[max]; int current; }; 29/8/2014 www.lhu.edu.vn Chương 7 Template Class Template template .. .Chương 7 Template Class Template  Ta cũng có thể định nghĩa template cho struct và union template //khuôn mẫu kiểu T struct myStruct { T first; T second; }; template //khuôn mẫu kiểu T và U union myUnion { T first; U second; }; 29/8/2014 www.lhu.edu.vn Chương 7 Template Class Template  Để tạo các thể hiện của template,... T, int Size=100> //tham số mặc định 29/8/2014 www.lhu.edu.vn Chương 7 Template Các tham số Template template class Stack { public: Stack(); ~Stack(); void push(const T& i); void pop(T& i); bool isEmpty() const; bool isFull() const; private: static const int max; T contents[I]; int current; }; 29/8/2014 www.lhu.edu.vn Chương 7 Template Các tham số Template template int... www.lhu.edu.vn Chương 7 Template Các tham số Template  Giờ ta có thể tạo các thể hiện của các lớp Stack với các kiểu dữ liệu và kích thước đa dạng Stack s; // Tạo Stack số nguyên kích thước 5 Stack f; //Stack số thực kích thước 10 Stack u; // Tạo Stack kí tự kích thước 30  Lưu ý rằng các lệnh trên tạo thể hiện của 3 lớp khác nhau 29/8/2014 www.lhu.edu.vn Chương 7 Template... gán biến tĩnh template Stack::Stack(){ this->current = 0;}//pt thiết lập template Stack::~Stack() {} //pt huỷ bỏ template void Stack::push(const T& i) { if (this->current < this->max) this->contents[this->current++]=i; else coutcurrent = 0;}//thiết lập template Stack::~Stack() {} //pt huỷ bỏ template void Stack::push(const T& i) { if (this->current < this->max) this->contents[this->current++]=i; else cout ... 29/8/2014 www.lhu.edu.vn Chương Template Các tham số Template  Trong ví dụ Stack, ta có max quy định số lượng tối đa đối tượng mà ngăn xếp chứa  Như vậy, thể có kích thước kiểu đối tượng chứa  Nếu... nghĩa chương trình 29/8/2014 www.lhu.edu.vn Chương Template C++ Template  Template (khuôn mẫu) chế thay mã cho phép tạo cấu trúc mà rõ kiểu liệu cụ thể  Từ khoá template dùng C++ để báo cho trình. .. thể cài đặt lớp Stack tổng quát không? 29/8/2014 www.lhu.edu.vn Chương Template Ví dụ khuôn mẫu  Sử dụng trình tiền xử lý C • Trình tiền xử lý thực thay text trước dịch • Do đó, ta dùng #define

Ngày đăng: 03/12/2015, 16:15

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan