Professional Documents
Culture Documents
Khuôn Hình
Khuôn Hình
2.
3.
4.
5.
5.1
5.2
6.
7.
C th ha cc hm tm kim ............................................................................ 11
II.
1.
2.
3.
4.
5.
6.
6.2
6.3
I. Khun hnh hm
1. Khi nim khun hnh hm
Hm qu ti cho php dng mt tn duy nht cho nhiu hm thc hin cc cng
vic khc nhau.
Khi nim khun hnh hm cng cho php s dng cng mt tn duy nht thc hin
cc cng vic khc nhau, tuy nhin so vi nh ngha hm qu ti, n mnh hn v cht
ch hn.
2. To khun hnh hm
C php:
template <danh sch tham s kiu> <kiu tr v> tn hm (khai bo tham s)
{
// nh ngha hm
}
Trong :
-
<danh sch tham s kiu> l cc kiu d liu c khai bo vi t kha class, cch
nhau bi du phy.
<kiu tr v> l mt kiu bt k, k c kiu class.
V d: Khun hnh hm max c xy dng nh sau:
template <class T> T max (T x, T y)
{
return (x>y) ? x : y ;
}
template <class T>: xc nh rng l mt khun hnh vi mt tham s kiu T;
Khun hnh hm c th c mt hay nhiu tham s kiu, mi tham s i lin sau t kho
class. Cc tham s ny c th bt k u trong nh ngha ca khun hnh hm:
-
Trong mi trng hp, mi tham s kiu phi xut hin t nht mt ln trong khai bo
danh sch tham s hnh thc ca khun hnh hm.
khun hnh hm max trn, mi ch cho php tm max ca hai s cng kiu, nu
mun tm max ca hai s khc kiu th khun hnh hm trn cha p ng c.
V d 1: Khc phc hm max cho cc kiu d liu khc kiu
#include <iostream.h>
template <class T,class U> T max (T a, U b)
{
return a>b ? a : b;
}
void main()
{
float a =2.5;
int b = 8;
cout << "so lon nhat la :" << max(a,b);
getch();
}
V d 2: Khun hnh hm sum cho cc kiu d liu khc kiu
#include <iostream.h>
#include <conio.h>
template <class T, class U> T sum(T x, U y, T z)
{
return x + y + z;
}
void main()
{
int n= 1, p = 2, q = 3;
float x =2.5, y = 5.0;
cout <<sum( n, x, p)<<"\n";// (int) 5
cout <<sum(x, n, y)<<"\n"; // (float)8.5
cout <<sum(n, p, q)<<"\n"; // (int) 6
//cout <<sum(n, p, x)<<"\n"; // li v khng ng th t kiu d liu hm
getch();
}
V d 3: Khun hnh hm trao i ni dung 2 bin
#include <iostream.h>
#include <conio.h>
//nh ngha khun hnh hm i ch ni dung hai bin vi kiu bt k
template <class X> void Hoandoi(X &a, X &b)
{
X temp;
temp=a;
a=b;
b=temp;
}
void main()
{
int i=10, j=20;
float x=10.1, y=23.1;
cout<<"I J ban dau: "<<i<<" "<<j<<endl;
cout<<"X Y ban dau: "<<x<<" "<<y<<endl;
Hoandoi(i,j);//i ch hai s nguyn
Hoandoi(x,y); //i ch hai s thc
cout<<"I J sau khi doi cho: "<<i<<" "<<j<<endl;
cout<<"X Y sau khi doi cho: "<<x<<" "<<y<<endl;
getch();
}
3. S dng khun hnh hm
s dng khun hnh hm (VD: hm max()) va to ra, ch cn s dng hm trong
nhng iu kin ph hp.
V d 4: Khun hnh hm vi kiu d liu c s
Cc bin truyn cho danh sch tham s ca hm phi chnh xc vi kiu khai bo.
Mun p dng c vi kiu lp th trong lp phi nh ngha cc ton t ti bi
tng ng.
Chng hn:
template <class T, class U> int sum (T a, T *b, U c) {
T x; //bin cc b x kiu T
U *adr; //bin cc b adr kiu U *
...
adr = new T [10];//cp pht mt mng 10 thnh phn kiu T ... n = sizeof (T);
}
Ta xem chng trnh sau:
V d 7
#include <iostream.h>
#include <conio.h>
template <class T, class U> T sum(T x, U y, T z)
{
return x + y + z;
}
void main()
{
int n= 1, p = 2, q = 3;
float x =2.5, y = 5.0;
cout <<sum( n, x, p)<<"\n";// (int) 5
cout <<sum(x, n, y)<<"\n"; // (float)8.5
cout <<sum(n, p, q)<<"\n"; // (int) 6
//cout <<sum(n, p, x)<<"\n"; // li
getch();
}
Trong mi trng hp, mi tham s kiu phi xut hin t nht mt ln trong khai bo
danh sch cc tham s hnh thc ca khun hnh hm. iu hon ton logic bi v nh
cc tham s ny, chng trnh dch mi c th sn sinh ra hm th hin cn thit. iu g
s xy ra nu trong danh sch cc tham s ca khun hnh hm khng c cc tham s
kiu? Hin nhin khi chng trnh dch khng th xc nh cc tham s kiu d liu
thc ng vi cc tham s kiu hnh thc trong template<...>.
5. Cc u im v hn ch ca khun hnh hm
5.1 u im ca khun hnh hm
Tit kim c m ngun -> d bo qun, d kim sot li v nng cao hiu qu lp
trnh.
m bo c tnh cht ch v kim tra kiu mnh trong ngn ng lp trnh(hn hn
s dng marco trong C).
C tnh m, nng cao gi tr s dng li ca phn mm: thut ton vit mt ln nhng
s dng c v s ln.
m bo c hiu sut tng ng nh khi vit tch thnh tng hm ring bit.
Cho php xy dng cc th vin chun rt mnh(Cc thut ton thng dng nh sao
chp, sp xp, la chn).
Chng trnh:
#include <iostream.h>
#include <conio.h>
template <class T> T max(T a, T b) {
//khun hnh 1
if (a > b) return a;
else return b;
}
template <class T> T max(T a, T b, T c) {
//khun hnh 2
//khun hnh 3
res = t[i];
return res;
}
void main() {
int n = 12, p = 15, q = 2;
float x = 3.5, y = 4.25, z = 0.25;
int t[6] = {2, 3, 4,-1, 21};
char c[4] = {'w', 'q', 'a', 'Q'};
cout<<max(n,p) = <<max(n,p)<<"\n"; // khun hnh 1 int max(int, int)
cout<<max(n,p,q) = <<max(n,p,q)<<"\n";//khun hnh 2 int max(int,int,int)
cout<<max(x,y) = <<max(x,y)<<"\n"; // khun hnh 1 float max(float, float)
cout<<max(x,y,z) = <<max(x,y,z)<<"\n";// khun hnh 2 float max(float,float,
float)
cout<<max(t,6) = <<max(t,6)<<"\n"; // khun hnh 3 int max(int *, int)
cout<<max(c,4) = <<max(c,4)<<"\n"; // khun hnh 3 char max(char *, int)
getch();
}
Nhn xt
Cng ging nh nh ngha chng cc hm, vic nh ngha chng cc khun hnh hm
c th gy ra s nhp nhng trong vic sn sinh cc hm th hin. Chng hn vi bn h
hm sau y:
template <class T> T sum(T, T) {...}
template <class T> T sum(T *, T) {...}
template <class T> T sum(T, T*) {...}
template <claas T> T sum(T *, T*) {...}
Xt cc cu lnh sau y:
int x;
int y;
Li gi
sum(&x, &y)
c th tng ng vi khun hnh hm 1 hay khun hnh hm 4.
7. C th ha cc hm tm kim
Mt khun hnh hm nh ngha mt h cc hm da trn mt nh ngha chung, ni
cch khc chng thc hin theo cng mt gii thut. Trong mt s trng hp, s tng
qut ny c th chu ri ro, chng hn nh trong trng hp p dng khun hnh hm
min cho kiu char* nh ni trn. Khi nim c th ho, a ra mt gii php khc
phc cc ri ro kiu nh trn. C++ cho php ta cung cp, ngoi nh ngha ca mt
khun hnh hm, nh ngha ca mt s cc hm cho mt s kiu d liu ca tham s.
Bn cht ca c th ho khun hnh hm l nh ngha cc hm thng thng c cng
tn vi khun hnh hm gii quyt mt s trng hp ri ro khi ta p dng khun hnh
hm cho mt s kiu d liu c bit no .
II.
Khun hnh lp
V d 8:
template <class kieuso> class SO
{
kieuso giatri;
public :
SO (kieuso x =0);
void Hienthi();
...
};
nh ngha cc hm thnh phn ca khun hnh lp, phn bit hai trng hp:
-
.....
};
Mt lp th hin c khai bo bng cch lit k ng sau tn khun hnh lp cc tham
s thc, l tn kiu d liu, vi s lng bng cc tham s trong danh sch ca khun
hnh lp (template<...>).
3. S dng khun hnh lp
Sau khi mt khun hnh lp c nh ngha, n s c dng khai bo cc i
tng theo dng sau :
Tn_lp <Kiu> Tn_i_tng;
V d :
Cu lnh khai bo SO <int> so1; s khai bo mt i tng so1 c thnh phn d
liu giatri c kiu nguyn int.
SO <int> c vai tr nh mt kiu d liu lp; ngi ta gi n l mt lp th hin ca
khun hnh lp SO.
Mt cch tng qut, khi p dng mt kiu d liu no vi khun hnh lp SO ta s
c c mt lp th hin tng ng vi kiu d liu.
Tng t vi cc khai bo SO <float> so2; cho php khai bo mt i tng so2 m
thnh phn d liu giatri c kiu float.
V d 10:
#include <iostream.h>
#include <conio.h>
template <class kieuso> class SO
{
kieuso giatri;
public :
SO (kieuso x =0);
void Hienthi()
{
cout<<"Gia tri cua so :"<<giatri<<endl;
}
};
void main()
{
clrscr();
SO <int> soint(10); soint.Hienthi();
SO <float> sofl(25.4); sofl.Hienthi();
getch();
}
4. C th ha khun hnh lp
Kh nng c th ho khun hnh lp c i cht khc bit so vi khun hnh hm.
Khun hnh lp nh ngha h cc lp trong mi lp cha ng thi nh ngha ca
chnh n v cc hm thnh phn. Nh vy, tt c cc hm thnh phn cng tn s c
thc hin theo cng mt gii thut. Nu ta mun cho mt hm thnh phn thch ng vi
mt tnh hung c th c th no , c th vit mt nh ngha khc cho n. Sau y l
mt v d ci tin khun hnh lp point. y chng ta c th ho hm hin th
display() cho trng hp kiu d liu char:
V d 11:
#include <iostream.h>
#include <conio.h>
//to mt khun hnh lp
template <class T> class point
{
T x, y;
public:
point(T abs = 0, T ord = 0)
{
x = abs; y = ord;
}
void display();
};
C th c th ho gi tr ca tt c cc tham s.
C th c th ho mt hm thnh phn hay mt lp.
cng mt tn lp. Trong trng hp khun hnh lp, nn hiu s cng kiu y nh th
no? Thc t, hai lp th hin tng ng vi cng mt kiu nu cc tham s kiu tng
ng nhau mt cch chnh xc v cc tham s biu thc c cng gi tr. Nh vy vi cc
khai bo:
table <int, 12> t1;
table <float,12> t2;
Ta khng c quyn vit:
t2 = t1; //khng tng thch gia hai tham s u
Cng vy, vi cc khai bo:
table <int, 12> ta;
table <int, 20> tb;
cng khng c quyn vit
ta = tb;//gi tr thc ca hai tham s sau khc nhau.
Nhng qui tc cht ch trn nhm lm cho php gn ngm nh c thc hin chnh
xc. Trng hp c cc nh ngha chng ton t gn, c th khng nht thit phi tun
theo qui tc nu trn. Chng hn hon ton c th thc hin c php gn
t2 = t1;
nu ta c nh ngha hai lp th hin table<int, m> v table<float,n> v trong lp th
hai c nh ngha chng php gn bng.
6. Cc lp th hin v cc khai bo bn b
Cc khun hnh lp cng cho php khai bo bn b. Bn trong mt khun hnh lp, ta
c th thc hin ba kiu khai bo bn b nh sau.
6.1 Khai bo cc lp bn hoc cc hm bn thng thng
Gi s A l mt lp thng thng v fct() l mt hm thng thng. Xt khai bo sau
y trong khai bo A l lp bn v fct() l hm bn ca tt c cc lp th hin ca
khun hnh lp:
template <class T> class try
{
int x;
public:
friend class A;