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

Giáo trình C++ - Đại Học Bách Khoa (phần 4) doc

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 (1.28 MB, 29 trang )

-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

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

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?
";

×