-13-
Ch
Ch
Ch
Ch
ơ
ơ
ơ
ơ
ng
ng
ng
ng
2
2
2
2
Nh
Nh
Nh
Nh
ữ
ữ
ữ
ữ
ng
ng
ng
ng
m
m
m
m
ở
ở
ở
ở
r
r
r
r
ộ
ộ
ộ
ộ
ng
ng
ng
ng
c
c
c
c
ủ
ủ
ủ
ủ
a
a
a
a
C++
C++
C++
C++
Mụcđíchchơngnày:
1.
GiớithiệunhữngđiểmkhácbiệtchủyếugiữaCvàC++
2.
CácđiểmmớicủaC++sovớiC(nhữngvấnđềcơbảnnhất)
1.
1.
1.
1.
C
C
C
C
á
á
á
á
c
c
c
c
đ
đ
đ
đ
i
i
i
i
ể
ể
ể
ể
m
m
m
m
kh
kh
kh
kh
ô
ô
ô
ô
ng
ng
ng
ng
t
t
t
t
ơ
ơ
ơ
ơ
ng
ng
ng
ng
th
th
th
th
í
í
í
í
ch
ch
ch
ch
gi
gi
gi
gi
ữ
ữ
ữ
ữ
a
a
a
a
C++
C++
C++
C++
v
v
v
v
à
à
à
à
ANSI
ANSI
ANSI
ANSI
C
C
C
C
1.1
1.1
1.1
1.1
Đị
Đị
Đị
Đị
nh
nh
nh
nh
ngh
ngh
ngh
ngh
ĩ
ĩ
ĩ
ĩ
a
a
a
a
h
h
h
h
à
à
à
à
m
m
m
m
Trongđịnhnghĩahàm,ANSICchophéphaikiểukhaibáodòngtiêuđềcủa
hàm,trongkhiđóC++chỉchấpnhậnmộtcách:
1.2
1.2
1.2
1.2
Khai
Khai
Khai
Khai
b
b
b
b
á
á
á
á
o
o
o
o
h
h
h
h
à
à
à
à
m
m
m
m
nguy
nguy
nguy
nguy
ê
ê
ê
ê
n
n
n
n
m
m
m
m
ẫ
ẫ
ẫ
ẫ
u
u
u
u
TrongANSIC,khisửdụngmộthàmchađợcđịnhnghĩatrớcđótrong
cùngmộttệp,tacóthể:
3.
khôngcầnkhaibáo(khiđóngầmđịnhgiátrịtrảvềcủahàmlàint)
4.
chỉcầnkhaibáotênhàmvàgiátrịtrảvề,khôngcầndanhsáchkiểucủa
cácthamsố.
5.khaibáohàmnguyênmẫu.
VớiC++,chỉcóphơngphápthứ3làchấpnhậnđợc.Nóicáchkhác,mộtlời
gọihàmchỉđợcchấpnhậnkhitrìnhbiêndịchbiếtđợckiểucủacácthamsố,
kiểucủagiátrịtrảvề.Mỗikhitrìnhbiêndịchgặpmộtlờigọihàm,nósẽsosánh
cáckiểucủacácđốisốđợctruyềnvớicácthamsốhìnhthứctơngứng.Trong
trờnghợpcósựkhácnhau,cóthểthựchiệnmộtsốchuyểnkiểutựđộngđểcho
hàmnhậnđợccódanhsáchcácthamsốđúngvớikiểuđãđợckhaibáocủahàm.
Tuynhiênphảituântheonguyêntắcchuyểnkiểutựđộngsauđây:
char
char
char
char
>
int
int
int
int
>
longint
longint
longint
longint
>
float
float
float
float
>
double
double
double
double
V
V
V
V
í
í
í
í
d
d
d
d
ụ
ụ
ụ
ụ
2.1
2.1
2.1
2.1
doublefexple(int,double)
/*khaibáohàmfexple*/
/*cảCvàC++chophép*/
double
fexple(intu,double
v)
int
u;
double
v;
{}
/*C++khôngcókhaibáokiểunày*/
double
fexple(u,v)
int
u;
double
v;
{}
CácmởrộngcủaC++
-14-
main(){
int
n;
char
c;
double
z,res1,res2,res3;
res1
=
fexple(n,z);
/*khôngcóchuyểnđổikiểu*/
res2
=
fexple(c,z);
/*cóchuyểnđổ
i
kiểu,từchar(c)thànhint*/
res3
=
fexple(z,n);
/*cóchuyểnđổ
i
kiểu,từdouble(z)thànhintvà
t
ừint(n)
thànhdouble*/
}
TrongC++bắtbuộcphảicótừkhoávoid
void
void
void
trớctêncủahàmtrongphầnkhai
báođểchỉrằnghàmkhôngtrảvềgiátrị.Trờnghợpkhôngcó,trìnhbiêndịch
ngầmhiểukiểucủagiátrịtrảvềlàint
int
int
int
vànhthếtrongthânhàmbắtbuộcphảicó
câulệnhreturn
return
return
return
.Điềunàyhoàntoànkhôngcầnthiếtđốivớimôtảtrongngônngữ
C.
Thựcra,cáckhảnăngvừamôtảkhônghoàntoànlàđiểmkhôngtơngthích
giữaCvàC++màđóchỉlàsựgạnlọccácđiểmyếuvàhoànthiệncácmặtcòn
chahoànchỉnhcủaC.
1.3
1.3
1.3
1.3
S
S
S
S
ự
ự
ự
ự
t
t
t
t
ơ
ơ
ơ
ơ
ng
ng
ng
ng
th
th
th
th
í
í
í
í
ch
ch
ch
ch
gi
gi
gi
gi
ữ
ữ
ữ
ữ
a
a
a
a
con
con
con
con
tr
tr
tr
tr
ỏ
ỏ
ỏ
ỏ
void
void
void
void
v
v
v
v
à
à
à
à
c
c
c
c
á
á
á
á
c
c
c
c
con
con
con
con
tr
tr
tr
tr
ỏ
ỏ
ỏ
ỏ
kh
kh
kh
kh
á
á
á
á
c
c
c
c
TrongANSIC,kiểuvoid
void
void
void
*
*
*
*
tơngthíchvớicáckiểutrỏkháccảhaichiều.
Chẳnghạnvớicáckhaibáosau:
void*gen;
int*adj;
haiphépgánsauđâylàhợplệtrongANSIC:
gen
=
adj;
adj
=
gen;
Thựcra,haicâulệnhtrênđãkèmtheocácphépchuyểnkiểungầmđịnh:
int*
int*
int*
int*
>
void*
void*
void*
void*
đốivớicâulệnhthứnhất,và
void*
void*
void*
void*
>
int*
int*
int*
int*
đốivớicâulệnhthứhai.
CácmởrộngcủaC++
-15-
TrongC++,chỉcóchuyểnđổikiểungầmđịnhtừmộtkiểutrỏtuỳýthành
void*
void*
void*
void*
làchấpnhậnđợc,cònmuốnchuyểnđổingợclại,taphảithựchiệnchuyển
kiểutờngminhnhcáchviếtsauđây:
gen
=
adj;
adj
=
(int*)gen;
2.
2.
2.
2.
C
C
C
C
á
á
á
á
c
c
c
c
kh
kh
kh
kh
ả
ả
ả
ả
n
n
n
n
ă
ă
ă
ă
ng
ng
ng
ng
v
v
v
v
à
à
à
à
o/ra
o/ra
o/ra
o/ra
m
m
m
m
ớ
ớ
ớ
ớ
i
i
i
i
c
c
c
c
ủ
ủ
ủ
ủ
a
a
a
a
C++
C++
C++
C++
Cáctiệníchvào/ra(hàmhoặcmacro)củathviệnCchuẩnđềucóthểsửdụng
trongC++.Đểsửdụngcáchàmnàychúngtachỉcầnkhaibáotệptiêuđềtrongđó
cóchứakhaibáohàmnguyênmẫucủacáctiệníchnày.
Bêncạnhđó,C++còncàiđặtthêmcáckhảnăngvào/ramớidựatrênhaitoán
tử<<(xuất)và>>(nhập)vớicácđặctínhsauđây:
6.
đơngiảntrongsửdụng
7.cókhảnăngmởrộngđốivớicáckiểumớitheonhucầucủangờilập
trình.
Trongtệptiêuđề
iostream.h
ngờitađịnhnghĩahaiđốitợngcout
cout
cout
cout
vàcin
cin
cin
cin
tơngứngvớihaithiếtbịchuẩnra/vàođợcsửdụngcùngvới<<và>>.Thông
thờngtahiểucout
cout
cout
cout
làmànhìnhcòncin
cin
cin
cin
làbànphím.
2.1
2.1
2.1
2.1
Ghi
Ghi
Ghi
Ghi
d
d
d
d
ữ
ữ
ữ
ữ
li
li
li
li
ệ
ệ
ệ
ệ
u
u
u
u
l
l
l
l
ê
ê
ê
ê
n
n
n
n
thi
thi
thi
thi
ế
ế
ế
ế
t
t
t
t
b
b
b
b
ị
ị
ị
ị
ra
ra
ra
ra
chu
chu
chu
chu
ẩ
ẩ
ẩ
ẩ
n
n
n
n
(m
(m
(m
(m
à
à
à
à
n
n
n
n
h
h
h
h
ì
ì
ì
ì
nh)
nh)
nh)
nh)
cout
cout
cout
cout
Trongphầnnàytaxemxétmộtsốvídụminhhoạcáchsửdụngcout
cout
cout
cout
và<<
đểđathôngtinramànhình.
V
V
V
V
í
í
í
í
d
d
d
d
ụ
ụ
ụ
ụ
2.2
2.2
2.2
2.2
Chơngtrìnhsauminhhoạcáchsửdụngcout
cout
cout
cout
đểđaramànhìnhmộtxâuký
tự.
#include
<iostream.h>
/*phảikhaibáokhimuốnsửdụngcout*/
main()
{
cout
<<
"Welcome
C++";
}
WelcomeC++
<<
làmộttoántửhaingôi,toánhạngởbêntráimôtảnơikếtxuấtthôngtin
(cóthểlàmộtthiếtbịngoạivichuẩnhaylàmộttậptin),toánhạngbênphảicủa
<<
làmộtbiểuthứcnàođó.Trongchơngtrìnhtrên,câulệnh
cout
<<"Welcome
C++"
đaramànhìnhxâukýtự
Welcome
C++
.
CácmởrộngcủaC++
-16-
V
V
V
V
í
í
í
í
d
d
d
d
ụ
ụ
ụ
ụ
2.3
2.3
2.3
2.3
Sửdụngcout
cout
cout
cout
và<<đaracácgiátrịkhácnhau:
#include
<iostream.h>
/*phảikhaibáokhimuốnsửdụngcout*/
voidmain()
{
int
n=
25;
cout
<<
"Value
:
";
cout
<<n;
}
Value:25
Trongvídụnàychúngtađãsửdụngtoántử<<đểinramànhìnhđầutiênlà
mộtxâukýtự,sauđólàmộtsốnguyên.Chứcnăngcủatoántử
<<
rõrànglà
khácnhautronghailầnkếtxuấtdữliệu:vớicâulệnhthứnhất,chỉđaramànhình
mộtdãycáckýtự,ởcâulệnhsau,đãsửdụngmộtkhuônmẫuđểchuyểnđổimột
giátrịnhịphânthànhmộtchuỗicáckýtựchữsố.Việcmộttoántửcónhiềuvaitrò
khácnhauliênquanđếnmộtkháiniệmmớitrongC++,đólà
Địnhnghĩachồng
toántử
.Điềunàysẽđợcđềcậpđếntrongchơng4.
V
V
V
V
í
í
í
í
d
d
d
d
ụ
ụ
ụ
ụ
2.4
2.4
2.4
2.4
Trongvídụnàytagộpcảhaicâulệnhkếtxuấttrongvídụ2.3thànhmộtcâu
lệnhphứctạphơn,tuykếtquảkhôngkháctrớc:
#include
<iostream.h>
/*phảikhaibáokhimuốnsửdụngcout*/
voidmain()
{
int
n=
25;
cout
<<
"Value
:"
<<n;
}
Value:25
2.2
2.2
2.2
2.2
C
C
C
C
á
á
á
á
c
c
c
c
kh
kh
kh
kh
ả
ả
ả
ả
n
n
n
n
ă
ă
ă
ă
ng
ng
ng
ng
vi
vi
vi
vi
ế
ế
ế
ế
t
t
t
t
ra
ra
ra
ra
tr
tr
tr
tr
ê
ê
ê
ê
n
n
n
n
cout
cout
cout
cout
.
.
.
.
Chúngtavừaxemxétmộtvàivídụviếtmộtxâukýtự,mộtsốnguyên.Một
cáchtổngquát,chúngtacóthểsửdụngtoántử<<cùngvớicout
cout
cout
cout
đểđaramàn
hìnhgiátrịcủamộtbiểuthứccócáckiểusau:
8.
kiểudữliệucơsở(char
char
char
char
,
int
int
int
int
,
float
float
float
float
,
double
double
double
double
),
9.xâukýtự:(char
char
char
char
*
),
10.
contrỏ(trừcontrỏchar
char
char
char
*)
CácmởrộngcủaC++
-17-
Trongtrờnghợpmuốnđarađịachỉbiếnxâukýtựphảithựchiệnphép
chuyểnkiểutờngminh,chẳnghạn
(
char
char
char
char
*)
>
(
void
void
void
void
*)
.
Xétvídụsauđây:
V
V
V
V
í
í
í
í
d
d
d
d
ụ
ụ
ụ
ụ
2.4
2.4
2.4
2.4
#include
<iostream.h>
voidvoidmain(){
int
n=
25;
long
p=
250000;
unsigned
q=
63000;
char
c=
'a';
float
x=
12.3456789;
double
y=
12.3456789e16;
char
*
ch
=
"Welcome
C++";
int*ad
=
&n;
cout
<<"Value
of
n:"
<<
n
<<"\n";
cout
<<"Value
of
p:"
<<
p
<<"\n";
cout
<<"Value
of
c:"
<<
c
<<"\n";
cout
<<"Value
of
q:"
<<
q
<<"\n";
cout
<<"Value
of
x:"
<<
x
<<"\n";
cout
<<"Value
of
y:"
<<
y
<<"\n";
cout
<<"Value
ofch
:"
<<ch
<<"\n";
cout
<<"Addrese
of
n:"
<<ad
<<"\n";
cout
<<"Addrese
dech
:"
<<
(void*)ch<<"\n";
}
Valueofn:25
Valueofp:250000
Valueofc:a
Valueofq:63000
Valueofx:12.345679
Valueofy:1.234567e+17
Valueofch:WelcomeC++
Addreseofn:0xfff2
Addresedech:0x00b2
CácmởrộngcủaC++
-18-
2.3
2.3
2.3
2.3
Đọ
Đọ
Đọ
Đọ
c
c
c
c
d
d
d
d
ữ
ữ
ữ
ữ
li
li
li
li
ệ
ệ
ệ
ệ
u
u
u
u
t
t
t
t
ừ
ừ
ừ
ừ
thi
thi
thi
thi
ế
ế
ế
ế
t
t
t
t
b
b
b
b
ị
ị
ị
ị
v
v
v
v
à
à
à
à
o
o
o
o
chu
chu
chu
chu
ẩ
ẩ
ẩ
ẩ
n
n
n
n
(b
(b
(b
(b
à
à
à
à
n
n
n
n
ph
ph
ph
ph
í
í
í
í
m
m
m
m
)
)
)
)
cin
cin
cin
cin
Nếunhcout
cout
cout
cout
dùngđểchỉthiếtbịrachuẩn,thìcin
cin
cin
cin
đợcdùngđểchỉmột
thiếtbịvàochuẩn.Mộtcáchtơngtự,toántử>>đợcdùngkèmvớicin
cin
cin
cin
đểnhập
vàocácgiátrị;haicâulệnh
int
n;
cin
>>n;
yêucầuđọccáckýtựtrênbànphímvàchuyểnchúngthànhmộtsốnguyênvà
gánchobiếnn.
Giốngnhcout
cout
cout
cout
và
<<
,cóthểnhậpnhiềugiátrịcùngkiểuhaykháckiểu
bằngcáchviếtliêntiếptêncácbiếncầnnhậpgiátrịcùngvới
>>
ngaysaucin
cin
cin
cin
.
Chẳnghạn:
int
n;
float
p;
char
c;
cin
>>
c
>>
n
>>p;
Cóthểsửdụngtoántử
>>
đểnhậpdữliệuchocácbiếncókiểu
char
char
char
char
,int
int
int
int
,
float
float
float
float
,double
double
double
double
vàchar
char
char
char
*.
Giốngvớihàm
scanf()
,cin
cin
cin
cin
tuântheomộtsốquiớcdùngtrongviệcphân
tíchcáckýtự:
(i)
Cácgiátrịsốđợcphâncáchbởi:SPACE,TAB,CR,LF.Khigặpmộtký
tựkhônghợplệ(dấu.đốivớisốnguyên,chữcáiđốivớisố, )sẽ
kếtthúcviệcđọctừcin
cin
cin
cin
;kýtựkhônghợplệnàysẽđợcxemxéttrong
lầnđọcsau.
(ii)Đốivớigiátrịxâukýtự,dấuphâncáchcũnglàSPACE,TAB,CR,còn
đốivớigiátrịkýtự,dấuphâncáchlàkýtựCR.Tronghaitrờnghợpnày
khôngcókháiniệmkýtựkhônghợplệ.MãsinhradobấmphímEnter
củalầnnhậptrớcvẫnđợcxéttronglầnnhậpxâu/kýtựtiếptheovàdo
vậysẽcónguycơkhôngnhậpđợcđúnggiátrịmongmuốnkhiđara
lệnhnhậpxâukýtựhoặckýtựngaysaucáclệnhnhậpcácgiátrịkhác.
Giảiphápkhắcphụcvấnđềnàyđểđảmbảocôngviệcdiễnrađúngtheoý
làtrớcmỗilầngọilệnhnhậpdữliệuchoxâu/kýtựtasửdụngmộttrong
haichỉthịsauđây:
fflush(stdin);
//khaibáotrong
stdio.h
cin.clear();
//hàmthànhphầncủa
l
ớpđịnhnghĩađố
i
tợng
cin
CácmởrộngcủaC++
-19-
Tathamkhảochơngtrìnhsau:
V
V
V
V
í
í
í
í
d
d
d
d
ụ
ụ
ụ
ụ
2.6
2.6
2.6
2.6
#include<iostream.h>
#include<conio.h>
voidmain()
{
int
n;
float
x;
chart[81];
clrscr();
do{
cout
<<
"Nhapvaomot
so
nguyen,
mot
xau,
mot
so
thuc
:";
cin
>>n>>t>>x;
cout
<<
"Danhap
"<<n<<
","
<<t<<
"
va"<<x<<
"\n";
}
while(n);
}
Nhapvaomotsonguyen,motxau,motsothuc:3long3.4
Danhap3,longva3.4
Nhapvaomotsonguyen,motxau,motsothuc:5hung5.6
Danhap5,hungand5.6
Nhapvaomotsonguyen,motxau,motsothuc:04
3
Danhap0,4va3
3.
3.
3.
3.
Nh
Nh
Nh
Nh
ữ
ữ
ữ
ữ
ng
ng
ng
ng
ti
ti
ti
ti
ệ
ệ
ệ
ệ
n
n
n
n
í
í
í
í
ch
ch
ch
ch
cho
cho
cho
cho
ng
ng
ng
ng
ờ
ờ
ờ
ờ
i
i
i
i
l
l
l
l
ậ
ậ
ậ
ậ
p
p
p
p
tr
tr
tr
tr
ì
ì
ì
ì
nh
nh
nh
nh
3.1
3.1
3.1
3.1
Ch
Ch
Ch
Ch
ú
ú
ú
ú
th
th
th
th
í
í
í
í
ch
ch
ch
ch
cu
cu
cu
cu
ố
ố
ố
ố
i
i
i
i
d
d
d
d
ò
ò
ò
ò
ng
ng
ng
ng
Mọikýhiệuđisau//chođếnhếtdòngđợccoilàchúthích,đợcchơng
trìnhdịchbỏquakhibiêndịchchơngtrình.
Xétvídụsau:
cout
<<
"Xin
chao\n";
//lờ
i
chàohỏi
Thờngtasửdụngchúthíchcuốidòngkhimuốngiảithíchýnghĩacủamột
câulệnhgìđó.Đốivớimộtđoạnchơngtrìnhkiểuchúthíchgiớihạnbởi/*và
*/chophépmôtảđợcnhiềuthôngtinhơn.
CácmởrộngcủaC++
-20-
3.2
3.2
3.2
3.2
Khai
Khai
Khai
Khai
b
b
b
b
á
á
á
á
o
o
o
o
m
m
m
m
ọ
ọ
ọ
ọ
i
i
i
i
n
n
n
n
ơ
ơ
ơ
ơ
i
i
i
i
TrongC++khôngnhấtthiếtphảinhómlênđầucáckhaibáođặtbêntrongmột
hàmhaymộtkhốilệnh,màcóthểđặtxenkẽvớicáclệnhxửlý.Vídụ.
{
int
n;
n=23;
cout
<<n<<"\n";
int*p=&n;
cout
<<p<<"\n";
}
Giátrịkhởiđầuchocácbiếncóthểthayđổitạicácthờiđiểmchạychơng
trìnhkhácnhau.
Mộtvídụminhhoạchokhảnăngđịnhnghĩakhắpmọinơilàcóthểkhaibáo
cácbiếnđiềukhiểnngaybêntrongcácvònglặpnếubiếnđóchađợckhaibáo
trớcđótrongcùngkhốilệnhcũngnhkhôngđợckhaibáolạiởphầnsau.Xem
đoạnchơngtrìnhsau:
{
//chacói
for(inti=0; ; )
//khôngđợckhaibáo
i
}
3.3
3.3
3.3
3.3
To
To
To
To
á
á
á
á
n
n
n
n
t
t
t
t
ử
ử
ử
ử
ph
ph
ph
ph
ạ
ạ
ạ
ạ
m
m
m
m
vi
vi
vi
vi
::
::
::
::
Bìnhthờng,biếncụcbộchelấpbiếntoàncụccùngtên.Chẳnghạn:
#include
<iostream.h>
int
x;
main()
{
int
x=
10;
//xcụcbộ
cout<<x<<
\n
;
//xcụcbộ
}
CácmởrộngcủaC++
-21-
Trongnhữngtrờnghợpcầnthiết,khimuốntruyxuấttớibiếntoàncụcphảisử
dụngtoántử::
::
::
::
trớctênbiến:
#include
<iostream.h>
int
x;
main()
{
int
x=
10;
//xcụcbộ
::x
=
10;
//xtoàncục
cout<<x<<
\n
;
//xcụcbộ
cout<<::x<<
\n
;
//xtoàncục
}
4.
4.
4.
4.
H
H
H
H
à
à
à
à
m
m
m
m
inline
inline
inline
inline
TrongC++cóthểđịnhnghĩacáchàmđợcthaythếtrựctiếpthànhmãlệnh
máytạichỗgọi(inline)mỗilầnđợcthamchiếu.Điểmnàyrấtgiốngvớicáchhoạt
độngcủacácmacrocóthamsốtrongC.Ưuđiểmcủacáchàminline
inline
inline
inline
làchúng
khôngđòihỏicácthủtụcbổsungkhigọihàmvàtrảgiátrịvề.Dovậyhàminline
inline
inline
inline
đợcthựchiệnnhanhhơnsovớicáchàmthôngthờng.
Mộthàminline
inline
inline
inline
đợcđịnhnghĩavàđợcsửdụnggiốngnhbìnhthờng.
Điểmkhácnhauduynhấtlàphảiđặtmôtảinline
inline
inline
inline
trớckhaibáohàm.
Xétvídụsauđây:
V
V
V
V
í
í
í
í
d
d
d
d
ụ
ụ
ụ
ụ
2.7
2.7
2.7
2.7
#include
<iostream.h>
#include<math.h>
#include<conio.h>
inlinedoublenorme(double
vec[3]);
//khaibáohàminline
voidmain(){
clrscr();
doublev1[3],v2[3];
int
i;
for(i=0;i<3;i++)
{
v1[i]=i;v2[i]=2*i-1;}
cout
<<"norme
cua
v1
:
"<<norme(v1)<<"
-
norme
cua
v2
:
"<<norme(v2);
CácmởrộngcủaC++
-22-
getch();
}
/*Địnhnghĩahàminline*/
inlinedoublenorme(doublevec[3])
{
int
i;double
s=0;
for(i=0;i<3;i++)
s+=vec[i]*vec[i];
return(sqrt(s));
}
normecuav1:2.236068-normecuav2:3.316625
Hàm
norme()
nhằmmụcđíchtínhchuẩncủa
vector
vớibathànhphần.
Từkhoáinline
inline
inline
inline
yêucầuchơngtrìnhbiêndịchxửlýhàmnormekhácvớicác
hàmthôngthờng.Cụthểlà,mỗilầngọi
norme()
,trìnhbiêndịchghéptrựctiếp
cácchỉthịtơngứngcủahàmvàotrongchơngtrình(ởdạngngônngữmáy).Do
đócơchếquảnlýlờigọivàtrởvềkhôngcầnnữa(khôngcầnlungữcảnh,sao
chépcácthôngsố ),nhờvậytiếtkiệmthờigianthựchiện.Bêncạnhđócácchỉthị
tơngứngsẽđợcsinhramỗikhigọihàmdođóchiphílutrữtănglênkhihàm
đợcgọinhiềulần.
Điểmbấtlợikhisửdụngcáchàminline
inline
inline
inline
lànếuchúngquálớnvàđợcgọi
thờngxuyênthìkíchthớcchơngtrìnhsẽtănglênrấtnhanh.Vìlýdonày,chỉ
nhữnghàmđơngiản,khôngchứacáccấutrúclặpmớiđợckhaibáolàhàminline
inline
inline
inline
.
Việcsửdụnghàminline
inline
inline
inline
sovớicácmacrocóthamsốcóhaiđiểmlợi.Trớc
hếthàminline
inline
inline
inline
cungcấpmộtcáchcócấutrúchơnkhimởrộngcáchàmđơngiản
thànhhàminline
inline
inline
inline
.Thựctếchothấykhitạomộtmacrocóthamsốthờnghayquên
cácdấuđóngngoặc,rấtcầnđếnđểđảmbảosựmởrộngnộituyếnriêngtrongmỗi
trờnghợp.Vớimacrocóthểgâyrahiệuứngphụhoặcbịhạnchếkhảnăngsử
dụng.Chẳnghạnvớimacro:
#define
square(x){x++*x++}
Vớilờigọi
square(a)
với
a
làbiếnsẽsảnsinhrabiểuthức
a++*a++
vàkếtquảlàlàmthayđổigiátrị
củabiếnatớihailần.
Cònlờigọi
CácmởrộngcủaC++
-23-
square(3)
sẽgâylỗibiêndịchvìtakhôngthểthựchiệncácphéptoántănggiảmtrêncác
toánhạnglàhằngsố.
Việcsửdụnghàminline
inline
inline
inline
nhmộtgiảiphápthaythếsẽtránhđợccáctình
huốngnhthế.
Ngoàira,cáchàminline
inline
inline
inline
cóthểđợctốiubởichơngtrìnhbiêndịch.
Điềuquantrọnglàđặctảinline
inline
inline
inline
chỉlàmộtyêucầu,chứkhôngphảilàmộtchỉ
thịđốivớitrìnhbiêndịch.Nếuvìmộtlýdonàođótrìnhbiêndịchkhôngthểđáp
ứngđợcyêucầu(chẳnghạnkhibêntrongđịnhnghĩahàminline
inline
inline
inline
cócáccấutrúc
lặp)thìhàmsẽđợcbiêndịchnhmộthàmbìnhthờngvàyêucầuinline
inline
inline
inline
sẽbịbỏ
qua.
Hàminline
inline
inline
inline
phảiđợckhaibáobêntrongtệptinnguồnchứacáchàmsửdụng
nó.Khôngthểdịchtáchbiệtcáchàminline
inline
inline
inline
.
1
5.
5.
5.
5.
Tham
Tham
Tham
Tham
chi
chi
chi
chi
ế
ế
ế
ế
u
u
u
u
NgônngữC++giớithiệumộtkháiniệmmớireferencetạmdịchlàtham
chiếu.Vềbảnchất,thamchiếulàbídanhcủamộtvùngnhớđợccấpphátcho
mộtbiếnnàođó.
Mộtthamchiếucóthểlàmộtbiến,thamsốhìnhthứccủahàmhaydùnglàm
giátrịtrảvềcủamộthàm.Cácphầntiếpsaulầnlợtgiớithiệucáckhảnăngcủa
thamchiếuđợcsửdụngtrongchơngtrìnhviếtbằngngônngữC++.
5.1
5.1
5.1
5.1
Tham
Tham
Tham
Tham
chi
chi
chi
chi
ế
ế
ế
ế
u
u
u
u
t
t
t
t
ớ
ớ
ớ
ớ
i
i
i
i
m
m
m
m
ộ
ộ
ộ
ộ
t
t
t
t
bi
bi
bi
bi
ế
ế
ế
ế
n
n
n
n
Xéthaichỉthị:
int
n;
int
&p=n;
Trongchỉthịthứhai,dấu
&
đểxácđịnhplàmộtbiếnthamchiếucòndấu
=
vàtênbiến
n
đểxácđịnhvùngnhớmàpthamchiếutới.Lúcnàycảhaiđịnhdanh
p
và
n
cùngxácđịnhvùngnhớđợccấpphátchobiếnn.Nhvậycácchỉthịsau:
n
=3;
cout<<p;
1
Biêndịchtáchbiệtchophépkhaibáohàmtrongmộttệptiêuđề,cònđịnhnghĩa
hàmđólạiởtrongtậptinchơngtrìnhsửdụnghàm.
CácmởrộngcủaC++
-24-
chokếtquả3trênthiếtbịhiểnthị.
Xétvềbảnchấtthamchiếuvàthamtrỏgiốngnhauvìcùngchỉđếncácđối
tợngcóđịachỉ,cùngđợccấpphátđịachỉkhikhaibáo.Nhngcáchsửdụng
chúngthìkhácnhau.Khinóiđếnthamchiếu
&p
taphảigắnnóvớimộtbiếnnào
đóđãkhaibáoqua&p=n,trongkhiđókhaibáocontrỏ
*p
khôngnhấtthiết
phảikhởitạogiátrịchonó.Trongchơngtrìnhbiếntrỏcóthểthamchiếuđến
nhiềubiếnkhácnhaucònbiếnthamchiếuthìvánđãđóngthuyềntừkhikhaibáo,
cónghĩalàsaukhikhởitạochothamchiếugắnvớimộtbiếnnàođórồithìta
khôngthểthayđổiđểgắntamchiếuvớimộtbiếnkhác.
Xétcácchỉthịsau:
V
V
V
V
í
í
í
í
d
d
d
d
ụ
ụ
ụ
ụ
2.8
2.8
2.8
2.8
int
n=3,m=4;
int*p;
p=&n;
//pch
ỉ
đếnn
*p=4;
//gángiátrịcủamchonthôngquacontrỏp
p=&m;
//chopchỉđếnm
int&q=n;
//khaibáothamchiếuqchỉđếnn
q=4;
//gánchobiếnngiátrị4
q=m;
//gángiátrịcủabiếnmchobiếnn.
Nóimộtcáchđơngiản,thamchiếucủamộtbiếngiốngnhbídanhcủamột
conngờinàođó.Cónghĩalàđểchỉđếnmộtconngờicụthểnàođó,tacóthể
đồngthờisửdụngtêncủaanhtahoặcbídanh.Dovậy,đểtruynhậpđếnvùngnhớ
tơngứngvớimộtbiến,chúngtacóthểsửdụnghoặclàtênbiếnhoặclàtêntham
chiếutơngứng.Đốivớiconngời,bídanhbaogiờcũngnhằmnóiđếnmộtngời
đãtồntại,vànhvậythamchiếucũngphảiđợckhaibáovàkhởitạosaukhibiến
đợckhaibáo.Chơngtrìnhsauđâysẽgâylỗibiêndịchdothamchiếuycha
đợckhởitạo.
V
V
V
V
í
í
í
í
d
d
d
d
ụ
ụ
ụ
ụ
2.9
2.9
2.9
2.9
Chơngtrìnhsai
#include
<iostream.h>
voidmain()
{
intx=3,&y;
//lỗiv
ì
yphảiđợckhởi
t
ạo
CácmởrộngcủaC++
-25-
cout<<"
x=
"<<x<<"\n"
<<"
y=
"<<y<<"\n";
y=
7;
cout<<"
x=
"<<x<<"\n"
<<"
y=
"<<y<<"\n";
}
Chơngtrìnhđúngnhsau:
#include
<iostream.h>
voidmain()
{
intx=3,&y=x;
//ybâygiờlàmột
b
í
danh
củax
cout<<"
x=
"<<x<<"\n"
<<"
y=
"<<y<<"\n";
y=
7;
cout<<"
x=
"<<x<<"\n"
<<"
y=
"<<y<<"\n";
}
x=3
y=3
x=7
y=7
Luýcuốicùnglàkhôngthểgắnmộtthamchiếuvớimộthằngsốtrừtrờng
hợpcótừkhoáconstđứngtrớckhaibáothamchiếu.Dễdàngkiểmtracácnhận
xétsau:
int
&p
=3;
//khônghợp
l
ệ
constint
&p
=3;
//hợplệ
5.2
5.2
5.2
5.2
Truy
Truy
Truy
Truy
ề
ề
ề
ề
n
n
n
n
tham
tham
tham
tham
s
s
s
s
ố
ố
ố
ố
cho
cho
cho
cho
h
h
h
h
à
à
à
à
m
m
m
m
b
b
b
b
ằ
ằ
ằ
ằ
ng
ng
ng
ng
tham
tham
tham
tham
chi
chi
chi
chi
ế
ế
ế
ế
u
u
u
u
TrongC,cácthamsốvàgiátrịtrảvềcủamộthàmđợctruyềnbằnggiátrị.
Đểgiảlậpcơchếtruyềnthambiếntaphảisửdụngcontrỏ.
TrongC++,việcdùngkháiniệmthamchiếutrongkhaibáothamsốhìnhthức
củahàmsẽyêucầuchơngtrìnhbiêndịchtruyềnđịachỉcủabiếnchohàmvàhàm
sẽthaotáctrựctiếptrêncácbiếnđó.Chơngtrìnhsauđarabacáchviếtkhác
nhaucủahàmthựchiệnviệchoánđổinộidungcủahaibiến.
CácmởrộngcủaC++
-26-
V
V
V
V
í
í
í
í
d
d
d
d
ụ
ụ
ụ
ụ
2.10
2.10
2.10
2.10
/*swap.cpp
swap.cpp
swap.cpp
swap.cpp
*/
#include<conio.h>
#include<iostream.h>
/*Hàmswap1đợcgọivớicácthamsốđợctruyềntheothamtr
ị
*/
void
swap1(int
x,
int
y){
inttemp
=x;
x=y;
y=
temp;
}
/*Hàmswap2thựchiệnviệctruyềnthamsốbằngthamtrỏ*/
void
swap2(int
*x,int*y)
{
inttemp
=
*x;
*x=
*y;
*y=
temp;
}
/*Hàmswap3thựchiệnviệctruyềnthamsốbằngthamchiếu*/
void
swap3(int
&x,int&y)
{
inttemp
=x;
x=y;
y=
temp;
}
voidmain()
{
inta=3,b=4;
clrscr();
cout
<<"Truoc
khigoi
swap1:\n";
cout<<"a
=
"<<a<<"
b=
"<<b<<"\n";
swap1(a,b);
cout<<"Saukhigoi
swap:\n";
cout<<"a
=
"<<a<<"
b=
"<<b<<"\n";
CácmởrộngcủaC++
-27-
a=3;
b
=4;
cout
<<"Truoc
khigoi
swap2:\n";
cout<<"a
=
"<<a<<"
b=
"<<b<<"\n";
swap2(&a,&b);
cout<<"Saukhigoi
swap2:\n";
cout<<"a
=
"<<a<<"
b=
"<<b<<"\n";
a=3;b=4;
cout
<<"Truoc
khigoi
swap3:\n";
cout<<"a
=
"<<a<<"
b=
"<<b<<"\n";
swap3(a,b);
cout<<"Saukhigoi
swap3:\n";
cout<<"a
=
"<<a<<"
b=
"<<b<<"\n";
getch();
}
Truockhigoiswap1:
a=3b=4
Saukhigoiswap1:
a=3b=4
Truockhigoiswap2
a=3b=4
Saukhigoiswap2:
a=4b=3
Truockhigoiswap3:
a=3b=4
Saukhigoiswap3:
a=4b=3
Trongchơngtrìnhtrên,tatruyềnthamsố
a,b
chohàm
swap1()
theothamtrị
chonêngiátrịcủachúngkhôngthayđổitrớcvàsaukhigọihàm.
Giảiphápđaratronghàm
swap2()
làthayvìtruyềntrựctiếpgiátrịhaibiến
avàbngờitatruyềnđịachỉcủachúngrồithôngquacácđịachỉnàyđểxácđịnh
giátrịbiến.Bằngcáchđógiátrịcủahaibiếnavàbsẽhoánđổichonhausaulời
gọihàm.Khácvới
swap2()
,hàm
swap3()
đaragiảiphápsửdụngthamchiếu.
Cácthamsốhìnhthứccủahàmswap3()bâygiờlàcácthamchiếuđếncáctham
sốthựcđợctruyềnchohàm.Nhờvậymàgiátrịcủahaithamsốthựcavàbcóthể
hoánđổiđợcchonhau.
CácmởrộngcủaC++
-28-
Cómộtvấnđềmàchắcrằngbạnđọcsẽphânvân:làmthếnàođểkhởitạo
cácthamsốhìnhthứclàthamchiếu.Xintharằngđiềuđóđợcthựchiệntựđộng
trongmỗilờigọihàmchứkhôngphảitrongđịnhnghĩa.Từđónảysinhthêmmột
nhậnxétquantrọng:thamsốứngvớithamsốhìnhthứclàthamchiếuphảilàbiến
trừtrờnghợpcótừkhoáconstđứngtrớckhaibáothamsốhìnhthức.Chẳnghạn
khôngthểthựchiệnlờigọihàmsau:
swap3(2,3);
BạnđọccóthểxemthêmphầnHàmthiếtlậpsaochéplạiđểthấyđợcích
lợitolớncủaviệctruyềnthamsốchohàmbằngthamchiếu.
Ch
Ch
Ch
Ch
ú
ú
ú
ú
ý
ý
ý
ý
:khimuốntruyềnbằngthambiếnmộtbiếntrỏthìviếtnhsau:
int
*
&
adr;
//adr
l
àmộtthamchiếutớimộtbiếntrỏchỉđếnmộtbiếnnguyên.
5.3
5.3
5.3
5.3
Gi
Gi
Gi
Gi
á
á
á
á
tr
tr
tr
tr
ị
ị
ị
ị
tr
tr
tr
tr
ả
ả
ả
ả
v
v
v
v
ề
ề
ề
ề
c
c
c
c
ủ
ủ
ủ
ủ
a
a
a
a
h
h
h
h
à
à
à
à
m
m
m
m
l
l
l
l
à
à
à
à
tham
tham
tham
tham
chi
chi
chi
chi
ế
ế
ế
ế
u
u
u
u
Địnhnghĩacủahàmcódạngnhsau:
<type>
&
fct( )
{
return<bien
co
pham
vi
toancuc>;
}
Trongtrờnghợpnàybiểuthứcđợctrảlạitrongcâulệnhreturn
return
return
return
phảilàtên
củamộtbiếnxácđịnhtừbênngoàihàm,bởivìchỉkhiđómớicóthểsửdụngđợc
giátrịcủahàm.Khitatrảvềmộtthamchiếuđếnmộtbiếncụcbộkhaibáobên
tronghàm,biếncụcbộnàysẽbịmấtđikhikếtthúcthựchiệnhàmvàdovậy,tham
chiếucủahàmcũngkhôngcòncóýnghĩanữa.
Khigiátrịtrảvềcủahàmlàthamchiếu,tacóthểgặpcáccâulệnhgánkỳdị
trongđóvếtráilàmộtlờigọihàmchứkhôngphảilàtêncủamộtbiến.Điềunày
hoàntoànhợplý,bởilẽbảnthânhàmđócógiátrịtrảvềlàmộtthamchiếu.Nói
cáchkhác,vếtráicủalệnhgán(biểuthứcgán)cóthểlàlờigọiđếnmộthàmcógiá
trịtrảvềlàmộtthamchiếu.
Xétvídụsauđây:
V
V
V
V
í
í
í
í
d
d
d
d
ụ
ụ
ụ
ụ
2.11
2.11
2.11
2.11
/*fr.cpp*/
/*fr.cpp*/
/*fr.cpp*/
/*fr.cpp*/
#include<iostream.h>
#include<conio.h>
inta[5];
CácmởrộngcủaC++
-29-
int
&fr(int
*d,inti);
voidmain()
{
clrscr();
cout<<"Nhap
giatrichomanga:\n";
for(inti=0;i<5;i++)
{
cout<<"a["<<i<<"]=
";
cin>>fr(a,i);
}
cout<<"Mang
a
saukhi
nhap\n";
for(i=0;i<5;i++)
cout<<a[i]<<"
";
cout<<"\n";
getch();
}
int
&fr(int
*d,int
i){
returnd[i];
}
Nhapgiatrichomanga:
a[0]=6
a[1]=4
a[2]=3
a[3]=5
a[4]=6
Mangasaukhinhap
64356
BạnđọccóthểxemthêmphầnĐịnhnghĩachồngtoántửđểthấyđợclợi
íchcủavấnđềtrảvềthamchiếuchohàm.
6.
6.
6.
6.
Đị
Đị
Đị
Đị
nh
nh
nh
nh
ngh
ngh
ngh
ngh
ĩ
ĩ
ĩ
ĩ
a
a
a
a
ch
ch
ch
ch
ồ
ồ
ồ
ồ
ng
ng
ng
ng
h
h
h
h
à
à
à
à
m
m
m
m
(
(
(
(
Overloading
Overloading
Overloading
Overloading
functions
functions
functions
functions
)
)
)
)
C++chophépsửdụngmộttênchonhiềuhàmkhácnhautagọiđólàsự
chồnghàm.Trongtrờnghợpđó,cáchàmsẽkhácnhauởgiátrịtrảvềvàdanh
sáchkiểucácthamsố.Chẳnghạnchúngtamuốnđịnhnghĩacáchàmtrảvềsốnhỏ
nhấttrong:
CácmởrộngcủaC++
-30-
11.haisốnguyên
12.haisốthực
13.haikýtự
14.
basốnguyên
15.
mộtdãycácsốnguyên
Dĩnhiêncóthểtìmchomỗihàmnhvậymộttênphân.Lợidụngkhảnăng
địnhnghĩachồnghàmcủaC++,chúngtacóthểviếtcáchàmnhsau:
V
V
V
V
í
í
í
í
d
d
d
d
ụ
ụ
ụ
ụ
2.12
2.12
2.12
2.12
#include
<iostream.h>
//Hàmnguyênmẫu
int
min(int,
int);
//Hàm1
double
min(double,double);
//Hàm2
char
min(char,
char);
//Hàm3
int
min(int,
int,int);
//Hàm4
int
min(int,
int*);
//Hàm5
main()
{
intn=10,
p
=12,
q=
-12;
double
x=
2.3,
y=
-1.2;
char
c=A,
d=
Q;
inttd[7]
=
{1,3,4,-2,0,23,9};
cout<<
min(n,p)
:
<<min(n,p)<<
\m
;
//Hàm1
cout<<
min(n,p,q)
:
<<min(n,p,q)<<
\m
;
//Hàm4
cout<<
min(c,d)
:
<<min(c,d)<<
\m
;
//Hàm3
cout<<
min(x,y)
:
<<min(n,p)<<
\m
;
//Hàm2
cout<<
min(td)
:
<<min(7,td)<<
\m
;
//Hàm5
cout<<
min(n,x)
:
<<min(n,x)<<
\m
;
//Hàm2
//cout<<
min(n,p,x):
<<min(n,p,x)<<
\m
;//Lỗi
}
intmin(int
a,
int
b)
{
return(a>
b?a:
b);
}
intmin(int
a,
int
b,
int
c)
{
CácmởrộngcủaC++
-31-
return
(min(min(a,b),c));
}
double
min(double
a,
double
b)
{
return(a>
b?a:
b);
}
char
min(char
a,
char
b)
{
return(a>
b?a:
b);
}
intmin(int
n,
int*t)
{
intres
=
t[0];
for(inti=1;i<n;i++)
res
=
min(res,t[i]);
returnres;
}
Nh
Nh
Nh
Nh
ậ
ậ
ậ
ậ
n
n
n
n
x
x
x
x
é
é
é
é
t
t
t
t
16.
Mộthàmcóthểgọiđếnhàmcùngtênvớinó(vídụnhhàm4,5gọihàm1).
17.
Trongtrờnghợpcócáchàmtrùngtêntrongchơngtrình,việcxácđịnh
hàmnàođợcgọidochơngtrìnhdịchđảmnhiệmvàtuântheocác
nguyêntắcsau:
Trờnghợpcáchàmcómộ
t
thamsố
Chơngtrìnhdịchtìmkiếmsựtơngứngnhiềunhấtcóthểđợc;cócác
mứcđộtơngứngnhsau(theođộutiêngiảmdần):
a)Tơngứngthậtsự:taphânbiệtcáckiểudữliệucơsởkhácnhauđồngthời
luýđếncảdấu.
b)
Tơngứngdữliệusốnhngcósựchuyểnđổikiểudữliệutựđộng
(numericpromotion):
char
char
char
char
vàshort
short
short
short
>
int
int
int
int
;
float
float
float
float
>
int.
int.
int.
int.
c)
CácchuyểnđổikiểuchuẩnđợcCvàC++chấpnhận.
d)Cácchuyểnđổikiểudongờisửdụngđịnhnghĩa.
Quátrìnhtìmkiếmbắtđầutừmứccaonhấtvàdừnglạiởmứcđầutiêncho
phéptìmthấysựphùhợp.Nếucónhiềuhàmphùhợpởcùngmộtmức,chơng
trìnhdịchđarathôngbáolỗidokhôngbiếtchọnhàmnàogiữacáchàmphùhợp.
CácmởrộngcủaC++
-32-
Trờnghợpcáchàmcónhiềuthamsố
ýtởngchunglàphảitìmmộthàmphùhợpnhấtsovớitấtcảnhữnghàmcòn
lại.Đểđạtmụcđíchnày,chơngtrìnhdịchchọnchomỗithamsốcáchàmphùhợp
(ởtấtcảcácmứcđộ).Trongsốcáchàmđợclựachọn,chơngtrìnhdịchchọnra
(nếutồntạivàtồntạiduynhất)hàmsaochođốivớimỗiđốisốnóđạtđợcsựphù
hợphơncảsovớicáchàmkhác.
Trongtrờnghợpvẫncónhiềuhàmthoảmãn,lỗibiêndịchxảyradochơng
trìnhdịchkhôngbiếtchọnhàmnàotrongsốcáchàmthỏamãn.Đặcbiệtluýkhi
sửdụngđịnhnghĩachồnghàmcùngvớiviệckhaibáocáchàmvớithamsốcógiá
trịngầmđịnhsẽđợctrìnhbàytrongmụctiếptheo.
7.
7.
7.
7.
Tham
Tham
Tham
Tham
s
s
s
s
ố
ố
ố
ố
ng
ng
ng
ng
ầ
ầ
ầ
ầ
m
m
m
m
đị
đị
đị
đị
nh
nh
nh
nh
trong
trong
trong
trong
l
l
l
l
ờ
ờ
ờ
ờ
i
i
i
i
g
g
g
g
ọ
ọ
ọ
ọ
i
i
i
i
h
h
h
h
à
à
à
à
m
m
m
m
Taxétvídụsau:
V
V
V
V
í
í
í
í
d
d
d
d
ụ
ụ
ụ
ụ
2.13
2.13
2.13
2.13
#include
<iostream.h>
voidmain()
{
int
n=10,p=20;
void
fct(int,
int
=
12)
;
//khaibáohàmvớimộtgiátrịngầmđịnh
fct(n,p);
//lờigọithôngthờng,cóhaithamsố
fct(n);
//lờigọichỉvớ
i
mộtthamsố
//fct()sẽkhôngđợcchấpnhận
}
//khaibáobìnhthờng
voidfct(int
a,
int
b)
{
cout<<"tham
so
thunhat
:"
<<a<<"\n";
cout<<"tham
so
thuhai
:
"<<b<<"\n";
}
thamsothunhat:10
thamsothuhai:20
thamsothunhat:10
thamsothuhai:12
Trongkhaibáocủa
fct()
bêntronghàm
main()
:
void
fct(int,int
=12);
CácmởrộngcủaC++
-33-
khaibáo
int
=12
chỉrarằngtrongtrờnghợpvắngmặtthamsốthứhaiởlờigọihàmfct()thì
thamsốhìnhthứctơngứngsẽđợcgángiátrịngầmđịnh12.
Lờigọi
fct();
khôngđợcchấpnhậnbởivìkhôngcógiátrịngầmđịnhchothamsốthứnhất.
V
V
V
V
í
í
í
í
d
d
d
d
ụ
ụ
ụ
ụ
2.14
2.14
2.14
2.14
#include
<iostream.h>
voidmain(){
int
n=10,p=20;
void
fct(int
=0,
int
=
12);
//khaibáohàmvớ
i
haithamsốcógiátr
ị
ngầmđịnh
fct(n,p);
//lờigọithôngthờng,cóhaithamsố
fct(n);
//lờigọichỉvớ
i
mộtthamsố
fct()
;
//fct()đãđợcchấpnhận
}
voidfct(int
a,
int
b)
//khaibáobìnhthờng
{
cout<<"tham
so
thunhat
:"
<<a<<"\n";
cout<<"tham
so
thuhai
:
"<<b<<"\n";
}
thamsothunhat:10
thamsothuhai:20
thamsothunhat:10
thamsothuhai:12
thamsothunhat:0
thamsothuhai:12
Ch
Ch
Ch
Ch
ú
ú
ú
ú
ý
ý
ý
ý
18.Cácthamsốvớigiátrịngầmđịnhphảiđợcđặtởcuốitrongdanhsáchcác
thamsốcủahàmđểtránhnhầmlẫncácgiátrị.
19.
Cácgiátrịngầmđịnhcủathamsốđợckhaibáokhisửdụngchứkhông
phảitrongphầnđịnhnghĩahàm.Vídụsauđâygâyralỗibiêndịch:
CácmởrộngcủaC++
-34-
V
V
V
V
í
í
í
í
d
d
d
d
ụ
ụ
ụ
ụ
2.15
2.15
2.15
2.15
#include<conio.h>
#include
<iostream.h>
voidf();
voidmain()
{
clrscr();
int
n=10,p=20;
voidfct(int=0,int=12);
cout<<"Goi
fcttrong
main\n";
fct(n,p);
fct(n);
fct();
getch();
}
voidfct(int
a=10,int
b=100)
{
cout<<"Tham
so
thunhat
:
"<<a<<"\n";
cout<<"Tham
so
thuhai
:
"<<b<<"\n";
}
20.
Nếumuốnkhaibáogiátrịngầmđịnhchomộtthamsốbiếntrỏ,thìphải
chúýviết*và=cáchxanhauítnhấtmộtdấucách.
21.
Cácgiátrịngầmđịnhcóthểlàmộtbiểuthứcbấtkỳ(khôngnhấtthiếtchỉ
làbiểuthứchằng),cógiátrịđợctínhtạithờiđiểmkhaibáo:
float
x;
int
n;
void
fct(float
=
n*2+1.5);
22.Chồnghàmvàgọihàmvớithamsốcógiátrịngầmđịnhcóthểsẽdẫnđến
lỗibiêndịchkhichơngtrìnhdịchkhôngxácđịnhđợchàmphùhợp.
Xétvídụsau:
V
V
V
V
í
í
í
í
d
d
d
d
ụ
ụ
ụ
ụ
2.16
2.16
2.16
2.16
#include
<iostream.h>
void
fct(int,int=10);
void
fct(int);
voidmain()
{
CácmởrộngcủaC++
-35-
intn=10,p=20;
fct(n,p);
//OK
fct(n);
//ERROR
}
8.
8.
8.
8.
B
B
B
B
ổ
ổ
ổ
ổ
sung
sung
sung
sung
th
th
th
th
ê
ê
ê
ê
m
m
m
m
c
c
c
c
á
á
á
á
c
c
c
c
to
to
to
to
á
á
á
á
n
n
n
n
t
t
t
t
ử
ử
ử
ử
qu
qu
qu
qu
ả
ả
ả
ả
n
n
n
n
l
l
l
l
ý
ý
ý
ý
b
b
b
b
ộ
ộ
ộ
ộ
nh
nh
nh
nh
ớ
ớ
ớ
ớ
độ
độ
độ
độ
ng:
ng:
ng:
ng:
new
new
new
new
v
v
v
v
à
à
à
à
delete
delete
delete
delete
8.1
8.1
8.1
8.1
To
To
To
To
á
á
á
á
n
n
n
n
t
t
t
t
ử
ử
ử
ử
c
c
c
c
ấ
ấ
ấ
ấ
p
p
p
p
ph
ph
ph
ph
á
á
á
á
t
t
t
t
b
b
b
b
ộ
ộ
ộ
ộ
nh
nh
nh
nh
ớ
ớ
ớ
ớ
độ
độ
độ
độ
ng
ng
ng
ng
new
new
new
new
Vớikhaibáo
int
*
adr;
chỉthị
ad=
newint;
chophépcấpphátmộtvùngnhớcầnthiếtchomộtphầntửcókiểuintvàgán
choadrđịachỉtơngứng.LệnhtơngđơngtrongC:
ad
=(int
*)
malloc(sizeof(int));
Vớikhaibáo
char*adc;
chỉthị
adc=newchar[100];
chophépcấpphátvùngnhớđủchomộtbảngchứa100kýtựvàđặtđịachỉđầu
củavùngnhớchobiếnadc.LệnhtơngứngtrongCnhsau:
adc=(char
*)malloc(100);
Haicáchsửdụngnew
new
new
new
nhsau:
Dạng1
newtype;
giátrịtrảvềlà
(i)
mộtcontrỏđếnvịtrítơngứngkhicấpphátthànhcông
(ii)NULLtrongtrờnghợptráilại.
CácmởrộngcủaC++
-36-
Dạng2
new
type[n];
trongđónlàmộtbiểuthứcnguyênkhôngâmnàođó,khiđótoántửnew
new
new
new
xin
cấpphátvùngnhớđủđểchứanthànhphầnkiểu
type
vàtrảlạicontrỏđếnđầu
vùngnhớđónếunhcấpphátthànhcông.
8.2
8.2
8.2
8.2
To
To
To
To
á
á
á
á
n
n
n
n
t
t
t
t
ử
ử
ử
ử
gi
gi
gi
gi
ả
ả
ả
ả
i
i
i
i
ph
ph
ph
ph
ó
ó
ó
ó
ng
ng
ng
ng
v
v
v
v
ù
ù
ù
ù
ng
ng
ng
ng
nh
nh
nh
nh
ớ
ớ
ớ
ớ
độ
độ
độ
độ
ng
ng
ng
ng
delete
delete
delete
delete
Mộtvùngnhớđộngđợccấpphátbởinew
new
new
new
phảiđợcgiảiphóngbằngdelete
delete
delete
delete
màkhôngthểdùng
free
đợc,chẳnghạn:
deleteadr;
deleteadc;
V
V
V
V
í
í
í
í
d
d
d
d
ụ
ụ
ụ
ụ
2.17
2.17
2.17
2.17
Cấpphátbộnhớđộngchomảnghaichiều
#include<iostream.h>
void
Nhap(int
**mat);
//nhậpmatrậnhaichiều
voidIn(int**mat);
//Inmatrậnhaichiều
voidmain()
{
int**mat;
int
i;
/*cấpphá
t
mảng10contrỏnguyên*/
mat
=
newint*[10];
for(i=0;
i<10;i++)
/*mỗicontrỏnguyênxácđịnhvùngnhớ10sốnguyên*/
mat[i]
=
newint[10];
/*Nhậpsốliệuchomảngvừađợccấpphát*/
cout<<"Nhap
so
lieuchomatran
10*10\n";
Nhap(mat);
/*Inmatrận*/
cout<<"Ma
tranvuanhap\n";
In(mat);
/*Giảiphóngbộnhớ*/
for(i=0;i<10;i++)
C¸cmëréngcñaC++
-37-
deletemat[i];
deletemat;
}
void
Nhap(int
**
mat)
{
inti,j;
for(i=0;i<10;i++)
for(j=0;j<10;j++)
{
cout<<"Thanhphanthu
["<<i<<"]["<<j<<"]=
";
cin>>mat[i][j];
}
}
voidIn(int
**
mat)
{
inti,j;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
cout<<mat[i][j]<<"
";
cout<<"\n";
}
}
V
V
V
V
Ý
Ý
Ý
Ý
d
d
d
d
ô
ô
ô
ô
2.18
2.18
2.18
2.18
Qu¶nlýtrµnbénhí
set_new_handler
#include<iostream>
main()
{
void
outof();
set_new_handler(&outof);
longtaille;
int*adr;
intnbloc;
cout<<"Kich
thuoccannhap?
";