.1| Khuôn mẫu hàm

Một phần của tài liệu Tài liệu giảng dạy kỹ thuật lập trình 2 (Trang 133 - 137)

6.1.1| KHÁI NIỆM HÀM KHÁI QUÁT

Generic Programming (lập trình khái quát) là một cách tiếp cận lập trình mà

trước hết lập trình viên định nghĩa một code chung. Đoạn code đó sẽ được thể hiện tùy theo kiểu của các tham số được truyền vào sau trong chương trình hoặc trong lúc chương trình thực thi. Hay cịn gọi là Số hóa tham số.

C++ hổ trợ generic programming thông qua Template

Template là một bản thiết kế hay một công thức chung của một lớp (class template) hay một hàm (function template). Việc sử dụng Template bao gồm sử dụng các thư việc STL, các Function Template (khn hình hàm) và Class Template (khn hình lớp).

STL (Standard Template Library) – là một thư viện chuẩn của C++ chứa các

template với những cấu trúc dữ liệu cũng như giải thuật được xây dựng tổng quát STL gồm các thành phần chính sau:

• Containers library được sử dụng để quản lý các tập hợp đối tượng của một kiểu cụ thể. Vd: array, string, vector, list, stack, queue, map, …

• Algorithms library cung cấp các thuật tốn thao tác trên dữ liệu như các phương thức thực hiện việc khởi tạo, sắp xếp, tìm kiếm trên các containers, …

• Iterator library hổ trợ việc truy cập các phần tử của container

• Numeric library gồm các hàm hổ trợ các thuật toán thực hiện một toán tử trên chuỗi sốmà vẫn tận dụng được hiệu năng và tốc độ của C.

C++ hổ trợ hai loại Template:

Function template (Khn hình hàm) là các hàm được xây dựng với những

kiểu tham số trừu tượng do đó có thể sử dụng được với nhiều kiểu dữ liệu truyền vào khác nhau.

Class Template (Khn hình lớp) là các lớp được xây dựng trong đó các thành

phần dữ liệu hoặc các hàm thành phần của lớp sử dụng các kiểu dữ liệu trừu tượng.

Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 130

Bằng cách dùng template, ta chỉ cần định nghĩa duy nhất một hàm hay một lớp sau đó dùng chung định nghĩa này cho các kiểu dữ liệu khác nhau, thay vì phải tạo ra các hàm hay các lớp riêng cho mỗi kiểu dữ liệu.

Template làm giảm đáng kể kích thước source code, đồng thời làm tăng tính linh hoạt của source code mà khơng làm giảm sự an tồn về kiểu dữ liệu

Khi chương trình có nhu cầu sử dụng kiểu dữ liệu cụ thể thì trình biên dịch sẽ tự động biên dịch những thể hiện thích hợp nhất.

Template tạo ra các hàm, lớp hồn tồn giống nhau về mơ hình xử lý, chỉ khác về kiểu dữ liệu

Để khai báo tổng quát mẫu hàm chúng ta khai báo cú pháp như sau:

template <class T>

return_type function_name (Type arg1, Type arg2, …)

{

// body of function }

• Lưu ý: từ khóa class có thể thay bằng typename. • T: naming convention (any data types)

Trong cú pháp ở trên, các từ template, class là từ khóa, các từ khóa chúng ta phải áp dụng theo đúng cú pháp. T khơng phải là một từ khóa mà là một tên riêng thể hiện cho một kiểu dữ liệu tổng quát. Chúng ta có thể đặt tên tùy ý khác mà khơng vi phạm quy ước đặt tên.

Các mẫu hàm được tổng quát hóa dữ liệu, chúng ta có thể gọi hàm thực hiện bình thường như các hàm thông thường.

Vi dụ 1: sau đây minh họa việc sử dụng hàm mẫu để hoán vị 2 số, ký tự

template <class T> void Hoanvi (T &a, T&b) {

T tam =a; a=b; b=tam;

Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 131

}

Chúng ta có thể gọi Hoanvi trong ví dụ 1, chúng ta gọi như sau:

int a=5, b=7; float x=3.5, y=3.7; char c1=’A’, c2=’B’; Hoanvi(a,b); Hoanvi(x,y); Hoanvi(c1,c2);

Khi đó các hàm Hoanvi() với các dữ liệu tương ứng sẽ được phát sinh ngầm bên dưới và được gọi thực thi phù hợp.

Đối với hàm Hoanvi(a,b), thì kiểu T được thay thế bằng kiểu int và hàm Hoanvi<int>(int &, int&) sẽ được sử dụng.

Đối với hàm Hoanvi(x,y), thì kiểu T được thay thế bằng kiểu float và hàm

Hoanvi<float>(float &, float&) sẽ được sử dụng.

Đối với hàm Hoanvi(c1,2), thì kiểu T được thay thế bằng kiểu char và hàm

Hoanvi<char>(char &, char&) sẽ được sử dụng.

Trong trường hợp hàm khái quát có nhiều hơn một kiểu dữ liệu, chúng ta sẽ cài đặt theo cú pháp sau:

template< class T, class U>

<Kiểu trả về> Tên hàm (T x, U y) {

// nội dung của hàm }

Các biến x có kiểu T và y có kiểu U chỉ mang tính minh họa.

6.1.2| GỌI HÀM KHÁI QUÁT

Xét ví dụ 1 trên xây dựng hàm chính để gọi hàm mẫu thực hiện với các kiểu dữ liệu khác nhau.

Ví dụ hốn đổi 2 biến số nguyên, hoán đổi 2 biến số thực, hoán vị 2 ký tự

template<class T>

void Hoanvi(T &a, T &b) {

T tam; tam = a; a=b;

Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 132 b=tam; } // gọi hàm sử dụng trong hàm chính void main() { int a=5, b=7; float c=6, d=10; char c1= ‘A’, c2=’B’; // gọi mẫu hàm thực hiện // hoan vi 2 số nguyên Hoanvi(a,b); // hoan vi 2 số thực Hoanvi(c,d); // hoán vị 2 ký tự Hoanvi(c1,c2); } 6.1.3| CHỒNG HÀM KHÁI QT

Chồng hàm khái qt đều có tính chất của một hàm thơng thường, nó cũng cho chúng ta nạp chồng hàm mẫu

Xét ví dụ 2: Hốn đổi số nguyên, số thực, ký tự, nhưng chúng ta hoán đổi 2 chuỗi ký tự. Như vậy chúng ta có thể nạp chồng mẫu hàm để hoán đổi được 2 chuỗi ký tự.

#include<iostream> using namespace std; // định nghĩa mẫu hàm template<class T> void Hoanvi(T &a, T&b)

{ T tam= a; a=b; b=tam; } // hàm hoán vị 2 chuỗi ký tự

void Hoanvi(char a[], char b[]) // nạp chồng hàm Hoanvi

{ char tam[100]; strcpy(tam,a); strcpy(a,b); strcpy(b, tam); } // hàm chính void main() { int i=20, j=30;

Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 133 float x=20.15, y= 30.5;

cout<< "i ="<<i<<", j="<<j <<endl;

cout<< "Name1 ="<<Name1<<", Name2="<<Name2 <<endl;

// gọi mẫu hàm

Hoanvi(i,j); // Hoán đổi 2 số nguyên Hoanvi(Name1,Name2); // Hoán đổi 2 chuỗi

// Xuất kết quả

cout<<"Sau khi goi ham: "<<endl; cout<< "i ="<<i<<", j="<<j <<endl;

cout<< "Name1 ="<<Name1<<", Name2="<<Name2 <<endl; system("pause");

}

Một phần của tài liệu Tài liệu giảng dạy kỹ thuật lập trình 2 (Trang 133 - 137)

Tải bản đầy đủ (PDF)

(143 trang)