Ngôn ngữ lập trình - Chương 6 (HUST)

LI
lienhejb
0 次下载
27
0

资料内容

第 1 页

goupee.vn goupee.com Phần 2: Ngôn ngữ lập trình C++ Chương 6: Mẫu (template) cuu duong than cong . com fb.com/goupee.vn CuuDuongThanCong.com https://fb.com/tailieudientucntt

第 2 页

goupee.vnCác nội dung chính goupee.com 1. Giới thiệu 2. Mẫu hàm 3. Mẫu lớp cuu duong than cong . com fb.com/goupee.vn 2 CuuDuongThanCong.com https://fb.com/tailieudientucntt

第 3 页

goupee.vn1. Giới thiệu goupee.com  Khái niệm Mẫu (template):  Là một kỹ thuật cho phép một thành phần chỉ cần được định nghĩa một lần hoặc một số ít lần, nhưng có thể được sử dụng lại nhiều lần cho nhiều đối tượng khác  Là kỹ thuật cho phép tham số hóa kiểu dữ liệu; như cho phép định nghĩa cấu trúc Stack<T>, với T là tham số kiểu, đại diện cho kiểu DL của các phần tử của Stack. Sau đó T có thể được thay thế bằng một kiểu DL cụ thể, ví dụ int, và C++ sẽ tự động tạo ra code để định nghĩa Stack<int>  Nó có thể dùng để thay thế cho việc định nghĩa chồng hàmcuu duong than cong . com  Trong C++, các thành phần mà ta có thể tạo Mẫu là Hàm và Lớp fb.com/goupee.vn 3 CuuDuongThanCong.com https://fb.com/tailieudientucntt

第 4 页

goupee.vn2. Mẫu hàm goupee.com  Khái niệm mẫu hàm  Tạo mẫu hàm  Sử dụng mẫu hàm cuu duong than cong . com fb.com/goupee.vn 4 CuuDuongThanCong.com https://fb.com/tailieudientucntt

第 5 页

goupee.vnKhái niệm mẫu hàm goupee.com  Là hàm mà khi định nghĩa có sử dụng một hoặc nhiều mẫu  Mẫu hàm được dùng để cho phép định nghĩa hàm một lần, nhưng có thể được gọi nhiều lần với tham số là các kiểu dữ liệu khác nhau template <class T> int i, j; char a,b; void swap (T &x, T &y){ float x, y; T z = x; cuu duong than cong . comswap(i, j); x = y; swap(a, b); y= z; swap(x, y); } fb.com/goupee.vn 5 CuuDuongThanCong.com https://fb.com/tailieudientucntt

第 6 页

goupee.vnTạo một mẫu hàm goupee.com  Cú pháp Khai báo Một mẫu hàm có tên mẫu  thể sử dụng một template <class T> hoặc nhiều tên void swap1(T &x, T &y){ T z = x; mẫu x = y; y= z; } cuu duong than cong . comTên mẫu sẽ được sử dụng trongphần đầu và/hoặc trong thân hàm fb.com/goupee.vn 6 CuuDuongThanCong.com https://fb.com/tailieudientucntt

第 7 页

goupee.vnTạo một mẫu hàm goupee.com  Mẫu hàm có hai tên mẫu template <class T, class U> void swap2 (T &x, U &y){ T z = x; x = (T) y; y= (U) z; } cuu duong than cong . com fb.com/goupee.vn 7 CuuDuongThanCong.com https://fb.com/tailieudientucntt

第 8 页

goupee.vnSử dụng mẫu hàm goupee.com  Việc gọi mẫu hàm cũng giống như gọi hàm thông thường. Hàm được gọi này, khi đó được gọi là hàm thể hiện  Khi gọi hàm mẫu, thì tùy theo kiểu dữ liệu của hàm thể hiện, mà chương trình dịch sẽ tự động tạo ra định nghĩa phù hợp cho hàm này. cuu duong than cong . com fb.com/goupee.vn 8 CuuDuongThanCong.com https://fb.com/tailieudientucntt

第 9 页

goupee.vnVí dụ áp dụng mẫu hàm goupee.com 9. int main(int argc, char* argv[]) { 1. #include <iostream> 10. int i=20,j=30; 2. using namespace std; 11. char c1='A',c2='B'; 12. float x=20.15, y=35.5; 3. //Định nghĩa mẫu hàm 13. //Gọi mẫu hàm 4. template <class T> 14. swap1(i,j); 5. void swap1(T &a,T &b) { 15. swap1(c1,c2); 6. T c; 16. swap1(x,y); 7. c=a; a=b; b=c; 17. cout<<"i="<<i<<" j="<<j<<endl; 8. } 18. cout<<"c1="<<c1<<" c2="<<c2<<endl; cuu duong than cong . com19. cout<<"x="<<x<<" y="<<y<<endl; 20. return 0; 21. } fb.com/goupee.vn 9 CuuDuongThanCong.com https://fb.com/tailieudientucntt

第 10 页

goupee.vnVí dụ áp dụng mẫu hàm goupee.com  Kết quả chạy chương trình trên Output i=30 j=20 c1=B c2=A x=35.5 y=20.15 cuu duong than cong . com fb.com/goupee.vn 10 CuuDuongThanCong.com https://fb.com/tailieudientucntt

第 11 页

goupee.vnMẫu hàm và sự chồng hàm goupee.com  Mẫu hàm là một công cụ hỗ trợ cho việc chồng hàm, chứ không hoàn toàn thay thế được cho chồng hàm  Ví dụ hàm swap1 ở trên không thực hiện được việc hoán đổi 2 chuỗi ký tự, khi đó ta phải chồng hàm này. cuu duong than cong . com fb.com/goupee.vn 11 CuuDuongThanCong.com https://fb.com/tailieudientucntt

第 12 页

goupee.vn goupee.com 1. #include <string.h> 2. #include <iostream> 3. using namespace std; 15. int main(int argc, char **argv) 16. { 4. //Định nghĩa mẫu hàm 17. int i=10,j=20; 5. template <class T> 18. swap1(i,j); 6. void swap1(T &a,T &b) { 19. cout<<"i="<<i<<"; j="<<j<<endl; 7. T c; 20. char name1[]="Gone With The Wind"; 8. c=a; a=b; b=c; 21. char name2[]="Mission Impossible"; 9. } 9. void swap1(char a[], char 22. swap1(name1,name2); 23. cout<<"Name 1:"<<name1<<endl; b[]){ 24. cout<<"Name 2:"<<name2; 10. char st[1000]; 25. return 0; 11.12. strcpy(st,a);strcpy(a,b); cuu duong than cong . com26. } 13. strcpy(b,st); 14. } fb.com/goupee.vn 12 CuuDuongThanCong.com https://fb.com/tailieudientucntt

第 13 页

goupee.vnKết quả chạy chương trình goupee.com Output i=20; j=10 Name 1: Mission Impossible Name 2: Gone With The Wind cuu duong than cong . com fb.com/goupee.vn 13 CuuDuongThanCong.com https://fb.com/tailieudientucntt

第 14 页

goupee.vn3. Mẫu lớp goupee.com  Khái niệm mẫu lớp  Tạo mẫu lớp  Sử dụng mẫu lớp cuu duong than cong . com fb.com/goupee.vn 14 CuuDuongThanCong.com https://fb.com/tailieudientucntt

第 15 页

goupee.vnKhái niệm mẫu lớp goupee.com  Là lớp mà khi định nghĩa có sử dụng một hoặc nhiều mẫu  Mẫu lớp được dùng để cho phép định nghĩa lớp một lần, nhưng có thể tạo ra nhiều lớp khác nhau với tham số là các kiểu dữ liệu khác nhau template <class T> class Stack { typedef Stack<int> IntStack; Stack() ; typedef Stack<float> FloatStack; ~Stack() ; typedef Stack<string> StringStack; int push(const T& x);cuu duong than cong . com int pop(T& x) ; IntStack s1; int isEmpty() const; FloatStack s2; int isFull() const; }; fb.com/goupee.vn 15 CuuDuongThanCong.com https://fb.com/tailieudientucntt

第 16 页

goupee.vnTạo mẫu lớp goupee.com  Cú pháp: Khai báo tên mẫu template <class T> class Stack { Stack() ; ~Stack() ; int push(const T&); int pop(T&) ; T* top; }; cuu duong than cong . com Tên mẫu sẽ được sử dụng trong thân lớp cho các thành phần dữ liệu và các hàm thành viên fb.com/goupee.vn 16 CuuDuongThanCong.com https://fb.com/tailieudientucntt

第 17 页

goupee.vnSử dụng mẫu lớp goupee.com  Lớp thể hiện: là lớp được tạo ra từ mẫu lớp với các mẫu được thay thế bằng các kiểu dữ liệu cụ thể  Có 2 cách để tạo ra lớp thể hiện:  Cách 1: định nghĩa tường minh một lớp thể hiện cho một kiểu dữ liệu cụ thể từ mẫu lớp (với từ khóa typedef), rồi sau đó khai báo các đối tượng thuộc lớp thể hiện này.cuu duong than cong . com  Cách 2: Khai báo luôn các đối tượng thuộc lớp thể hiện ngầm định (không tường minh) fb.com/goupee.vn 17 CuuDuongThanCong.com https://fb.com/tailieudientucntt

第 18 页

goupee.vn2 cách sử dụng mẫu lớp goupee.com typedef Stack<int> IntStack; Cách 1: typedef Stack<float> FloatStack; tường minh IntStack s1; FloatStack s2; Cách 2: Stack<int> s1; ngầm định Stack<float> s2; cuu duong than cong . com fb.com/goupee.vn 18 CuuDuongThanCong.com https://fb.com/tailieudientucntt

第 19 页

goupee.vnVí dụ áp dụng: xây dựng mẫu lớp Stack, tệpgoupee.com Stack.h //stack.h 1. #pragma once 2. template <class T> 3. class Stack 4. { 5. public: 6. Stack(unsigned int msize=10) ; 7. ~Stack() { delete [] top ; } 8. int push(const T&); 9. T pop() ; // pop an element off the stack 10. int isEmpty()const { return size == 0 ; } 11. int isFull() const { return size == maxsize ; } 12. private: 13. int size ; // Number of elements on Stackcuu duong than cong . com 14. int maxsize; 15. T* top ; 16. } ; fb.com/goupee.vn 19 CuuDuongThanCong.com https://fb.com/tailieudientucntt

第 20 页

goupee.vnTệp Stack.h goupee.com //stack.h (tiếp) 17. //constructor with the default size 10 18. template <class T> 19. Stack<T>::Stack(unsigned int msize) 20. { 21. size = 0; 22. maxsize=msize; 23. top = msize>0?(new T[msize]):NULL; 24. } cuu duong than cong . com fb.com/goupee.vn 20 CuuDuongThanCong.com https://fb.com/tailieudientucntt

显示前 20 页。下载资料查看完整内容。

评论 (0)

登录 以加入讨论

暂无评论。快来抢沙发吧!