intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Bài giảng Ngôn ngữ lập trình C và C++ (Phần 2: Ngôn ngữ lập trình C++) - Chương 6: Mẫu (template)

Chia sẻ: Đinh Gấu | Ngày: | Loại File: PPT | Số trang:27

86
lượt xem
4
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Nối tiếp nội dung của chương 5 "Bài giảng Ngôn ngữ lập trình C và C++", chương 6 trình bày các nội dung: Khái niệm về mẫu hàm, mẫu hàm, mẫu lớp, tạo mẫu hàm. Mời các bạn cùng tham khảo nội dung chi tiết.

Chủ đề:
Lưu

Nội dung Text: Bài giảng Ngôn ngữ lập trình C và C++ (Phần 2: Ngôn ngữ lập trình C++) - Chương 6: Mẫu (template)

  1. Phần 2: Ngôn ngữ lập trình C++ Chương 6: Mẫu (template)
  2. Các nội dung chính 1. Giới thiệu 2. Mẫu hàm 3. Mẫu lớp 2
  3. 1. Giới thiệu  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, 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  Nó có thể dùng để thay thế cho việc định nghĩa chồng hàm  Trong C++, các thành phần mà ta có thể tạo Mẫu là Hàm và Lớp 3
  4. 2. Mẫu hàm  Khái niệm mẫu hàm  Tạo mẫu hàm  Sử dụng mẫu hàm 4
  5. Khái niệm mẫu hàm  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 template int int i,i,j;j;char char a,b; a,b; void void swap swap(T (T&x, &x,TT&y){ &y){ float float x,x,y;y; TT zz==x;x; swap(i, swap(i,j); j); xx==y;y; swap(a, swap(a,b); b); y= y=z;z; swap(x, swap(x,y); y); }} 5
  6. Tạo một mẫu hàm  Cú pháp Khai báo tên mẫu  Một mẫu hàm có thể sử dụng một template template void void swap1(T swap1(T&x,&x,TT&y){ &y){ hoặc nhiều tên TT zz==x;x; mẫu xx==y;y; y= y=z;z; }} Tên mẫu sẽ được sử dụng trongphần đầu và/hoặc trong thân hàm 6
  7. Tạo một mẫu hàm  Mẫu hàm có hai tên mẫu template template void void swap2 swap2(T (T&x, &x,UU&y){ &y){ TT zz==x;x; xx==(T) (T)y;y; y= y=(U) (U)z;z; }} 7
  8. Sử dụng mẫu hàm  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. 8
  9. Ví dụ áp dụng mẫu hàm 9. 9. int intmain(int main(intargc, argc,char* char*argv[]) argv[]){{ 1. 1. #include #include 10. 10. int inti=20,j=30; i=20,j=30; 2. 2. using usingnamespace namespacestd; std; 11. 11. char charc1='A',c2='B'; c1='A',c2='B'; 12. 12. float floatx=20.15, x=20.15,y=35.5; y=35.5; 3. 3. //Định //Địnhnghĩa nghĩamẫu mẫuhàm hàm 13. 13. //Gọi //Gọimẫu mẫuhàm hàm 4. 4. template template 14. 14. swap1(i,j); swap1(i,j); 5. 5. void voidswap1(T swap1(T&a,T &a,T&b) &b){{ 15. 15. swap1(c1,c2); swap1(c1,c2); 6. 6. TTc; c; 16. 16. swap1(x,y); swap1(x,y); 7. 7. c=a; c=a;a=b; a=b;b=c; b=c; 17. 17. cout
  10. Ví dụ áp dụng mẫu hàm  Kết quả chạy chương trình trên Output i=30 i=30 j=20 j=20 c1=B c1=B c2=A c2=A x=35.5 x=35.5 y=20.15 y=20.15 10
  11. Mẫu hàm và sự chồng hàm  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. 11
  12. 1. 1. #include #include 2. 2. #include #include 3. 3. using usingnamespace namespacestd; std; 15. 15.int intmain(int main(intargc, argc,char char**argv) **argv) 16. 16.{{ 4. 4. //Định //Địnhnghĩa nghĩamẫu mẫuhàm hàm 17. 17. intinti=10,j=20; i=10,j=20; 5. 5. template template 18. 18. swap1(i,j); swap1(i,j); 6. 6. void voidswap1(T swap1(T&a,T &a,T&b) &b){{ 19. 19. cout
  13. Kết quả chạy chương trình Output i=20; i=20; j=10 j=10 Name Name 1: 1: Mission Mission Impossible Impossible Name Name 2: 2: Gone Gone With With The The Wind Wind 13
  14. 3. Mẫu lớp  Khái niệm mẫu lớp  Tạo mẫu lớp  Sử dụng mẫu lớp 14
  15. Khái niệm mẫu lớp  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 template class class StackStack{{ typedef typedef Stack StackIntStack; IntStack; Stack() Stack(); ; typedef typedef Stack StackFloatStack; FloatStack; ~Stack() ~Stack(); ; typedef typedef Stack StackStringStack; StringStack; int intpush(const push(constT& T&x); x); int intpop(T& pop(T&x) x); ; IntStack IntStack s1; s1; int intisEmpty() isEmpty()const; const; FloatStack FloatStacks2; s2; int intisFull() isFull()const; const; };}; 15
  16. Tạo mẫu lớp  Cú pháp: Khai báo tên mẫu template template class class Stack Stack{{ Stack() Stack(); ; ~Stack() ~Stack(); ; int intpush(const push(constT&); T&); int intpop(T&) pop(T&); ; T* T*top; top; };}; 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 16
  17. Sử dụng mẫu lớp  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.  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) 17
  18. 2 cách sử dụng mẫu lớp typedef typedef Stack StackIntStack; IntStack; Cách 1: typedef typedef Stack StackFloatStack; FloatStack; tường minh IntStack IntStack s1; s1; FloatStack FloatStacks2; s2; Cách 2: Stack Stack s1; s1; ngầm định Stack Stack s2; s2; 18
  19. Ví dụ áp dụng: xây dựng mẫu lớp Stack, tệp Stack.h //stack.h //stack.h 1.1. #pragma #pragmaonceonce 2.2. template template 3.3. class classStack Stack 4.4. {{ 5.5. public: public: 6.6. Stack(unsigned Stack(unsignedint intmsize=10) msize=10);; 7.7. ~Stack() ~Stack(){{delete delete[][]top top;;}} 8.8. int intpush(const push(constT&); T&); 9.9. TTpop() pop();; ////pop popan anelement elementoffoffthe thestack stack 10. 10. int intisEmpty()const isEmpty()const{{return returnsize size====00;;}} 11. 11. int intisFull() isFull()const const{{return returnsize size== ==maxsize maxsize;;}} 12. 12.private: private: 13. 13. int intsize size;; ////Number Numberof ofelements elementson onStack Stack 14. 14. int intmaxsize; maxsize; 15. 15. T* T*top top;; 16. 16.}};; 19
  20. Tệp Stack.h //stack.h //stack.h(tiếp) (tiếp) 17.//constructor 17.//constructorwith withthe thedefault defaultsize size10 10 18.template 18.template 19.Stack::Stack(unsigned 19.Stack::Stack(unsignedint intmsize) msize) 20.{ 20.{ 21. 21. size size==0; 0; 22. 22. maxsize=msize; maxsize=msize; 23. 23. top top==msize>0?(new msize>0?(newT[msize]):NULL; T[msize]):NULL; 24.} 24.} 20
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
13=>1