Giáo trình C++ - Đại Học Bách Khoa (phần 8) potx - Pdf 16

-233-
Ch
Ch
Ch
Ch
ơ
ơ
ơ
ơ
ng
ng
ng
ng
6
6
6
6
khu
khu
khu
khu
ô
ô
ô
ô
n
n
n
n
h
h

Khu
Khu
Khu
ô
ô
ô
ô
n
n
n
n
h
h
h
h
ì
ì
ì
ì
nh
nh
nh
nh
h
h
h
h
à
à
à

h
h
h
à
à
à
à
m
m
m
m
l
l
l
l
à
à
à
à
g
g
g
g
ì
ì
ì
ì
?
?
?

t
t
t
khu
khu
khu
khu
ô
ô
ô
ô
n
n
n
n
h
h
h
h
ì
ì
ì
ì
nh
nh
nh
nh
h
h
h

b;
}
Giảsử,talạiphảiviếtđịnhnghĩahàm
min()
chokiểu
double
double
double
double
,
float
float
float
float
,
char,char
char,char
char,char
char,char
*
float
min(float
a,
float
b){
if(a<b)
return
a;
else
b;}

(Ta,Tb)
trong
đó
template<class
T>
xácđịnhrằngđólàmộtkhuônhìnhvớimộtthamsốkiểuT;
Phầncònlại
T
min(T
a,Tb)
nóirằng,
m in()
làmộthàmvớihaithamsốhìnhthứckiểu
T
vàcógiátrịtrảvề
cũnglàkiểu
T
.
Khuônh
ì
nh
-235-
S
S
S
S





ì
ì
nh
nh
nh
nh
h
h
h
h
à
à
à
à
m
m
m
m
Khu
Khu
Khu
Khu
ô
ô
ô
ô
n
n
n
n

ki
ki




u
u
u
u
d
d
d
d




li
li
li
li




u
u
u
u

(ta
gọilàmộthàmthểhiện)tơngứngvớihaithamsốkiểunguyên
int
int
int
int
.Nếuchúngta
gọi
min()
vớihaithamsốkiểu
float
float
float
float
,chơngtrìnhbiêndịchcũngsẽtựđộngsản
sinhmộthàmthểhiện
min
kháctơngứngvớicácthamsốkiểu
float
float
float
float
vàcứthế.
Sauđâylàmộtvídụhoànchỉnh:
V
V
V
V
í
í

{
if
(a<
b)
return
a;
elsereturn
b;
}
//vídụsửdụngkhuônh
ì
nhhàmmin
voidmain()
{
clrscr();
int
n=
4,
p=
12;
float
x=
2.5,
y=
3.25;
cout<<"min
(n,
p)
=
"<<min(n,

h
h
h
ì
ì
ì
ì
nh
nh
nh
nh
h
h
h
h
à
à
à
à
m
m
m
m
min
min
min
min
cho
cho
cho

T>
T
min
(Ta,
T
b)
{
if(a
<
b)
return
a;
elsereturn
b;
}
voidmain()
{
clrscr();
char
*
adr1
=
"DHBK";
char
*
adr2
=
"CDSD";
cout
<<

a<b
thựchiệntrêncácgiátrịbiếntrỏ(ởđâytrongcáckhuôn
hìnhmáyPCtaluônluôncó
a<b
).Ngợclạiviệchiểnthịthựchiệnbởitoántử
<<sẽđaraxâukýtựtrỏbởicontrỏkýtự.
K
K
K
K
hu
hu
hu
hu
ô
ô
ô
ô
n
n
n
n
h
h
h
h
ì
ì
ì
ì

i
i
ki
ki
ki
ki




u
u
u
u
d
d
d
d




li
li
li
li





ì
nh
-237-
V
V
V
V
í
í
í
í
d
d
d
d




6.2
6.2
6.2
6.2
/*template3.cpp*/
/*template3.cpp*/
/*template3.cpp*/
/*template3.cpp*/
#include
<iostream.h>
#include<conio.h>

x=
abs,
y=
ord;}
void
display()
{
cout<<x<<"
"<<y<<"\n";
}
friendint
operator
<
(vect
,
vect);
};
int
operator
<
(vect
a,
vect
b)
{
returna.x*a.x
+
a.y*a.y
<
b.x*b.x

C
C
á
á
á
á
c
c
c
c
tham
tham
tham
tham
s
s
s
s




ki
ki
ki
ki





h
h
ì
ì
ì
ì
nh
nh
nh
nh
h
h
h
h
à
à
à
à
m
m
m
m
Phầnnàytrìnhbàycáchđavàocácthamsốkiểutrongmộtkhuônhìnhhàm,
đểchơngtrìnhbiêndịchsảnsinhmộthàmthểhiện.
C
C
C
C
á
á

trong
trong
trong
trong
đị
đị
đị
đị
nh
nh
nh
nh
ngh
ngh
ngh
ngh
ĩ
ĩ
ĩ
ĩ
a
a
a
a
khu
khu
khu
khu
ô
ô

Mộtcáchtổngquát,khuônhìnhhàmcóthểcómộthaynhiềuthamsốkiểu,
vớimỗithamsốnàycótừkhoáclass
class
class
class
điliềntrớc,chẳnghạnnh:
template
<class
T,
class
U>
intfct
(Ta,T
*b,
Uc)
{
}
Cácthamsốnàycóthểđểởbấtkỳđâutrongđịnhnghĩacủakhuônhìnhhàm,
nghĩalà:
Trongdòngtiêuđề(nhđãchỉratrongvídụtrên).
Trongcáckhaibáocácbiếncụcbộ.
(i)
Trongcácchỉthịthựchiện.
Chẳnghạn:
template
<class
T,
class
U>
intfct

í
d
d
d
d




6.3
6.3
6.3
6.3
/*templat4.cpp*/
/*templat4.cpp*/
/*templat4.cpp*/
/*templat4.cpp*/
#include
<iostream.h>
#include<conio.h>
template
<class
T,
class
U>
T
fct(T
x,
U
y,

<<fct(x,
n,
y)<<"\n";
//(float)8.5
cout
<<fct(n,
p,
q)<<"\n";
//(int)6
//cout<<fct(n,p,x)<<"\n";//lỗ
i
getch();
}
Trongmọitrờnghợp,mỗithamsốkiểuphảixuấthiệnítnhấtmộtlầntrong
khaibáodanhsáchcácthamsốhìnhthứccủakhuônhìnhhàm.Điềuđóhoàntoàn
logicbờivìnhờcácthamsốnày,chơngtrìnhdịchmớicóthểsảnsinhrahàmthể
hiệncầnthiết.Điềugìsẽxảyranếutrongdanhsáchcácthamsốcủakhuônhình
hàmkhôngcóđủcácthamsốkiểu?Hiểnnhiênkhiđóchơngtrìnhdịchkhôngthể
xácđịnhcácthamsốkiểudữliệuthựcứngvớicácthamsốkiểuhìnhthứctrong
template< >
.
Khuônhìnhhàmsauđâythựchiệntraođổinộidungcủahaibiến.
V
V
V
V
í
í
í
í

temp;
temp=a;
a=b;
b=temp;
}
voidmain()
{
clrscr();
inti=10,j=20;
floatx=10.1,y=23.1;
cout<<"I
J
bandau:"<<i<<"
"<<j<<endl;
cout<<"X
Y
bandau:"<<x<<"
"<<y<<endl;
swap(i,j);
//đổ
i
chỗhaisốnguyên
Khuônh
ì
nh
-240-
swap(x,y);
//đổ
i
chỗhaisốnguyên





t
t
t
t
s
s
s
s




n
n
n
n
sinh
sinh
sinh
sinh
m
m
m
m







n
n
n
n
Trởlạikhuônhìnhhàm
m in()
:
template
<class
T>
T
min(T
a,
T
b)
{
if(a
<
b)
return
a;
elsereturn
b;
}
Vớicáckhaibáo:
int

char
c;
unsigned
int
q;
Khuônh
ì
nh
-241-
constint
r=
10;
intt[10];
int*adi;

min(n,
c)
//lỗi
min(n,
q)
//lỗi
min(n,
r)
//lỗi
min(t,adi)
//lỗi
Kh
Kh
Kh
Kh

c
c
bi
bi
bi
bi
ế
ế
ế
ế
n
n
n
n
c
c
c
c
ó
ó
ó
ó
ki
ki
ki
ki







n
n
n
n
Trongkhuônhìnhhàm,thamsốkiểucóthểtơngứngkhithìmộtkiểudữliệu
chuẩn,khithìmộtkiểudữliệulớp.Sẽlàmgìkhitacầnphảikhaibáobêntrong
khuônhìnhhàmmộtđốitợngvàtruyềnmộthaynhiềuthamsốchohàmthiếtlập
củalớp.Xemvídụsauđây:
template
<class
T>
fct(T
a)
{
T
x(3);
//x
l
àmộtđối
t
ợngcụcbộkiểuTmàchúngtaxâydựngbằngcách
//truyềngiátr

3chohàmthiếtlập
}
Khisửdụnghàm
fct()
chomộtkiểudữliệulớp,mọiviệcđềutốtđẹp.Ngợc

C
á
á
á
á
c
c
c
c
h
h
h
h




n
n
n
n
ch
ch
ch
ch
ế
ế
ế
ế
c

ì
nh
nh
nh
nh
h
h
h
h
à
à
à
à
m
m
m
m
Vềnguyêntắc,khiđịnhnghĩamộtkhuônhìnhhàm,mộtthamsốkiểucóthể
tơngứngvớibấtkỳkiểudữliệunào,chodùđólàmộtkiểuchuẩnhaymộtkiểu
lớpdongờidùngđịnhnghĩa.Dovậykhôngthểhạnchếviệcthểhiệnđốivớimột
sốkiểudữliệucụthểnàođó.Chẳnghạn,nếumộtkhuônhìnhhàmcódòngđầu
tiên:
template
<class
T>
voidfct(T)
chúngtacóthểgọi
fct()
vớimộtthamsốvớikiểubấtkỳ:int
int

T>
voidfct(T
*)
tachỉcóthểgọi
fct()
vớimộtcontrỏđếnmộtkiểunàođó:int
int
int
int
*,
int
int
int
int
**,
t
*,t**
.
Trongcáctrờnghợpkhác,sẽgâyracáclỗibiêndịch.Ngoàira,trongđịnh
nghĩacủamộtkhuônhìnhhàm,cóthểcócácchỉthịkhôngthíchhợpđốivớimột
sốkiểudữliệunhấtđịnh.Chẳnghạn,khuônhìnhhàm:
template
<class
T>
T
min(T
a,
T
b)
{

ì
nh
-243-
chứanhữngnhântốđểngờitacóthểbiếtđợckhuônhìnhhàmđócóthểđợcáp
dụngđếnmứcnào.
C
C
C
C
á
á
á
á
c
c
c
c
tham
tham
tham
tham
s
s
s
s




bi


a
a
a
a
m
m
m
m




t
t
t
t
khu
khu
khu
khu
ô
ô
ô
ô
n
n
n
n
h

V
V
V
í
í
í
í
d
d
d
d




6.5
6.5
6.5
6.5
/*templat6.cpp*/
/*templat6.cpp*/
/*templat6.cpp*/
/*templat6.cpp*/
#include
<iostream.h>
#include<conio.h>
template
<class
T>
int

=
"<<compte(t,
5)<<"\n";
cout<<"compte(c)
=
"<<compte(c,6)<<"\n";
getch();
}
compte(t)=2
compte(c)=4
Tacóthểnóirằngkhuônhìnhhàm
compte
địnhnghĩamộthọcáchàm
compte
trongđókiểucủathamsốđầutiênlàtuỳý(đợcxácđịnhbởilờigọi),còn
kiểucủathamsốthứhaiđãxácđịnh(kiểu
int
int
int
int
).
Khuônh
ì
nh
-244-
Đị
Đị
Đị
Đị
nh

c
á
á
á
á
c
c
c
c
khu
khu
khu
khu
ô
ô
ô
ô
n
n
n
n
h
h
h
h
ì
ì
ì
ì
nh

í
í
í
í
d
d
d
d




6.6
6.6
6.6
6.6
/*templat7.cpp*/
/*templat7.cpp*/
/*templat7.cpp*/
/*templat7.cpp*/
#include
<iostream.h>
#include<conio.h>
//khuônhình1
template
<class
T>
T
min(T
a,

min
(T
*t,int
n)
{
T
res
=
t[0];
for(int
i=
1;
i<
n;
i++)
if
(res
>
t[i])
res
=
t[i];
returnres;
}
voidmain()
{
clrscr();
int
n=
12,

ônh
ì
nh
1
int
min(int,
int)
cout<<

min(n,p,q)
=
<<min(n,p,q)<<"\n";
//khuônhình2intmin(int,int,int)
cout<<

min(x,y)
=
<<min(x,y)<<"\n";
//
khu
ônh
ì
nh
1
float
min(float,
float)
cout<<

min(x,y,z)

}
min(n,p)=12
min(n,p,q)=2
min(x,y)=3.5
min(x,y,z)=0.25
min(t,6)=-1
min(c,4)=Q
Nh
Nh
Nh
Nh




n
n
n
n
x
x
x
x
é
é
é
é
t
t
t

Xétcáccâulệnhsauđây:
int
x;
int
y;
Khuônh
ì
nh
-246-
Lờigọi
fct(&x,&y)
cóthểtơngứngvớikhuônhìnhhàm1haykhuônhìnhhàm4.
C
C
C
C




th
th
th
th




ho
ho

th
th
th
th




hi
hi
hi
hi




n
n
n
n
Mộtkhuônhìnhhàmđịnhnghĩamộthọcáchàmdựatrênmộtđịnhnghĩa
chung,nóicáchkhácchúngthựchiệntheocùngmộtgiảithuật.Trongmộtsố
trờnghợp,sựtổngquátnàycóthểchịurủiro,chẳnghạnnhtrongtrờnghợp
ápdụngkhuônhìnhhàm
min
chokiểu
char
char
char
char

#include<string.h>
#include<conio.h>
//khuônhìnhhàmmin
template
<class
T>
T
min
(Ta,
T
b)
{
if(a
<
b)
return
a;
elsereturn
b;
}
//hàmminchokiểuxâukýtự
char
*
min(char*cha,char*chb)
{
if
(strcmp(cha,chb)<0)returncha;
elsereturnchb;
}
voidmain()

T
T
T
T




ng
ng
ng
ng
k
k
k
k
ế
ế
ế
ế
t
t
t
t
v
v
v
v



ì
ì
ì
ì
nh
nh
nh
nh
h
h
h
h
à
à
à
à
m
m
m
m
Mộtcáchtổngquát,tacóthểđịnhnghĩamộthaynhiềukhuônhìnhcùngtên,
mỗikhuônhìnhcócácthamsốkiểucũngnhlàcácthamsốbiểuthứcriêng.Hơn
nữa,cóthểcungcấpcáchàmthôngthờngvớicùngtênvớimộtkhuônhìnhhàm;
trongtrờnghợpnàytanóiđólàsựcụthểhoámộthàmthểhiện.
Trongtrờnghợptổngquátkhicóđồngthờicảhàmđịnhnghĩachồngvà
khuônhìnhhàm,chơngtrìnhdịchlựachọnhàmtơngứngvớimộtlờigọihàm
dựatrêncácnguyêntắcsauđây:
(vii)
Đầutiên,kiểmtratấtcảcáchàmthôngthờngcùngtênvàchúýđếnsự
tơngứngchínhxác;nếuchỉcómộthàmphùhợp,hàmđóđợcchọn;cònnếu

ì
ì
ì
nh
nh
nh
nh
l
l
l
l




p
p
p
p
Khu
Khu
Khu
Khu
ô
ô
ô
ô
n
n
n

à
à
à
g
g
g
g
ì
ì
ì
ì
?
?
?
?
Bêncạnhkháiniệmkhuônhìnhhàm,C++cònchophépđịnhnghĩakhuôn
hìnhlớp.Cũnggiốngnhkhuônhìnhhàm,ởđâytachỉcầnviếtđịnhnghĩacác
khuônhìnhlớpmộtlầnrồisauđócóthểápdụngchúngvớicáckiểudữliệukhác
nhauđểđợccáclớpthểhiệnkhácnhau.
Khuônh
ì
nh
-248-
T
T
T
T




h
h
h
ì
ì
ì
ì
nh
nh
nh
nh
l
l
l
l




p
p
p
p
Tathờngtạoralớppointtheokiểu(ởđâytabỏquađịnhnghĩacủacác
hàmthànhphần):
classpoint
{
int
x,y;
public:

int
int
int
int
bằngtừkhoátơngứngvớikiểudữliệumongmuốn.
Đểtránhsựtrùnglặptrongcáctìnhhuốngnhtrên,chơngtrìnhdịchC++
chophépđịnhnghĩamộtkhuônhìnhlớpvàsauđó,ápdụngkhuônhìnhlớpnàyvới
cáckiểudữliệukhácnhauđểthuđợccáclớpthểhiệnnhmongmuốn:
template
<class
T>
classpoint
{
T
x;
T
y;
public:
point
(T
abs=0,
T
ord=0);
void
display();
};
Cũnggiốngnhcáckhuônhìnhhàm,tậphợp
template<class
T>
xácđịnh

nh
-249-
x=
abs;
y=
ord;
}

};
(ii)Ngợclại,khiđịnhnghĩacủahàmthànhphầnnằmngoàiđịnhnghĩalớp,
khiđócầnphảinhắclạichochơngtrìnhdịchbiết:cácthamsốkiểucủakhuôn
hìnhlớp,cónghĩalàphảinhắclại:
template
<class
T>
trớcđịnhnghĩahàm,
còntêncủakhuônhìnhlớpđợcviếtnhlà
point<T>
Tómlại,dòngtiêuđềđầyđủchohàmthànhphần
display()
củakhuônhình
hàmpointnhsau:
template
<class
T>
void
point<T>::display()
Sauđâylàđịnhnghĩađầyđủcủakhuônhìnhlớppoint:
#include
<iostream.h>

l
ớp
template
<class
T>
void
point<T>::display()
{
cout<<"Toa
do:"<<x<<"
"<<y<<"\n";
}
S
S
S
S




d
d
d
d




ng
ng





p
p
p
p
Mộtkhikhuônhìnhlớppointđãđợcđịnhnghĩa,mộtkhaibáonh:
point<int>
ai;
Khuônh
ì
nh
-250-
khaibáomộtđốitợng
ai
cóhaithànhphầntoạđộlàkiểunguyên(
int
int
int
int
)
.Điều
đócónghĩalà
point<int>
cóvaitrònhmộtkiểudữliệulớp;ngờitagọinólà
mộtlớpthểhiệncủakhuônhìnhlớp
point
.Mộtcáchtổngquát,khiápdụngmột

s
s
s
s




d
d
d
d




ng
ng
ng
ng
khu
khu
khu
khu
ô
ô
ô
ô
n
n

V
í
í
í
í
d
d
d
d




6.8
6.8
6.8
6.8
/*templat9.cpp*/
/*templat9.cpp*/
/*templat9.cpp*/
/*templat9.cpp*/
#include
<iostream.h>
#include<conio.h>
//tạomộtkhuônhình
l
ớp
template
<class
T>

ì
nh
-251-
point<int>ai(3,5);ai.display();
point<char>
ac('d','y');
ac.display();
point<double>
ad(3.5,2.3);
ad.display();
getch();
}
Toado:35
Toado:dy
Toado:3.52.3
C
C
C
C
á
á
á
á
c
c
c
c
tham
tham
tham

ì
ì
ì
nh
nh
nh
nh
l
l
l
l




p
p
p
p
Hoàntoàngiốngnhkhuônhìnhhàm,cáckhuônhìnhlớpcóthểcócáctham
sốkiểuvàthamsốbiểuthức.Trongphầnnàytabànvềcácthamsốkiểu;còncác
thamsốbiểuthứcsẽđợcnóitrongphầnsau.Tuycónhiềuđiểmgiốngnhaugiữa
khuônhìnhhàmvàkhuônhìnhlớp,nhngcácràngbuộcđốivớicáckiểuthamsố
lạikhôngnhnhau.
S
S
S
S



s
s
s
s




ki
ki
ki
ki




u
u
u
u
trong
trong
trong
trong
m
m
m
m



l
l
l
l




p
p
p
p
Xétvídụkhaibáosau:
template
<class
T,
class
U,
class
V>
//danhsáchbathamsốkiểu
classtry
{
T
x;
U
t[5];

V
fm1(int,U);

l
l
l
l




p
p
p
p
th
th
th
th




hi
hi
hi
hi




n
n

trớcđó.Thậmchícóthểsửdụngcáclớpthểhiệnđểlàmthamsốthựcchocáclớp
thểhiệnkhác,chẳnghạn:
try<float,
point<int>,
double>
try
<point<int>,point<float>,
char
*>
Cầnchúýrằng,vấnđềtơngứngchínhxácđợcnóitớitrongcáckhuônhình
hàmkhôngcònhiệulựcvớicáckhuônhìnhlớp.Vớicáckhuônhìnhhàm,việcsản
sinhmộtthểhiệnkhôngchỉdựavàodanhsáchcácthamsốcótrong
template< >
màcòndựavàodanhsáchcácthamsốhìnhthứctrongtiêuđềcủa
hàm.
Mộtthamsốhìnhthứccủamộtkhuônhìnhhàmcóthểcókiểu,làmộtlớp
thểhiệnnàođó,chẳnghạn:
template
<class
T>
void
fct(point<T>)
{

}
Việckhởitạomớicáckiểudữliệumớivẫnápdụngđợctrongcáckhuônhình
lớp.Mộtkhuônhìnhlớpcóthểcócácthànhphần(dữliệuhoặchàm)static
static
static
static


bi
bi
bi
bi




u
u
u
u
th
th
th
th




c
c
c
c
trong
trong
trong
trong
khu


p
p
p
p
Mộtkhuônhìnhlớpcóthểchứacácthamsốbiểuthức.Sovớikhuônhìnhhàm,
kháiniệmthamsốbiểuthứctrongkhuônhìnhlớpcómộtsốđiểmkhácbiệt:tham
sốthựctếtơngứngvớithamsốbiểuthứcphảilàmộthằngsố.
Giảsửrằngtamuốnđịnhnghĩamộtlớp
table
đểthaotáctrêncácbảngchứa
cácđốitợngcókiểubấtkỳ.Mộtcáchtựnhiêntanghĩngayđếnviệctạomột
khuônhìnhlớpvớimộtthamsốkiểu.Đồngthờicòncóthểdùngmộtthamsốthứ
haiđểxácđịnhsốthànhphầncủamảng.Trongtrờnghợpnày,địnhnghĩacủa
khuônhìnhlớpcódạngnhsau:
template
<class
T,
int
n>
classtable
{
T
tab[n];
public:

};
Danhsáchcácthamsố(
template< >
)chứahaithamsốvớiđặcđiểmkhác

d
d
d
d




6.9
6.9
6.9
6.9
/*templat10.cpp*/
/*templat10.cpp*/
/*templat10.cpp*/
/*templat10.cpp*/
#include
<iostream.h>
#include<conio.h>
template
<class
T,
int
n>
classtable
{
T
tab[n];
public:
table()

display()
{
cout<<"Toa
do:"<<x<<"
"<<y<<"\n";
Khuônh
ì
nh
-254-
}
};
voidmain()
{
clrscr();
table<int,
4>
ti;
for(int
i=
0;
i<
4;
i++)
ti[i]
=
i;
cout<<"ti:
";
for(i
=

T
T
T




ng
ng
ng
ng
qu
qu
qu
qu
á
á
á
á
t
t
t
t
v
v
v
v







p
p
p
p
Tacóthểkhaibáomộtsốtuỳýcácthamsốbiểuthứctrongdanhsáchcác
thamsốcủakhuônhìnhhàm.Cácthamsốnàycóthểxuấthiệnởbấtkỳnơinào
trongđịnhnghĩacủakhuônhìnhlớp.Khisảnsinhmộtlớpcócácthamsốbiểuthức,
cácthamsốthựctếtơngứngphảilàcácbiểuthứchằngphùhợpvớikiểudữliệu
đãkhaibáotrongdanhsáchcácthamsốhìnhthứccủakhuônhìnhlớp.
Khuônh
ì
nh
-255-
C
C
C
C




th
th
th
th



nh
nh
nh
nh
l
l
l
l




p
p
p
p
Khảnăngcụthểhoákhuônhìnhlớpcóđôichútkhácbiệtsovớikhuônhình
hàm.
Khuônhìnhlớpđịnhnghĩahọcáclớptrongđómỗilớpchứađồngthờiđịnh
nghĩacủachínhnóvàcáchàmthànhphần.Nhvậy,tấtcảcáchàmthànhphần
cùngtênsẽđợcthựchiệntheocùngmộtgiảithuật.Nếutamuốnchomộthàm
thànhphầnthíchứngvớimộttìnhhuốngcụthểcụthểnàođó,cóthểviếtmộtđịnh
nghĩakhácchonó.Sauđâylàmộtvídụcảitiếnkhuônhìnhlớppoint.ởđây
chúngtađãcụthểhoáhàmhiểnthị
display()
chotrờnghợpkiểudữliệu
char
char
char
char

ớp
template
<class
T>
classpoint
{
T
x,y;
public:
point(Tabs
=
0,
T
ord
=
0)
{
x=
abs;
y=
ord;
}
void
display();
};
template
<class
T>
void
point<T>::display()

ad.display();
getch();
}
Toado:35
Toado:100121
Toado:3.52.3
Tachúýdòngtiêuđềtrongkhaibáomộtthànhphầnđợccụthểhoá:
void
point<char>::display()
Khaibáonàynhắcchơngtrìnhdịchsửdùnghàmnàythaythếhàm
display(
)
củakhuônhìnhlớppoint(trongtrờnghợpgiátrịthựctếchothamsốkiểulà
char
char
char
char
).
Nh
Nh
Nh
Nh




n
n
n
n

};
Khiđó,chúngtacóthểviếtmộtđịnhnghĩacụthểhoáchohàmthiếtlậpcho
cácbảng10phầntửkiểupointnhsau:
table<point,10>::table( )
{ }
(xi)Cóthểcụthểhoámộthàmthànhphầnhaymộtlớp.Trongvídụ6.10
chơngtrình
template11.cpp
đãcụthểhoámộthàmthànhphầncủakhuôn
hìnhlớp.Nóichungcóthể:cụthểhoámộthaynhiềuhàmthànhphần,hoặc
khôngcầnthayđổiđịnhnghĩacủabảnthânlớp(thựctếcầnphảilàmnhvậy)
màcụthểhoábảnthânlớpbằngcáchđathêmđịnhnghĩa.Khảnăngthứhai
nàycódẫntớiviệcphảicụthểhoámộtsốhàmthànhphần.Chẳnghạn,saukhi
địnhnghĩakhuônhình
template<class
T>
classpoint
,tacóthểđịnh
Khuônh
ì
nh
-257-
nghĩamộtphiênbảncụthểchokiểudữliệu
point
thíchhợpvớithểhiện
point<char>
.Talàmnhsau:
class
point<char>
{





a
a
a
a
c
c
c
c
á
á
á
á
c
c
c
c
l
l
l
l




p
p

table
trongmục2.6)vớicáckhaibáo:
table<int,12>t1;
table
<float,12>
t2;
takhôngcóquyềnviết:
t2=
t1;
//không
t
ơngthíchgiữahaithamsốđầu
Cũngvậy,vớicáckhaibáo:
table<int,12>ta;
table<int,20>tb;
cũngkhôngđợcquyềnviết
ta
=
tb;
//giátr

thựccủahaithamsốsaukhácnhau.
Nhữngquitắcchặtchẽtrênnhằmlàmchophépgánngầmđịnhđợcthựchiện
chínhxác.Trờnghợpcócácđịnhnghĩachồngtoántửgán,cóthểkhôngnhấtthiết
phảituântheoquitắcđãnêutrên.Chẳnghạnhoàntoàncóthểthựchiệnđợcphép
gán
t2=
t1;
nếutacóđịnhnghĩahailớpthểhiện
table<int,

th
th
th




hi
hi
hi
hi




n
n
n
n
v
v
v
v
à
à
à
à
c
c
c




n
n
n
n
b
b
b
b
è
è
è
è
Cáckhuônhìnhlớpcũngchophépkhaibáobạnbè.Bêntrongmộtkhuônhình
lớp,tacóthểthựchiệnbakiểukhaibáobạnbènhsau.


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status