Tải bản đầy đủ (.pdf) (13 trang)

Khuôn hình (template)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (148.29 KB, 13 trang )


292



Chương 9
KHUÔN HÌNH (TEMPLATE)

§
1. KHUÔN HÌNH HÀM
1.1. Khái niệm khuôn hình hàm
Xét hàm max(x,y) ñể tính max của hai ñối. Rõ ràng x và y có thể có bất kỳ kiểu
nào (kiểu chuẩn của C
++
, kiểu cấu trúc, kiểu hợp hoặc kiểu ñối tượng) miễn sao
chúng có một thứ tự nào ñấy.
Nếu không dùng khuôn hình, thì cần xây dựng nhiều hàm (ñược ñịnh nghĩa
chồng) ứng với các kiểu khác nhau của x và y.
Với khuôn hình, ta có thể ñịnh nghĩa một mẫu cho một họ các hàm tương ứng,
bằng cách xem kiểu dữ liệu như một tham số (ñối).
1.2. Khai báo khuôn hình hàm
Các ñối ứng với các kiểu dữ liệu ñược khai báo như sau:
template <class T1, class T2, ...., class Tm>
Chú ý:
+ Khuôn hình hàm trong ñó có sử dụng các ñối T1, T2,...,Tm phải ñược viết ngay
sau dòng khai báo nói trên.
+ Các ñối T1, T2,...,Tm là ñối của chỉ khuôn hình hàm này.
1.3. Cách xây dựng khuôn hình hàm
Các khuôn hình hàm ñược xây dựng sau khai báo các ñối như trong 1.2. Nội dung
một khuôn hình hàm cũng giống như một hàm thông thường, ngoại trừ một ñiều: các
kiểu dữ liệu cụ thể ñược thay bằng các ñối khai báo ở trên.


Ví dụ khuôn hình hàm max ñược xây dựng như sau:
template <class T>
T max(T x, T y)
{
return (x>y) ? x : y ;
}
1.4. Cách sử dụng khuôn hình hàm
Khuôn hình hàm ñươc sử dụng thông qua lời gọi hàm. Khi sử dụng khuôn hình
này trong chương trình thì Trình biên dịch sẽ sản sinh một hàm tương ứng với kiểu
dữ liệu trong lời gọi


293

Ví dụ:
Sử dụng khuôn hình hàm max
class A { … };
int a, b, c;
A u, v, w;
c = max(a,b);
w = max(u,v);
Chú ý: Có thể dùng khuôn hình hàm max ñối với các kiểu dữ liệu chuẩn của C
++
cũng
như kiểu ñối tượng bất kỳ, miễn sao có thể áp dụng phép so sánh >
1.5. ðịnh nghĩa chồng khuôn hình hàm
Có thể dùng cùng một tên ñể ñịnh nghĩa các khuôn hình hàm với một trong các
khác biệt sau:
+ Khác nhau về ñối: kiểu ñối, số ñối
+ Khác nhau về số kiểu dữ liệu

Ví dụ:
template <class T>
T operator*(T , T) // Nhân 2 ñối tượng cùng kiểu
template <class T>
T operator*(T* , int) // Nhân dẫy ñối tượng cùng kiểu
template <class T1, class T2>
T operator*(T1 , T2) // Nhân 2 ñối tượng khác kiểu
// ví dụ ma trận và véc tơ

§
2. CÁC VÍ DỤ VỀ KHUÔN HÌNH HÀM
Ví dụ 1:
/*
Gom khuôn hình hàm:
template <class T>
void sap_xep(T *x, int n)
template <class T>
void nhap_day_dt(T *dt, int &n)
template <class T>
void xuat_day_dt(T *dt, int &n)

ðối T biểu thi ba kiểu:
+ int
+ double
+ TS (lop)
*/

294

#include <iostream.h>

#include <conio.h>
#include <math.h>
class TS
{
private:
char ht[25];
double td;
public:
friend istream& operator>>(istream &in, TS &t)
{
cout << "\nHo ten: ";
in.get(t.ht,25);
cout << "Tong diem: ";
in >> t.td;
in.ignore();
return in;
}
friend ostream& operator<<(ostream &out,const TS &t)
{
out << "\nHo ten: " << t.ht << " Tong diem: " << t.td;
return out;
}
friend int operator>(const TS &ts1,const TS &ts2)
{
return (ts1.td>ts2.td) ;
}
} ;
template <class T>
void sap_xep(T *x, int n)
{

int i,j;
T tg;
for(i=1; i<n; ++i)
for(j=i+1; j<=n; ++j)
if( !(x[i]>x[j]) )
{
tg=x[i]; x[i]=x[j]; x[j]=tg;
}
}

295

template <class T>
void nhap_day_dt(T *dt, int &n)
{
cout << "\nSo doi tuong: ";
cin >> n; cin.ignore();
for(int i=1; i<=n; ++i)
{
cout << "\nNhap doi tuong thu " << i << " : " ;
cin >> dt[i];
}
}
template <class T>
void xuat_day_dt(T *dt, int n)
{
for(int i=1; i<=n; ++i)
cout << "\nDoi tuong thu " << i << " : " << dt[i];
}
void main()

{
int a[10];
double b[10];
TS t[10];
int n;
nhap_day_dt(a,n);
sap_xep(a,n);
xuat_day_dt(a,n);
nhap_day_dt(b,n);
sap_xep(b,n);
xuat_day_dt(b,n);
nhap_day_dt(t,n);
sap_xep(t,n);
xuat_day_dt(t,n);
getch();
}
Ví dụ 2:
/*
Chu y cach khai bao 2 doi khuôn hình:
template <class T1, class T2>
T2 nhan(T1 a, T2 x) { ... }

296

*/
#include <iostream.h>
#include <conio.h>
#include <math.h>
#include <iomanip.h>
class VT;

class MT;
class MT
{
private:
int a[20][20];
int n;
public:
friend istream& operator>>(istream &in, MT &x);
friend ostream& operator<<(ostream &out,const MT &x);
VT operator*(const VT &x);
} ;
istream& operator>>(istream &in, MT &x)
{
int i,j;
cout << "\n Cap ma tran N= ";
in >> x.n;
for(i=1; i<=x.n; ++i)
for(j=1; j<=x.n; ++j)
{
cout << "a[" <<i<<"]["<<j<<"]= ";
in >> x.a[i][j];
}
return in;
}
ostream& operator<<(ostream &out,const MT &x)
{
int i,j;
for(i=1; i<=x.n; ++i) {
out << "\n";
for(j=1; j<=x.n; ++j)

out << setw(5) << x.a[i][j];
}
return out;
}

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×