You are on page 1of 24

LẬP TRÌNH HƯỚNG ĐỐI

TƯỢNG VỚI C++

1
Chương 6:
Khuôn hình
1. Khuôn hình hàm
2. Khuôn hình lớp

2
Chương 6: Khuôn hình

1. Khuôn hình hàm

a. Khái niệm
Khuôn hình hàm là những hàm được xây
dựng với các tham số hình thức có kiểu
trừu tượng.

3
Chương 6: Khuôn hình

b. Định nghĩa khuôn hình hàm


Cú pháp:
template <Tham số hình thức
khuôn hình>
<Định nghĩa hàm>
Tham số hình thức khuôn hình trong
khuôn hình hàm có dạng là tham số
hình thức kiểu, nó đại diện cho một kiểu
dữ liệu trừu tượng.

4
Chương 6: Khuôn hình

c. Sử dụng khuôn hình hàm


Khuôn hình hàm được sử dụng như một
hàm thông thường. Khi thực hiện, dựa
trên kiểu dữ liệu của các tham số thực
truyền vào hàm, CT dịch sẽ tạo ra một
hàm thể hiện tương ứng.

5
Chương 6: Khuôn hình

Ví dụ: Khuôn hình hàm min() tìm số nhỏ


nhất trong hai số
template <class T> //T là đối số kiểu
T Min(T a, T b) { return (a < b ? a : b); }
void main() {
int a = 4, b = 12; double x = 2.5, y = 3.25;
char q = ‘H’, r = ‘W’; char *t = “AH”, *u = “CD”;
cout << Min(a, b) <<“\n”; /*Hàm thể hiện
int Min(int, int)*/
cout << Min(x, y) <<“\n”; /*Hàm thể hiện
double Min(double, double)*/
cout << Min(q, r) <<“\n”; /*Hàm thể hiện
char Min(char, char)*/
cout << Min(t, u) <<“\n”; /*Hàm thể hiện
char* Min(char*, char*)*/
} 6
Chương 6: Khuôn hình

d. Cụ thể hóa một hàm thể hiện


Trong một số trường hợp cấu trúc xử lý
của khuôn hình hàm không phù hợp với
một số kiểu dữ liệu đặc biệt. Khi đó, C++
hỗ trợ cách cụ thể hóa những hàm thể
hiện tương ứng với kiểu dữ liệu đặc biệt
đó.

7
Chương 6: Khuôn hình

Ví dụ :
/*Cụ thể hóa hàm thể hiện char* Min(char *, char *) trong
khuôn hình Min()*/
char *Min(char *s1, char *s2) {
cout << “Goi char* Min(char *, char *)\n”;
if(strcmp(s1, s2) < 0)
return s1;
else return s2;
}
void main() {
<Giong vi du tren>
}

8
Chương 6: Khuôn hình

e. Định nghĩa chồng khuôn hình hàm


Ví dụ:
//Khuôn hình hàm Min() cho hai số
template <class T> T Min(T a, T b) {
return (a<b?a:b); }
//Khuôn hình hàm Min() cho ba số
template <class T> T Min(T a, T b, T c) {
return Min(Min(a, b), c); }
//Khuôn hình hàm Min() cho một dãy số
template <class T> T Min(T *a, int n) {
T ret = a[0];
for(int i = 1; i < n; i++)
if(ret > a[i]) ret = a[i];
return ret;
}
9
Chương 6: Khuôn hình

void main() {
int a = 12, b = 15, c = 2;
double x = 3.5, y = 4.25, z = 0.25;
int t[5] = {2, 3, 4, -1, 21};
char u[4] = {‘w’, ‘q’, ‘r’, q’};
cout << Min(a, b) << “\n”; //int Min(int, int)
cout << Min(a, b, c) << “\n”; //int Min(int, int, int)
cout << Min(x, y) << “\n”; /*double Min(double,
double)*/
cout << Min(x, y, z) << “\n”; /* double Min(double,
double, double)*/
cout << Min(t, 5) << “\n”; //int Min(int*, int)
cout << Min(u, 4) << “\n”; //char Min(char *, int)
}
10
Chương 6: Khuôn hình

Khuôn hình cấu trúc


template <typename T>
struct <Tên cấu trúc>
{
//thành phần dữ liệu
};

11
Chương 6: Khuôn hình

Khuôn hình cấu trúc: Mảng 1 chiều


template <typename T>
struct MANG
{
T a[50];
int n;
};

12
Chương 6: Khuôn hình

Khuôn hình cấu trúc: Mảng 1 chiều


template <typename T> template <typename T>
void Nhap(MANG<T> &ma) void Xuat(MANG<T> ma)
{ {
cout << "nhap vao so luong phan tu:"; for (int i = 0; i < ma.n; ++i)
cin >> ma.n; cout << ma.a[ i ] << " ";
}
for (int i = 0; i < ma.n; ++i)
{
cout << "Nhap phan tu thu " << i << ":";
cin >> ma.a[ i ];
}
}

13
Chương 6: Khuôn hình

Khuôn hình cấu trúc: Mảng 1 chiều


void main()
{
MANG<int> a1;
Nhap(a1);
Xuat(a1);

MANG<float> a2;
Nhap(a2);
Xuat(a2);
}

14
Chương 6: Khuôn hình

2. Khuôn hình lớp


a. Khái niệm
Khuôn hình lớp là những lớp được xây
dựng mà 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.

15
Chương 6: Khuôn hình

b. Định nghĩa khuôn hình lớp


Cú pháp:
template <Đối số khuôn hình>
<Định nghĩa lớp>
Đối số khuôn hình có hai dạng đối số
kiểu và đối số biểu thức.
• Đối số kiểu đại diện cho một kiểu dữ liệu
trừu tượng.
• Đối số biểu thức được sử dụng để tạo ra
những lớp thể hiện linh động hơn, giá trị
truyền vào cho chúng phải là hằng số. 16
Chương 6: Khuôn hình

c. Sử dụng khuôn hình lớp


Khi khai báo các đối tượng thuộc lớp thể
hiện của một khuôn hình lớp, cần phải
chỉ rõ những kiểu dữ liệu cụ thể nào
tương ứng với tham số hình thức kiểu
hoặc hằng số nào tương ứng với tham
số hình thức biểu thức.

17
Chương 6: Khuôn hình

Ví dụ 1:
template <class T> //T là đối số kiểu
class Diem {
private:
T x, y;
public:
Diem(T xx = 0, T yy = 0);
void Xuat();
};
template <class T>
Diem<T>::Diem(T xx, T yy) {
x = xx; y = yy;
}

18
Chương 6: Khuôn hình

template <class T>


void Diem<T>::Xuat() {
cout << “Toa do:”<< x << “ “ << y << “\n”;
}
void main() {
Diem<int> a(3, 5); /*Diem <int> là một lớp thể hiện
của khuôn hình lớp*/
a.Xuat();
Diem<char> b(‘w’, ‘r’); /*Diem <char> là một lớp thể
hiện của khuôn hình lớp*/
b.Xuat();
Diem<double> c(3.5, 2.3); /*Diem <double> là một
lớp thể hiện của khuôn hình lớp*/
c.Xuat();
}

19
Chương 6: Khuôn hình

Ví dụ 2:
template <class T, int n> /*T là đối số kiểu, n là đối số
biểu thức*/
class Vector {
private:
T a[n];
public:
void Nhap();
void Xuat();
};
void main() {
Vector<int, 10> u; /*Vector <int,10> là một lớp thể
hiện của khuôn hình lớp*/
u.Nhap();
u.Xuat();
}
20
Chương 6: Khuôn hình

template <class T, int n>


void Vector<T, n>::Nhap() {
for(int i = 0; i < n; i++) {
cout << “Toa do thu “ << i << “:”;
cin >> a[i];
}
}
template <class T, int n>
void Vector<T, n>::Xuat() {
for(int i = 0; i < n; i++)
cout << a[i] << “\t”;
cout << “\n”;
}
21
Chương 6: Khuôn hình

d. Cụ thể hóa các hàm thành phần trong


một khuôn hình lớp
Đôi khi mô hình xử lý của một khuôn
hình lớp đòi hỏi phải được xây dựng một
cách đặc biệt đối với một số tham số
hình thức kiểu. Khi đó, C++ hỗ trợ cách
cụ thể hóa những hàm thành phần trong
lớp thể hiện tương ứng.

22
Chương 6: Khuôn hình

Ví dụ:
template <class T> //T là đối số kiểu
class Diem {
private:
T x, y;
public:
Diem(T xx = 0, T yy = 0);
void Xuat();
};
/*Cụ thể hóa hàm thành phần Xuat() trong lớp thể hiện
Diem<char>*/
void Diem<char>::Xuat()
{
cout << “Goi hàm Diem<char>::Xuat()\n”;
cout << (int)x << “,” << (int)y << “\n”;
}
23
Chương 6: Khuôn hình

24

You might also like