Danh mục

Kỹ thuật lập trình C/C++-Chương: Lập trình khái quát với hàm

Số trang: 19      Loại file: pdf      Dung lượng: 223.00 KB      Lượt xem: 9      Lượt tải: 0    
Hoai.2512

Hỗ trợ phí lưu trữ khi tải xuống: 14,000 VND Tải xuống file đầy đủ (19 trang) 0
Xem trước 2 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

Đôi khi ta muốn viết một lầnnhưng có thể tạo ra các hàm với tham số thuộc nhiều kiểu khác nhau, thay vì phải viết chồng nhiều hàm tương tự nhau.Khuôn mẫu hàm (function template): là khái niệm giúp định nghĩa những hàm mà chưa xác định kiểu của các tham số.Có thể hiểu là viết gộp chung các hàm chồng giống nhau về mặt thuật toán.Kiểu của các tham số là tham số của khuôn mẫu
Nội dung trích xuất từ tài liệu:
Kỹ thuật lập trình C/C++-Chương:Lập trình khái quát với hàm Lập trình khái quát với hàm (function templates) EE3490: Kỹ thuật lập trình – HK1 2011/20121 Đào Trung Kiên – ĐH Bách khoa Hà NộiKhái niệm Đôi khi ta muốn viết một lần nhưng có thể tạo ra các hàm với tham số thuộc nhiều kiểu khác nhau, thay vì phải viết chồng nhiều hàm tương tự nhau int max(int a, int b) { return a>b ? b:a; }  double max(double a, double b) { return a>b ? b:a; } float max(float a, float b) { return a>b ? b:a; }  lập trình ở mức độ khái quát cao hơn: coi kiểu của biến cũng là tham số (type parameterization) Khuôn mẫu hàm (function template): là khái niệm giúp định nghĩa những hàm mà chưa xác định kiểu của các tham số Có thể hiểu là viết gộp chung các hàm chồng giống nhau về mặt  thuật toán Kiểu của các tham số là tham số của khuôn mẫu  EE3490: Kỹ thuật lập trình – HK1 2011/2012 2 Đào Trung Kiên – ĐH Bách khoa Hà NộiĐịnh nghĩa hàm khái quát Ví dụ 1: template  void swap(T& a, T& b) { T c = a; a = b; b = c; } T được giả định là kiểu của các tham số a, b và biến c  T sẽ được xác định khi gọi hàm  T là tham số của khuôn mẫu, trong khi a, b là tham số của hàm  Ví dụ 2: template  void push(Containter& s, Object o) {...} Có thể dùng từ khoá “typename” thay vì “class” template  void swap(T& a, T& b) {...} EE3490: Kỹ thuật lập trình – HK1 2011/2012 3 Đào Trung Kiên – ĐH Bách khoa Hà NộiGọi hàm khái quát Gọi với kiểu tường minh: max(a, b);  max(x, y); swap(s1, s2); swap(p1, p2); push(l, st); Gọi với kiểu ngầm định: int a, b;  double x, y; b); //  max(a, b); max(a, y); //  max(x, y); max(x, x); //  lỗi max(a, EE3490: Kỹ thuật lập trình – HK1 2011/2012 4 Đào Trung Kiên – ĐH Bách khoa Hà NộiChồng hàm khái quát Các khuôn mẫu hàm cũng có thể được định nghĩa chồng template T max(T a, T b) { ... }  template T max(T a, T b, T c) { ... } template T max(T* arr, int n) { ... } Gọi hàm chồng max(10, 20);  max(c, f); max(1.5, 2.1, 3.14); max(1un34k, 6); EE3490: Kỹ thuật lập trình – HK1 2011/2012 5 Đào Trung Kiên – ĐH Bách khoa Hà NộiCá biệt hoá hàm khái quát Có thể định nghĩa các phiên bản cho trường hợp riêng của một hàm khái quát template T max(T a, T b) {  return a>b ? b:a; } template std::string max(std::string s1, std::string s2) { return s1.compare(s2) == 1 ? s1:s2; } Cá biệt hoá không hoàn toàn template  void push(Containter& s, Object o) {...} template void push(Stack& s, Object o) { ... } EE3490: Kỹ thuật lập trình – HK1 2011/2012 6 Đào Trung Kiên – ĐH Bách khoa Hà NộiKhông chỉ khái quát hoá kiểu của tham số… Khái quát hoá kiểu trả về template  Product makeProd(Worker& w) { w.work(); return w.getResult(); } Khái quát hoá kiểu của biến cục bộ template  void forEach(const List& l) { Iterator i = l.first(); for (; i!=l.last(); i = i.next()) doSmth(i.get()); } EE3490: Kỹ thuật lập trình – HK1 2011/2012 7 Đào Trung Kiên – ĐH Bách khoa Hà NộiTham số của khuôn mẫu không chỉ là kiểu... Có thể là các giá trị  sử dụng giá trị đó như hằng template  Object* makeArray() { return new Object[N]; } string* p1 = makeArray(); Si ...

Tài liệu được xem nhiều: