You are on page 1of 18

Mc lc

I. Khun hnh hm ......................................................................................................... 2


1.

Khi nim khun hnh hm ................................................................................. 2

2.

To khun hnh hm ............................................................................................ 2

3.

S dng khun hnh hm ..................................................................................... 4

4.

Cc tham s kiu ca khun hnh hm ................................................................ 7


4.1

Cc tham s kiu trong nh ngha khun hnh hm........................................ 7


Cc u im v hn ch ca khun hnh hm ..................................................... 8

5.
5.1

u im ca khun hnh hm .......................................................................... 8

5.2

Nhc im ca khun hnh hm .................................................................... 9

6.

nh ngha chng cc khun hnh hm ............................................................... 9

7.

C th ha cc hm tm kim ............................................................................ 11

II.

Khun hnh lp ..................................................................................................... 11

1.

Khi nim khun hnh lp ................................................................................. 11

2.

To khun hnh lp ............................................................................................ 11

3.

S dng khun hnh lp .................................................................................... 13

4.

C th ha khun hnh lp ................................................................................ 14

5.

S ging nhau ca cc lp th hin ................................................................... 15

6.

Cc lp th hin v cc khai bo bn b............................................................ 16


6.1

Khai bo cc lp bn hoc cc hm bn thng thng .................................. 16

6.2

Khai bo bn b ca mt th hin ca khun hnh hm, khun hnh lp ...... 17

6.3

Khai bo bn b ca khun hnh hm, khun hnh lp .................................. 18

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 dng tiu ( dng u khai bo template).


Trong cc khai bo bin cc b.
Trong cc ch th thc hin.

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

Vi hm max() c ngha l hai tham s ca hm c cng kiu d liu. Nh vy, nu


trong mt chng trnh c hai tham s nguyn n v p, vi li gi max(n,p) chng trnh
bin dch s t ng sn sinh ra hm max() (ta gi l mt hm th hin) tng ng vi hai
tham s kiu nguyn int. Nu gi max() vi hai tham s kiu float, chng trnh bin
dch cng s t ng sn sinh mt hm th hin max khc tng ng vi cc tham s kiu
float.
#include <iostream.h>
#include <conio.h>
template <class T> T max(T a, T b)
{
if ( a > b) return a;
else return b;
}
void main()
{
int n = 4, p = 12;
float x = 2.5, y= 3.25;
cout<<"min (n, p) = "<<min (n,p)<<"\n";//int min(int, int)
cout<<"min (x, y) = "<<min (x,y)<<"\n";//float min(float, float)
getch();
}
V d 5: Khun hnh hm vi kiu d liu char *
#include <iostream.h>
#include <conio.h>
template <class T> T max (T a, T b) {
if (a > b) return a;
else return b;
}
void main() {
char * adr1 = "DHBK";

char * adr2 = "CDSD";


cout << "min (adr1, adr2) ="<<min (adr1,adr2);
getch(); }
V d 6: Khun hnh hm vi kiu d liu lp
#include <iostream.h>
#include <conio.h>
template <class T> T max( T a, T b) {
if (a > b) return a;
else return b;
}
//lp vect
class vect {
int x, y;
public:
vect(int abs =0, int ord = 0) { x=abs, y= ord;}
void display() { cout <<x<<""<<y<<"\n"; }
friend int operator < (vect , vect);
};
int operator < (vect a, vect b) {
return a.x*a.x + a.y*a.y < b.x*b.x +b.y*b.y;
}
void main() {
vect u(3,2),v(4,1);
cout<<"max (u, v) = ";
max(u,v).display();
getch();
}

Nu ta p dng khun hnh hm max() i vi mt lp m cha nh ngha ton t


<, chng trnh bin dch s a ra mt thng bo li tng t nh vic nh ngha mt
hm max() cho kiu lp .
Ch :
-

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.

4. Cc tham s kiu ca khun hnh hm


4.1 Cc tham s kiu trong nh ngha khun hnh hm
Mt cch tng qut, khun hnh hm c th c mt hay nhiu tham s kiu, vi mi
tham s ny c t kho class i lin trc, chng hn nh:
template <class T, class U> int sum (T a, T *b, U c) {... }
Cc tham s ny c th bt k u trong nh ngha ca khun hnh hm:
-

Trong dng tiu ( nh ch ra trong v d trn).


Trong cc khai bo cc bin cc b.
Trong cc ch th thc hin.

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).

5.2 Nhc im ca khun hnh hm


Nu mun m bo tnh m hon ton th ngi s dng khun hnh phi c m ngun
thc thi
-

M ngun thc thi cn c t trong header file.


Kh bo v cht xm.

Vic theo di, tm li bin dch nhiu khi gp kh khn


-

Li nhiu khi nm m s dng, nhng li c bo trong m nh ngha khun


mu hm.

nh ngha v s dng khng ng cch c th dn ti gia tng ln v m ch, bi s


lng hm khun mu c th c to ra qu nhiu khng cn thit.
6. nh ngha chng cc khun hnh hm
C++ cho php nh ngha chng cc khun hnh hm, c th nh ngha mt hay nhiu
khun hnh hm c cng tn nhng vi cc tham s khc nhau s to ra nhiu h cc hm
(mi khun hnh hm tng ng vi h cc hm). V d c ba h hm max:
-

H th nht bao gm cc hm tm gi tr ln nht trong hai gi tr.


H th hai tm s ln nht trong ba s.
H th ba tm s ln nht trong mt mng.

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

return max (max (a, b), c);


}
template <class T> T max (T *t, int n) {
T res = t[0];
for(int i = 1; i < n; i++)
if (res < t[i])

//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

1. Khi nim khun hnh lp


nh ngha cc khun hnh lp mt ln ri sau c th p dng chng vi cc kiu d
liu khc nhau c cc lp th hin khc nhau.
2. To khun hnh lp
C php:
template <danh sch tham s kiu> class <tn lp>
{
//nh ngha cc thnh phn ca lp
};
Trong :
-

template <danh sch tham s kiu> xc nh l mt khun hnh trong c


mt tham s ku.
S dng t kho class ch ni rng <tn lp> i din cho mt kiu d liu no
.

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:
-

Khi hm thnh phn c nh ngha bn trong nh ngha lp th khng c g


thay i.
Khi hm thnh phn c nh ngha bn ngoi lp, khi cn phi nhc li cho
chng trnh bit cc tham s kiu ca khun hnh lp. V d: phi nhc li
template <class kieuso> trc nh ngha hm.

V d 9: Hm Hienthi() c nh ngha ngoi lp:


template <class kieuso> void SO<kieuso>::Hienthi()
{
cout <<giatri;
}
Ging nh khun hnh hm, cc khun hnh lp c th c cc tham s kiu v tham s
biu thc.
V d mt lp m cc thnh phn c cc kiu d liu khc nhau c khai bo theo
dng:
template <class T, class U,.... class Z> class <ten lop>{
T x;
U y;
.....
Z fct1 (int);

.....
};
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();
};

template <class T> void point<T>::display()


{
cout<<"Toa do: "<<x<<" "<<y<<"\n";
}
//Thm mt hm display c th ho trong trng hp cc k t
void point<char>::display()
{
cout<<"Toa do: "<<(int)x<<" "<<(int)y<<"\n";
}
void main()
{
point <int> ai(3,5);
ai.display();
point <char> ac('d','y');
ac.display();
point <double> ad(3.5, 2.3);
ad.display();
getch();
}
Ta ch dng tiu trong khai bo mt thnh phn c c th ho:
void point<char>::display()
Khai bo ny nhc chng trnh dch s dng hm ny thay th hm display() ca
khun hnh lp point (trong trng hp gi tr thc t cho tham s kiu l char).
Nhn xt
-

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.

5. S ging nhau ca cc lp th hin


Xt cu lnh gn gia hai i tng. Nh chng ta bit, ch c th thc hin c
php gn khi hai i tng c cng kiu (vi trng hp tha k vn c bit hn mt
cht nhng thc cht ch l chuyn kiu ngm nh i vi biu thc v phi ca lnh
gn). Trc y, ta bit rng hai i tng c cng kiu nu chng c khai bo vi

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;

friend int fct(float);


...
};
6.2 Khai bo bn b ca mt th hin ca khun hnh hm, khun hnh lp
Xt hai v d khai bo sau y. Gi s chng ta c khun hnh lp v khun hnh hm
sau:
template <class T> class point {...};
template <class T> int fct (T) {...};
Ta nh ngha hai khun hnh lp nh sau:
template <class T, class U> class try1 {
int x; public:
friend class point<int>;
friend int fct(double);
...
};
Khai bo ny xc nh hai th hin rt c th ca khun hnh hm fct v khun hnh
lp point l bn ca khun hnh lp try1.
template <class T, class U> class try2 {
int x; public:
friend class point<T>;
friend int fct(U);
...
};
So vi try1, trong try2 ngi ta khng xc nh r cc th hin ca fct() v point l bn
ca mt th hin ca try2. Cc th hin ny s c c th ti thi im chng ta to ra
mt lp th hin ca try2. V d, vi lp th hin try2<double, long> ta c lp th hin
bn l point<double> v hm th hin bn l fct<long>.

6.3 Khai bo bn b ca khun hnh hm, khun hnh lp


V d 12:
template <class T, class U> class try3
{
int x; public:
template <class X> friend class point<X>;
template <class X> friend int fct(X);
...
};
Ln ny, tt c cc th hin ca khun hnh lp point u l bn ca cc th hin no
ca khun hnh lp try3. Tng t nh vy tt c cc th hin ca khun hnh hm fct()
u l bn ca cc th hin ca khun hnh lp try3.

You might also like