You are on page 1of 141

T hc C++ trong 21 ngy.

Teache yourself C++.

Danh mc:

Cc phn ca mt chng trnh C++.


Gii thiu hm Cout.
Cout.
Trnh by ch thch.
nh ngha hm.
Hng s v bin s.
Cc kiu bin s.
Typedef.
K t dc bit.
Hng s.
Hng s lit k.
Biu thc v cu lnh.
Cu lnh .
Biu thc.
Cc ton t.
Ton t tng v gim.
Cu lnh if.
Ton t l gc.
Ton t ph thuc.

Cc loi hm.
Khai bo hm
Nguyn mu hm.
Bin khu vc (bin a phng).
Bin ton cc.
Gi tr tr v.
Tham s mc nh.
Cc hm xp chng.

Trang 1
T hc C++ trong 21 ngy.
Cc hm InLine.

qui.

Cc lp c bn

To ra mt kiu mi.
Khai bo lp( class ).
nh ngha i tng (objects).
Private v public.
Class.
Cc hm trong lp.
Cch t khai bo lp v hm.

Cc loi vng lp.

Lnh goto.
While.
Continue v break.
While(1).
Do ... While.
FOR.
Vng lp lng.
Switch.

Con tr.

Con tr, a ch, bin.

Khai bo con tr.

Reference

Trang 2
T hc C++ trong 21 ngy.
C php:

I Cc phn ca chng trnh C++.


Cc chng trnh C++ bao gm : cc i tng (obj), cc bin (var) v
cc thnh phn khc.

I.1 Mt chng trnh n gin.


V d ly chng trnh HELLO.CPP gii thch cc phn ca mt chng
trnh C++.
1: #include <iostream.h>
2:
3: int main()
4: {
5: cout << "Hello World!\n";
6: return 0;
7: }
Hello World!
Dng 1 l th vin # iostream.h.

Trang 3
T hc C++ trong 21 ngy.
- K t u tin l biu tng # : l mt tn hiu cho b tin x l. Mi
ln bt u bin dch, b tin x l c chy. B tin x l c m
ngun ca bn, tm kim nhng dng bt u vi du ( #) v thc
hin cc dng ny trc khi bin dch.
- Include l mt lnh tin x l. Du ngoc n <file name > ch cho
b tin x l tm trong tt c cc v tr thng thng i vi file ny.
Nu b bin dch c thit lp ng, du ngoc < > s lm cho b
tin x l tm kim file " iostream.h" trong th mc m cha tt c cc
file H cho b bin dch.
- ( file "iostream.h" [ Input-Oput-Stream] c dng bi hm "cout"_ gip
cho vic vit ra mn hnh. )
- Dng 3 bt u chng trnh thng thng vi hm c tn " main() ". Mi
chng ttrnh C++ u c 1 hm main(). Ni chung," hm l 1 khi m
lnh m thc hin 1 hoc nhiu cng vic." Cc hm thng thng c
gi bi cc hm khc, nhng main() l c bit. Khi chng trnh bt
u, main() c t ng gi ln.
- ( main(), ging nh tt cc hm, phi nh r loi gi tr no n s tr v.
Kiu gi tr tr v i vi main() trong HELLO.CPP l "void" _ngha l
hm ny s khng tr v bt c gi tr no. )
- Tt c cc hm bt u vi mt ngoc m ({) v kt thc mt du
ngoc ng (}). Du ngoc ca main() l trn dng 4 v dng 7.
- Phn cn bn ca chng trnh l dng s 5. Hm "cout" dng in
mt bn tin ra mn hnh.
- Cch dng cout : t cout t sau ton t (<<). Bt c ci g sau du
ny th u c vit ln mn hnh. Nu bn mun vit mt chui k
t, phi vit chng trong du ngoc kp ("), nh dng 5.
- Cui cng l 2 k t : " \n " _ bo hm cout nhy xung mt dng mi
sau t Hello World ! y l m c bit c gii thch k phn sau.
- Trong quyn sch ny hm main() s lun tr v 0.

I.2 Mt ci nhn ngn gn v hm Cout.


Listing 2.2.Using cout.
1: // Listing 2.2 using cout
2:

Trang 4
T hc C++ trong 21 ngy.
3: #include <iostream.h>
4: int main()
5: {
6: cout << "Hello there.\n";
7: cout << "Here is 5: " << 5 << "\n";
8: cout << "The manipulator endl writes a new line to the screen." <<
endl;
9: cout << "Here is a very big number:\t" << 70000 << endl;
10: cout << "Here is the sum of 8 and 5:\t" << 8+5 << endl;
11: cout << "Here's a fraction:\t\t" << (float) 5/8 << endl;
12: cout << "And a very very big number:\t" << (double) 7000 * 7000 <<
endl;
13: cout << "Don't forget to replace Jesse Liberty with your name...\n";
14: cout << "Jesse Liberty is a C++ programmer!\n";
15: return 0;
16: }

Hello there.
Here is 5: 5
The manipulator endl writes a new line to the screen.
Here is a very big number: 70000
Here is the sum of 8 and 5: 13
Here's a fraction: 0.625
And a very very big number: 4.9e+07
Don't forget to replace Jesse Liberty with your name...
Jesse Liberty is a C++ programmer!

Ch : 3 gi tr c a ra trn dng 7, mi gi tr c tch ra bi ton t


chn. Gi tr u tin l chui " Here is 5: ". Ch c du cch sau du hai
chm. Du cch l mt phn ca chui. Tip n, gi tr 5 c a ra n
ton t chn v k t dng mi ( lun lun trong du ngoc kp hay du
ngoc n). iu ny to ra dng:
Here is 5: 5

Trang 5
T hc C++ trong 21 ngy.
c in ra mn hnh. V khng c k t dng mi nn gi tr sau s c
in ngay sau . y gi l mc ni 2 gi tr.
Trn dng 8, bn tin c in ra, v sau lnh " endl" c s dng. Mc
ch ca "endl " l vit mt dng mi ra mn hnh.

?Trn dng 9, ( \t) c a vo. y l chn mt k t "tab" v n c


dng trn dng 8-12. Dng 9 ch ra rng khng ch c cc s nguyn, s
nguyn di cng c in ra.
Dng 10 gii thch rng: cout s thc hin phn b sung n gin. Gi
tr ca 8+5 c a ra bi cout, nhng 13 c in ra.
Trn dng 11, gi tr 5/8 c chn vo cout. S hng (float) ch ra cho
cout rng bn mun gi tr ny c gi tr tng h s 10, v v vy mt
phn s c in.
Trn dng 12, gi tr 7000*7000 a ti cout v s hng (double) ch cho
cout bit bn mun ci ny c in ra s dng k hiu ton hc

I.3 Ch thch (Comments).


Dng gii thch cu lnh cho d hiu v gii thiu c cc thng
tin v tc gi v thi gian sa i mi nht cho d nng cp.
Trong C++ c hai cch bo hiu li ch thch l : ( // ) v ( /* ).
Du ( // ) ny bo cho chng trnh bin dch b qua tt c nhng g
sau du ch thch ny, ti tn ht dng.
Du ( /* ) ny bo cho chng trnh bin dch b qua tt c nhng g
sau du ch thch ny, ti khi tm thy mt ( /* ) khc.
Cch s dng Comments:
Mt qui lut chung, nn c mt ch thch u ca ton chng trnh,
ni ln chng ttrnh lm ci g.
Mi hm cng nn c ch thch gii thch hm lm ci g v n tr v
gi tr no.
Nu trong chng trnh c cu lnh no kh hiu th cng nn c ch
thch lm sng t vn .
Listing 2.3. HELP.CPP demonstrates comments.
1: #include <iostream.h>
2:
3: int main()

Trang 6
T hc C++ trong 21 ngy.
4: {
5: /* this is a comment
6: and it extends until the closing
7: star-slash comment mark */
8: cout << "Hello World!\n";
9: // this comment ends at the end of the line
10: cout << "That comment ended!\n";
11:
12: // double slash comments can be alone on a line
13: /* as can slash-star comments */
14: return 0;
15: }
Hello World!
That comment ended!
Ch thch u mi file.
- Thng tin v tn ca chng trnh.
- Tn ca file
- C hm hoc chng trnh g.
- M t chung v cng vic ca chng trnh.
- Tn tc gi.
- Lch s ca qu trnh sa i.
- Trnh bin dch v kt ni no v cc cng c khc c dng
thc hin chng trnh.
- Thm cc ch nu cn.
V d :
/************************************************************
Program: Hello World
File: Hello.cpp
Function: Main (complete program listing in this file)
Description: Prints the words "Hello world" to the screen
Author: Jesse Liberty (jl)
Environment: Turbo C++ version 4, 486/66 32mb RAM, Windows 3.1 DOS
6.0. EasyWin module.
Notes: This is an introductory, sample program.

Trang 7
T hc C++ trong 21 ngy.
Revisions: 1.00 10/1/94 (jl) First release 1.01 10/2/94 (jl) Capitalized "World"

************************************************************/

I.4 Hm ( Functions ).
Hm main() l c bit. Cc hm thng thng c gi trong chng
trnh ca bn. Mt chng trnh c x l tng dng theo th t m n c
trong m ngun, tn khi n mt hm. Sau chng trnh r nhnh
x l hm. Khi hm kt thc, n tr li iu khin cho dng m ngay sau
n.
Khi mt chng trnh cn thc hin mt dch v, n c th gi mt
hm thc hin dch v . V d sau minh ho iu :
Listing 2.4. Demonstrating a call to a function.
1: #include <iostream.h>
2:
3: // function Demonstration Function
4: // prints out a useful message
5: void DemonstrationFunction()
6: {
7: cout << "In Demonstration Function\n";
8: }
9:
10: // function main - prints out a message, then
11: // calls DemonstrationFunction, then prints out
12: // a second message.
13: int main()
14: {
15: cout << "In main\n" ;
16: DemonstrationFunction();
17: cout << "Back in main\n";
18: return 0;
19: }
In main

Trang 8
T hc C++ trong 21 ngy.
In Demonstration Function
Back in main

Cch s dng hm:


Hm hoc tr v gi tr hoc chng tr v void ( ngha l chng tr
v s khng "nothing" ).
Mt hm m cng hai s nguyn, phi tr v tng v v vy s c
nh ngha tr v mt gi tr s nguyn.
Mt hm m ch in mt bn tin khng c ci g tr v, v vy s
c khai bo tr v dng "void".
Mt hm bao gm : u v thn hm.
u bao gm ln lt : kiu tr v, tn hm, v cc tham s dnh cho
hm. Cc tham s dnh cho hm cho php cc gi tr c a vo bn
trong hm. V vy,nu hm cng 2 s, cc s s l tham s cho
hm.
V d mt u dng hm thng thng:
int Sum(int a, int b)
Mi tham s c khai bo cng vi kiu gi tr s a vo ; gi tr thng
thng c a vo bng cch gi hm c gi l i s. Nhiu nh lp
trnh s dng s dng hai s hng : tham s (parameters) v i s
(arguments) nh l " synonyms". Nhng ngi khc cn thn i vi vic
phn bit thc v chuyn mn. Trong sch ny s s dng cc s hng
c th hon i cho nhau.
Thn hm bao gm : mt du ngoc m, khng c hoc c cc cu
lnh v du ngoc ng. Cc lnh cu trc nn cng vic ca hm.
Mt hm c th tr v mt gi tr, s dng mt lnh tr v. Lnh ny
cng lm cho hm kt thc. Nu khng a vo mt lnh tr v bn
trong hm, n s t ng tr v dng void cui hm. Gi tr c tr v
phi l dng c khai bo u hm.
Listing 2.5. FUNC.CPP demonstrates a simple function.
1: #include <iostream.h>
2: int Add (int x, int y)
3: {
4:

Trang 9
T hc C++ trong 21 ngy.
5: cout << "In Add(), received " << x << " and " << y << "\n";
6: return (x+y);
7: }
8:
9: int main()
10: {
11: cout << "I'm in main()!\n";
12: int a, b, c;
13: cout << "Enter two numbers: ";
14: cin >> a;
15: cin >> b;
16: cout << "\nCalling Add()\n";
17: c=Add(a,b);
18: cout << "\nBack in main().\n";
19: cout << "c was set to " << c;
20: cout << "\nExiting...\n\n";
21: return 0;
22: }

I'm in main()!
Enter two numbers: 3 5

Calling Add()
In Add(), received 3 and 5

Back in main().
c was set to 8

Exiting...

Trang 10
T hc C++ trong 21 ngy.

II Hng s v bin s.

II.1 Bin s l g:
Trong C++, bin s l ni lu gi thng tin. Mt bin s l mt v
tr trong b nh ca my tnh m c th lu gi mt gi tr v t bn c
th truy nhp vo gi tr sau ny.
B nh ca my tnh c th c xem nh l mt lot cc "cubbyholes".
Mi "cubbyholes" hay v tr trong b nh c nh s ln lt. Nhng s ny
c bit l a ch b nh. Mt bin lu gi trong mt hoc nhiu
"cubbyholes" lu mt gi tr.
Tn bin ( v d : myVariable) l mt nhn trn 1 hay nhiu
"cubbyholes", v vy c th tm n d dng khng cn s hiu bit a
ch b nh thng thng ca n.
Cch thit lp bin:
Khi nh ngha mt bin trong C++, bn phi bo cho trnh bin dch
bit bin l kiu g : s nguyn, k t,.... y l thng tin bo cho trnh
bin dch bit kch thc ln bao nhiu thit lp mt khong b nh v
kiu gi tr bn mun lu trong bin ca bn.
Mi "cubbyholes" l ln 1 byte. Nu kiu bin to ra l kch thc 2 byte,
n cn 2 byte ca b nh, hay 2 "cubbyholes". Kiu bin s cho trnh bin
dch bit cn bao nhiu b nh dnh cho bin.

II.1.1 Kch thc kiu s nguyn (Intergers)


- Mt bin char (dng lu k t) thng l mt byte long. Mt short
interger l 2 byte trn hu ht cc my tnh, mt long interger thng
l 4 byte, v mt interger (khng phi l long hay short) c th l 2
hay 4 byte.
- Mt character l mt ch n, s, hay biu tng chim 1 byte ca b
nh.
Listing 3.1. Determining the size of variable types on your
computer.
1: #include <iostream.h>
2:
3: int main()
4: {

Trang 11
T hc C++ trong 21 ngy.
5: cout << "The size of an int is:\t\t" << sizeof(int) << " bytes.\n";
6: cout << "The size of a short int is:\t" << sizeof(short) << " bytes.\n";
7: cout << "The size of a long int is:\t" << sizeof(long) << " bytes.\n";
8: cout << "The size of a char is:\t\t" << sizeof(char) << " bytes.\n";
9: cout << "The size of a float is:\t\t" << sizeof(float) << " bytes.\n";
10: cout << "The size of a double is:\t" << sizeof(double) << " bytes.\n";
11:
12: return 0;
13: }
Output: The size of an int is: 2 bytes.
The size of a short int is: 2 bytes.
The size of a long int is: 4 bytes.
The size of a char is: 1 bytes.
The size of a float is: 4 bytes.
The size of a double is: 8 bytes.

II.1.2 S c du v khng du.


Ni chung tt c cc kiu s nguyn l 2 dng chnh : c du v khng c
du. Mc ch y l thnh thong bn cn s m v khng cn. S
nguyn ( short v long )khng c t "unsigned" c coi l c du (signed).
S nguyn c du hoc l s dng hoc s m. S nguyn khng du
lun l dng.
- S nguyn khng du short c gi tr t : 0 n 65535
- S nguyn c du short c gi tr t : -32768 n 32767

II.1.3 Cc kiu bin c bn


- Bin du phy ng dng biu din s thc (real)
- Bin Character chim 1 byte dng cha 256 k t hoc biu tng
ca bng ASCII hoc ASCII m rng.
Table 3.1. Variable Types.

Type Size Values


Unsigned short int 2 bytes 0 to 65,535
Short int 2 bytes -32,768 to 32,767
Unsigned long int 4 bytes 0 to 4,294,967,295
Long int 4 bytes -2,147,483,648 to 2,147,483,647

Trang 12
T hc C++ trong 21 ngy.
Int (16 bit) 2 bytes -32,768 to 32,767
Int (32 bit) 4 bytes -2,147,483,648 to 2,147,483,647
Unsigned int (16 bit) 2 bytes 0 to 65,535
Unsigned int (32 bit) 2 bytes 0 to 4,294,967,295
Char 1 byte 256 character values
Float 4 bytes 1.2e-38 to 3.4e38
Double 8 bytes 2.2e-308 to 1.8e308

Cch to mt bin:
u tin l kiu bin, sau l mt hoc nhiu du cch, sau
l tn bin v du chm phy.
Example 1
main()
{
unsigned short x;
unsigned short y;
ULONG z;
z = x * y;
}
Example 2
main ()
{
unsigned short Width;
unsigned short Length;
unsigned short Area;
Area = Width * Length;
}

C th to nhiu bin cng mt lc nh sau:


unsigned int myAge, myWeight; // two unsigned int variables
long area, width, length; // three longs

II.1.4 T kho.
Bao gm : if, while , for, main.
Khng c s dng t kha lm tn bin.

II.1.5 Gn gi tr cho bin


Gn gi tr cho bin bng cch s dng ton t (=). V d:

Trang 13
T hc C++ trong 21 ngy.
unsigned short Width;
Width = 5;
Bn c th gp ba bc thnh mt bc.
unsigned short Width = 5;
Tng t, c th khi to cho nhiu bin cng mt lc nh sau:
long width = 5, length = 7;
V d ny khi to bin s nguyn long l width =5 v bin s nguyn long
l length =7. Ta c th kt hp c khai bo v khi to nh sau:
int myAge = 39, yourAge, hisAge = 40;
Listing 3.2. A demonstration of the use of variables.
1: // Demonstration of variables
2: #include <iostream.h>
3:
4: int main()
5: {
6: unsigned short int Width = 5, Length;
7: Length = 10;
8:
9: // create an unsigned short and initialize with result
10: // of multiplying Width by Length
11: unsigned short int Area = Width * Length;
12:
13: cout << "Width:" << Width << "\n";
14: cout << "Length: " << Length << endl;
15: cout << "Area: " << Area << endl;
16: return 0;
17: }
Output: Width:5
Length: 10
Area: 50

II.1.6 Typedef
Ta c th cm thy chn ngt v bun t nu c phi s dng kiu khai
bo unsigned short int.

Trang 14
T hc C++ trong 21 ngy.
C++ cho php bn to ra mt b danh cho cm t ny bng cch s dng
t kho typedef, vit tt cho s nh ngha kiu.
Ta nh ngha bng cch: sau t kho typedef l kiu v sau l tn
mi. V d:
Typedef unsigned short int USHORT
Tn mi USHORT s dng bt c u thay th cho vic vit : unsigned
short int.
Listing 3.3. A demonstration of typedef.
1: // *****************
2: // Demonstrates typedef keyword
3: #include <iostream.h>
4:
5: typedef unsigned short int USHORT; //typedef defined
6:
7: void main()
8: {
9: USHORT Width = 5;
10: USHORT Length;
11: Length = 10;
12: USHORT Area = Width * Length;
13: cout << "Width:" << Width << "\n";
14: cout << "Length: " << Length << endl;
15: cout << "Area: " << Area <<endl;
16: }
Output: Width:5
Length: 10
Area: 50

II.1.7 Hin tng nhy vng trong s nguyn c du v khng


c du.
Hin tng nhy vng khi bin s vt qu gi tr cho php ca kiu khai bo.
Listing 3.4.A demonstration of putting too large a value
in an unsigned integer.
1: #include <iostream.h>
2: int main()

Trang 15
T hc C++ trong 21 ngy.
3: {
4: unsigned short int smallNumber;
5: smallNumber = 65535;
6: cout << "small number:" << smallNumber << endl;
7: smallNumber++;
8: cout << "small number:" << smallNumber << endl;
9: smallNumber++;
10: cout << "small number:" << smallNumber << endl;
11: return 0;
12: }
Output: small number:65535
small number:0
small number:1

Listing 3.5. A demonstration of adding too large a


number to a signed integer.
1: #include <iostream.h>
2: int main()
3: {
4: short int smallNumber;
5: smallNumber = 32767;
6: cout << "small number:" << smallNumber << endl;
7: smallNumber++;
8: cout << "small number:" << smallNumber << endl;
9: smallNumber++;
10: cout << "small number:" << smallNumber << endl;
11: return 0;
12: }
Output: small number:32767
small number:-32768
small number:-32767

II.1.8 Characters
Bin k t ( type char ) l 1 byte, cha 256 gi tr. Mt char c th
c dch nh l mt s nh ( 0-255) hay nh l mt s ca tp ASCII. Trong

Trang 16
T hc C++ trong 21 ngy.
m ASCII, "a" c xc nh bng gi tr 97. Tt c ch thng v ch hoa,
ch s v cc du chm c gi tr trong khong 1 n 128.
Listing 3.6. Printing characters based on numbers
1: #include <iostream.h>
2: int main()
3: {
4: for (int i = 32; i<128; i++)
5: cout << (char) i;
6: return 0;
7: }
Output: !"#$%G'()*+,./0123456789:;<>?@ABCDEFGHIJKLMNOP
_QRSTUVWXYZ[\]^'abcdefghijklmnopqrstuvwxyz<|>~s

II.1.9 Cc k t c bit
Trnh bin dch C++ chp nhn mt s k t nh dng. Bn phi t k
t ny vo trong on m bng cch nh du gch cho ( c gi l k t
iu khin ), sau l k t. V vy a mt k t tab vo trong
on m, thc hin nh sau :
Char tabCharacter = '\t' ;
V d ny khai bo mt bin char (tabCharacter) v khi to n vi k t \t ,
m c chp nhn nh l mt tab. Cc k t in c bit c dng khi in
hoc ra mn hnh hoc ra mt thit b u ra.
Table 3.2. The Escape Characters.
Character What it means
\n New line
\t Tab
\b Backspace
\" Double quote
\' Single quote
\? Question mark
\\ Backslash

II.2 Hng s.
Ging nh bin s, hng s cng l ni lu tr d liu. Bn phi khi to
hng s khi to ra n v khng th gn mt gi tr mi.
Trong C++ c hai kiu hng : ch v biu tng.

Trang 17
T hc C++ trong 21 ngy.
II.2.1 Hng s kiu ch
V d :
Int myAge = 39 ;
MyAge l mt bin kiu int ; 39 l mt hng s dng ch. Bn khng th
gn mt gi tr cho 39, v gi tr ca n khng th thay i c.

II.2.2 Hng s kiu biu tng.


L mt hng s m c i din bng 1 tn, ch nh l mt bin nhng
khng ging nh bin, gi tr ca n sau khi khi to th khng thay i
c.
Nu chng trnh c mt bin s nguyn t tn l : students v mt
bin khc tn l : classes, c th tnh ton c bao nhiu sinh vin, nu
bit c 15sinh vin/1 lp :
Students = classes * 15 ;
Trong v d ny, 15 l hng s kiu ch s. on m tr ln d c v d
sa. Nu thay th bng mt hng s kiu ch cho gi tr ny th s l:
Students = classes * studentsPerClass ;
Nu sau mun thay i s sinh vin/lp, c th lm iu ni
nh ngha hng s studentsPerClass khng cn thc hin s thay i
bt c ni no bn dng gi tr ny.
C hai cch khai bo mt hng s kiu biu tng trong C++. Cch truyn
thng v kiu hin nay l dng b tin x l, #define. Hng s nh
ngha vi #define nh ngha mt hng s theo cch truyn thng,
c th thc hin nh sau:
#define studentsPerClass 15
Ch rng studentsPerClass l khng phi l kiu c th ( int, char,....).
#define thc hin mt s thay th on vn bn n gin. Mi ln tin
x l nhn thy t studentsPerClass, n s thay bng 15.
V b tin x l chy trc trnh bin dch, do trnh bin dch khng
bao gi nhn thy hng s ; n ch thy s 15. Cc bin nh ngha
const, mc d #define lm vic, c mt cch mi tt hn nhiu cch nh
ngha hng trong C++ :
const unsigned short int studentsPerClass = 15;
V d ny cng khai bo mt hng s biu tng t tn studentsPerClass,
nhng ln ny studentsPerClass l kiu unsigned short int. Phng php ny

Trang 18
T hc C++ trong 21 ngy.
c mt s u im lm cho vic sa d dng hn v ngn nga s ri lon.
S khc nhau ln nht l hng ny c mt kiu, v trnh bin dch c th
bt buc dng ng theo kiu ca n.
Ch : khng nn dng kiu int chung m ch r kiu short hay long.

II.2.3 Hng s lit k.


Cho php to ra nhiu kiu mi v sau nh ngha cc bin
ca nhng kiu ny,ton b gi tr c hn ch trong mt tp cc gi ttr
c th. V d bn c th khai bo COLOR l mt bng kit k, v c th
nh ngha c 5 gi tr i vi COLOR : RED, BLUE, GREEN, WHITE v
BLACK.
C php i vi hng s lit k c vit vi t kho enum, sau l tn
kiu, mt du ngoc m, mi gi tr c phn cch bi mt du phy,
cui cng l du ngoc ng v du chm phy. V d:
Enum COLOR { RED, BLUE, GREEN, WHITE, BLACK } ;
Lnh ny thc hin 2 cng vic:
- N t tn COLOR cho lit k, l mt kiu mi.
- N gn cho RED mt hng s biu tng 0, BLUE mt hng s biu tng 1,
GREEN l 3, v tip tc.
Mi hng s lit k c gi tr nguyn. Nu khng ch r cch xc nh
khc th hng s u tin s c gi tr 0, v tip tc tng ln. Bt c 1
trong cc hng s ny c th c khi to vi mt gi tr c th. V vy
nu vit:
enum Color { RED=100, BLUE, GREEN=500, WHITE, BLACK=700 };
th RED c gi tr 100; BLUE c gi tr 101 ; GREEN c gi tr 500; WHITE
c gi tr 501; v BLACK c gi tr 700.
C th nh ngha bin kiu COLOR, nhng chng c th c gn 1 trong
cc gi tr lit k ( trong trng hp ny, RED, BLUE, GREEN, WHITE, hoc
BLACK, hoc 100, 101, 500, 501, 700 ). C th gn bt c gi tr mu no
cho bin COLOR. Trong thc t, bn c th gn bt c s nguyn no, thm
ch nu n khng l mu theo qui nh, mc d mt trnh bin dch tt
pht ra cnh bo nu bn thc hin. Do cc bin ca kiu lit k thng
l gi tr kiu " unsigned int ", v nhng hng s lit k tng ng vi
cc bin s nguyn. V d :
Listing 3.7. A demonstration of enumerated constants .

Trang 19
T hc C++ trong 21 ngy.
1: #include <iostream.h>
2: int main()
3: {
4: enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday,
_Saturday };
5:
6: Days DayOff;
7: int x;
8:
9: cout << "What day would you like off (0-6)? ";
10: cin >> x;
11: DayOff = Days(x);
12:
13: if (DayOff == Sunday || DayOff == Saturday)
14: cout << "\nYou're already off on weekends!\n";
15: else
16: cout << "\nOkay, I'll put in the vacation day.\n";
17: return 0;
18: }
Output: What day would you like off (0-6)? 1
Okay, I'll put in the vacation day.
What day would you like off (0-6)? 0
You're already off on weekends!
Trn dng 4, hng s kiu lit k DAYS c nh ngha, vi 7 gi tr bt
u t 0. Ngi s dng c nhc nh i vi ngy trong dng 9. Gi tr -
c chn, mt s gia 0 v 6, c so snh trn dng 13 vi cc gi tr lit k
ch nht v th by, v hnh ng i theo.
Ta khng th nh t " Sunday " khi c nhc ti i vi 1 ngy; chng
trnh s khng bit dch nh th no k t "Sunday" ra mt gi tr lit
k.

III Biu thc v cu lnh


Mt chng trnh l mt tp cc lnh x l ni tip nhau.

Trang 20
T hc C++ trong 21 ngy.
III.1 Cu lnh:
Trong C++ mt cu lnh iu khin chui x l, c lng mt biu
thc, hoc khng c g ( cu lnh rng ). Tt c cc cu lnh kt thc
vi mt du chm phy, thm ch cu lnh "null". Mt trong cc cu lnh
thng dng l lnh gn :
X=a+b;
Khng ging nh trong i s, cu lnh ny khng c ngha l x bng a+b.
M c l " Gn gi tr ca php cng a v b cho x" hoc " Gn cho x,
a+b ".
Ton t gn s gn bt c ci g bn phi du bng cho bt c ci g bn
tri du bng.
Ch : Cu lnh null l mt cu lnh khng lm ci g.

III.1.1 Khong trng


Khong trng ( tabs, spaces, v cc dng mi) thng c b qua trong
cu lnh. Cu lnh gn trn s c vit nh sau:
X=a+b;
Hoc nh l :
X =a
+ b ;
Khong trng c th c dng cho chng trnh d c,d sa hn,
hoc n c th c dng to ra m kinh khng v khng th c ra -
c. Trong trng hp ny,nh tt c mi th, C++ cung cp kh nng.
Cc k t khong trng ( tab, space, newline )khng th nhn thy -
c. Nu cc k t ny c in ra, bn ch nhn thy khong trng trn giy.

III.1.2 Cc lnh khi v lnh phc.


Bt c ni no bn c th a vo mt cu lnh n, bn c th a
vo mt cu lnh phc, cng c th c gi l mt khi. Mt khi bt
u vi 1 du ngoc m ({) v kt thc vi 1 du ngoc ng (}). Mc d
vy mi cu lnh trong khi phi kt thc vi mt du chm phy, khi t
n khng kt thc vi mt du chm phy. V d :
{
temp = a;
a = b;

Trang 21
T hc C++ trong 21 ngy.
b = temp;
}
Khi m ny hot ng nh mt lnh v s trao i cc gi tr trong cc
bin a v b

III.2 Biu thc


Mt biu thc tr v mt gi tr. Do , 3+2 ; tr v gi tr 5 v v
vy l mt biu thc. Tt c cc biu thc l cc lnh.
3.2 // returns the value 3.2
PI // float const that returns the value 3.14
SecondsPerMinute // int const that returns 60
Gi s rng PI l mt hng s bng 3.14 v SecondsPerMinute l mt
hng s bng 60, tt c 3 cu lnh ny l cc biu thc.
Biu thc phc tp
x = a + b;
khng ch cng a v b v gn kt qu cho x, nhng tr v gi tr ca vic
gn (gi tr ca x). V vy, lnh ny cng l mt biu thc. V l mt biu
thc, n c th bn phi ca ton t gn:
y = x = a + b;
Dng ny c xc nh trong lnh sau : Cng a vi b.
Gn kt qu ca biu thc a+b cho x.
Gn kt qu ca biu thc x = a+b cho y
Listing 4.1. Evaluating complex expressions.
1: #include <iostream.h>
2: int main()
3: {
4: int a=0, b=0, x=0, y=35;
5: cout << "a: " << a << " b: " << b;
6: cout << " x: " << x << " y: " << y << endl;
7: a = 9;
8: b = 7;
9: y = x = a+b;
10: cout << "a: " << a << " b: " << b;
11: cout << " x: " << x << " y: " << y << endl;

Trang 22
T hc C++ trong 21 ngy.
12: return 0;
13: }
Output: a: 0 b: 0 x: 0 y: 35
a: 9 b: 7 x: 16 y: 16

III.3 Cc ton t.
L biu tng m lm cho trnh bin dch hot ng. Cc ton t hot ng
trn cc ton hng, v trong C++ tt c cc t l cc biu thc. Trong C++
c mt vi loi ton t khc nhau. Hai loi ton t l :
- Cc ton t gn.
- Cc ton t ton hc.

III.3.1 Ton t gn.


Ton t gn (=). V d :
X=a+b;
Cc hng s u l r- gi tr. Chng khng th l 1_ gi tr. V vy, c
th vit.
X = 35 ; // OK
Nhng khng th vit:
35 = x ; // error, not an 1 value !

III.3.2 Ton t ton hc.


C 5 ton t ton hc: cng (+), tr (-), nhn (*), chia (/), v (%).
Listing 4.2. A demonstration of subtraction and integer
overflow.
1: // Listing 4.2 - demonstrates subtraction and
2: // integer overflow
3: #include <iostream.h>
4:
5: int main()
6: {
7: unsigned int difference;
8: unsigned int bigNumber = 100;
9: unsigned int smallNumber = 50;
10: difference = bigNumber - smallNumber;

Trang 23
T hc C++ trong 21 ngy.
11: cout << "Difference is: " << difference;
12: difference = smallNumber - bigNumber;
13: cout << "\nNow difference is: " << difference <<endl;
14: return 0;
15: }
Output: Difference is: 50
Now difference is: 4294967246
Ch khi thc hin php tr. Nu ly s nh hn tr i mt s ln hn, s
c kt qu l s m. Nu l s khng du th s xy ra trn nh v d trn.

III.3.3 Php chia s nguyn v php chia ly s d.


Php chia s nguyn c khc mt cht so vi php chia thng thng. Khi
chia 21 cho 4, kt qu l mt s thc (mt s thp phn). Cc s nguyn
khng c phn thp phn, v v vy "remainder" (s d) c ct i. Tr
li l 5. ly c s d, a 21 modulus 4 (21%4) v kt qu l 1.
- Php chia divison (/) l php chi ly phn nguyn.
- Php chia modulus (%) l php chia ly phn d.
Ch : Nhiu ngi lp trnh C++ cha c kinh nghim tnh c a mt
du chm phy sau cc lnh if.
If ( SomeValue <10) ;
SomeValue = 10 ;
Ta phi vit li theo cch sau:
if (SomeValue < 10) // test
; // do nothing
SomeValue = 10; // assign

III.3.4 Ton t gn v ton t ton hc phc.


Him khi mun cng mt gi tr vi mt bin s v sau gn kt qu
tr li bin. Nu c mt bin myAge v bn mun tng gi tr thm hai, c
th vit:
int myAge = 5;
int temp;
temp = myAge + 2; // add 5 + 2 and put it in temp
myAge = temp; // put it back in myAge

Trang 24
T hc C++ trong 21 ngy.
Phng php ny, mc d, rt kh chu v gy lng ph. Trong C++, c th
a vo bin tng t trn c hai chiu ca ton t gn, v v vy phn trc
tr nn tt hn nhiu :s
MyAge = myAge + 2 ;
Trong i s biu thc thc ny l v ngha, nhng trong C++ c c l
"cng 2 vo gi tr ca myAge v gn kt qu vo myAge ".
Mt cch vit n gin hn l :
MyAge += 2 ;
Ton t (+=) cng r-gi tr vo 1-gi tr v sau gn tr li kt qu vo
trong 1-gi tr. Ton t l "cng-bng". Cu lnh c l "myAge cng-bng
2". Nu myAge c gi tr 4 bt u, sau cu lnh s l 6.
C cc ton t "t -gn" tr (-=), chia (/=), nhn (*=), v modulus (%=).

III.3.5 Cc php tng v gim


Thng thng gi tr cng (hoc tr) v sau gn li vo bin l
1.Trong C++, vic tng gi tr l 1 c gi l lng tng, v gim 1 c gi l-
ng gim. C cc ton t c bit thc hin nhng tc ng ny.
Ton t tng (++) tng gi tr ca bin ln 1, v ton t gim (--) gim i 1.
V vy,nu c 1 bin, c, v mun tng n, ta s s dng lnh ny:
c++ ;
Lnh ny tng ng vi lnh sau:
c = c +1 ;
Cu lnh ny cng tng ng:
c += 1 ;

III.3.6 Tin t v hu t.
C hai ton t (++) v ton t (--) i n 2 loi: tin t v hu t.
- Tin t c vit trc tn bin (++myAge)
- Hu t c vit sau tn bin (myAge++).
V ng ngha hc th: tng gi tr ln trc khi thc hin lnh. Cn vi hu
t th : thc hin lnh sau mi tng gi tr.
V d: nu x l s nguyn c gi tr l 5, nu vit:
int a = ++x ;
C ngha l tng x (lm n thnh 6) v sau ly gi tr gn cho a.
V vy a = 6 v x = 6.

Trang 25
T hc C++ trong 21 ngy.
Nu sau ta tip tc vit:
int b = x++ ;
C ngha l ly gi tr ca x (6) v gn cho b, sau tng gi tr ca x.
V vy, by gi b = 6, v x = 7.
Listing 4.3. A demonstration of prefix and postfix
operators.
1: // Listing 4.3 - demonstrates use of
2: // prefix and postfix increment and
3: // decrement operators
4: #include <iostream.h>
5: int main()
6: {
7: int myAge = 39; // initialize two integers
8: int yourAge = 39;
9: cout << "I am: " << myAge << " years old.\n";
10: cout << "You are: " << yourAge << " years old\n";
11: myAge++; // postfix increment
12: ++yourAge; // prefix increment
13: cout << "One year passes...\n";
14: cout << "I am: " << myAge << " years old.\n";
15: cout << "You are: " << yourAge << " years old\n";
16: cout << "Another year passes\n";
17: cout << "I am: " << myAge++ << " years old.\n";
18: cout << "You are: " << ++yourAge << " years old\n";
19: cout << "Let's print it again.\n";
20: cout << "I am: " << myAge << " years old.\n";
21: cout << "You are: " << yourAge << " years old\n";
22: return 0;
23: }
Output: I am 39 years old
You are 39 years old
One year passes
I am 40 years old
You are 40 years old

Trang 26
T hc C++ trong 21 ngy.
Another year passes
I am 40 years old
You are 41 years old
Let's print it again
I am 41 years old
You are 41 years old

III.3.7 Quyn u tin.


Trong cu lnh phc tp : x = 5 + 3 * 8;
Th php nhn s c thc hin trc php cng.
Mi ton t u c 1 gi tr u tin. Khi 2 ton t ton hc c cng quyn u
tin, chng s thc hin theo trt t " t tri - qua - phi". V vy
X=5+3+8*9+6*4;
Php nhn s thc hin t tri qua phi. V vy, 8 * 9 = 72, v 6*4 =24.
By gi cu lnh s l:
X = 5 + 3 + 72 + 24;
By gi php cng thc hin t tri qua phi: 5 + 3 =8 ; 8+72 =80 ;
80+24 = 104.
Hy cn thn vi iu ny. Mt s ton t, nh l ton t gn thc hin theo
trt t t " phi - qua - tri ". V d :
TotalSeconds = NumMinutesToThink + NumMinutesToType * 60
Trong biu thc ny, ta mun nhn NumMinutesToType vi 60 v sau
cng n vi NumMinutesToThink. Ta mun cng hai bin ta c tng s
pht, v sau nhn n vi 60 c tng s giy.
Trong trng hp ny, ta phi s dng cc du ngoc thay i trt t u
tin. Cc s hng trong du ngoc c xc nh trt t u tin cao hn
nhng ton t ton hc. V vy ta phi vit :
TotalSeconds = ( NumMinutesToThink + NumMinutesToType ) * 60

III.3.8 Ton t quan h


Dng xc nh hoc 2 s bng nhau, hoc 1 s ln hn hoc nh hn
1 s khc. Cu lnh quan h xc nh hoc 1 (TRUE) hoc 0 (FALSE).
- Ton t bng "equals" :
MyAge == yourAge ; // gi tr myAge tng t ca yourAge ?
Biu thc xc nh 0, hoc FALSE khi 2 bin khng bng nhau.
- Ton t ln hn.

Trang 27
T hc C++ trong 21 ngy.
MyAge > yourAge ; // gi tr myAge ln hn yourAge ?
Trong C++ c 6 ton t quan h :
Bng : ==
Nh hn: <
Ln hn: >
Nh hn hoc bng: <=
Ln hn hoc bng : >=
Khc nhau : !=
Table 4.1. The Relational Operators.

Name Operator Sample Evaluates


Equals == 100 == 50; false
50 == 50; true
Not Equals != 100 != 50; true
50 != 50; false
Greater Than > 100 > 50; true
50 > 50; false
Greater Than >= 100 >= 50; true
or Equals 50 >= 50; true
Less Than < 100 < 50; false
50 < 50; false
Less Than <= 100 <= 50; False
or Equals 50 <= 50; true

III.4 Cu lnh IF.


Cu lnh if cho php bn kim tra mt iu kin, v r nhnh ti phn
khc ca on m, ph thuc vo kt qu.
Cu lnh if n gin nht l:
If (biu thc )
Statement ;
Biu thc trong du ngoc c th l bt c biu thc no, nhng n thng
cha mt biu thc quan h. Nu biu thc c gi tr 0, n coi l sai, v
lnh c b qua. Nu n c gi tr khng phi l 0, n coi l ng, v lnh
c x l. Ch v d sau:
if (bigNumber > smallNumber)

Trang 28
T hc C++ trong 21 ngy.
bigNumber = smallNumber;
Nu lnh trong cu lnh if gm nhiu lnh th dng lnh if nh sau:
if (expression)
{
statement1;
statement2;
statement3;
}
V d:
if (bigNumber > smallNumber)
{
bigNumber = smallNumber;
cout << "bigNumber: " << bigNumber << "\n";
cout << "smallNumber: " << smallNumber << "\n";
}
Listing 4.4. A demonstration of branching based on
relational operators.
1: // Listing 4.4 - demonstrates if statement
2: // used with relational operators
3: #include <iostream.h>
4: int main()
5: {
6: int RedSoxScore, YankeesScore;
7: cout << "Enter the score for the Red Sox: ";
8: cin >> RedSoxScore;
9:
10: cout << "\nEnter the score for the Yankees: ";
11: cin >> YankeesScore;
12:
13: cout << "\n";
14:
15: if (RedSoxScore > YankeesScore)
16: cout << "Go Sox!\n";
17:

Trang 29
T hc C++ trong 21 ngy.
18: if (RedSoxScore < YankeesScore)
19: {
20: cout << "Go Yankees!\n";
21: cout << "Happy days in New York!\n";
22: }
23:
24: if (RedSoxScore == YankeesScore)
25: {
26: cout << "A tie? Naah, can't be.\n";
27: cout << "Give me the real score for the Yanks: ";
28: cin >> YankeesScore;
29:
30: if (RedSoxScore > YankeesScore)
31: cout << "Knew it! Go Sox!";
32:
33: if (YankeesScore > RedSoxScore)
34: cout << "Knew it! Go Yanks!";
35:
36: if (YankeesScore == RedSoxScore)
37: cout << "Wow, it really was a tie!";
38: }
39:
40: cout << "\nThanks for telling me.\n";
41: return 0;
42: }
Output: Enter the score for the Red Sox: 10
Enter the score for the Yankees: 10
A tie? Naah, can't be
Give me the real score for the Yanks: 8
Knew it! Go Sox!
Thanks for telling me.
Cc cch t du ngoc.
- t du ngoc ngay sau iu kin v cn thng hng vi lnh if
hng di ng khi lnh.

Trang 30
T hc C++ trong 21 ngy.
If (biu thc) {
Cu lnh ;
}
- t du ngoc bn di lnh if.
if (biu thc)
{
cu lnh ;
}
- t du ngoc tht vo cng vi cu lnh.
if (biu thc)
{
cu lnh ;
}
Else
Thng chng trnh ca bn s mun r nhnh nu iu kin ng, v nu
iu kin sai. Nu ch s dng lnh if khng th chng trnh s di v
ta s dng t kho "else" nh sau:
If (biu thc)
Cu lnh ;
Else
Cu lnh ;
Listing 4.5. Demonstrating the else keyword.
1: // Listing 4.5 - demonstrates if statement
2: // with else clause
3: #include <iostream.h>
4: int main()
5: {
6: int firstNumber, secondNumber;
7: cout << "Please enter a big number: ";
8: cin >> firstNumber;
9: cout << "\nPlease enter a smaller number: ";
10: cin >> secondNumber;
11: if (firstNumber > secondNumber)
12: cout << "\nThanks!\n";

Trang 31
T hc C++ trong 21 ngy.
13: else
14: cout << "\nOops. The second is bigger!";
15:
16: return 0;
17: }

Output: Please enter a big number: 10


Please enter a smaller number: 12
Oops. The second is bigger!
Cc kiu c php lnh if.
- Dng 1:
If (biu thc)
Cu lnh ;
Next statement ;
Nu biu thc xc nh l ng, "cu lnh " c x l v chng
trnh tip tc vi "next statement". Nu biu thc sai, cu lnh c b
qua v chng trnh nhy ti "next statement". Nh rng cu lnh c
th l mt cu lnh n kt thc vi 1 du chm phy hoc 1 du
ngoc ng khi.
- Dng 2.
if (expression)
statement1;
else
statement2;
next statement;
Nu biu thc ng th "statement1" c x l; nu sai "statement2"
c x l, sau y, chng trnh tip tc vi "next statement". V d:
if (SomeValue < 10)
cout << "SomeValue is less than 10");
else
cout << "SomeValue is not less than 10!");
cout << "Done." << endl;
Cc lnh if phc tp.
if (expression1)

Trang 32
T hc C++ trong 21 ngy.
{
if (expression2)
statement1;
else
{
if (expression3)
statement2;
else
statement3;
}
}
else
statement4;
V d :
Listing 4.6. A complex, nested if statement.
1: // Listing 4.5 - a complex nested
2: // if statement
3: #include <iostream.h>
4: int main()
5: {
6: // Ask for two numbers
7: // Assign the numbers to bigNumber and littleNumber
8: // If bigNumber is bigger than littleNumber,
9: // see if they are evenly divisible
10: // If they are, see if they are the same number
11:
12: int firstNumber, secondNumber;
13: cout << "Enter two numbers.\nFirst: ";
14: cin >> firstNumber;
15: cout << "\nSecond: ";
16: cin >> secondNumber;
17: cout << "\n\n";
18:
19: if (firstNumber >= secondNumber)

Trang 33
T hc C++ trong 21 ngy.
20: {
21: if ( (firstNumber % secondNumber) == 0) // neu chia het cho nhau?
22: {
23: if (firstNumber == secondNumber)
24: cout << "They are the same!\n";
25: else
26: cout << "They are evenly divisible!\n";
27: }
28: else
29: cout << "They are not evenly divisible!\n";
30: }
31: else
32: cout << "Hey! The second one is larger!\n";
33: return 0;
34: }

Output: Enter two numbers.


First: 10

Second: 2

They are evenly divisible!

III.5 Ton t lgc.


Table 4.2. The Logical Operators.
Symbo
Operator Example
l
AND && expression1 && expression2
OR || expression1 || expression2
NOT ! !expression

III.5.1 Php lgc AND


Php AND ng (=1) khi c hai biu thc u ng. Sai khi 1 trong 2
biu thc sai.
If ( ( x == 5 ) && (y == 5) )
Php AND c biu tng l &&.

Trang 34
T hc C++ trong 21 ngy.
III.5.2 Php lgc OR
ng khi 1 trong 2 hoc c 2 biu thc ng. Sai khi c 2 biu thc u
sai.
if ( (x == 5) || (y == 5) )
Php OR c biu tng l .

III.5.3 Php lgc NOT.


L php ph nh.
if ( !(x == 5) )
kt qu ca if l ng nu x khc 5. Php ny c th vit cch khc nh
sau :
if ( x != 5 )

III.5.4 Quyn u tin trong ton t lgc.


V d:
if ( x > 5 && y > 5 || z > 5)
Nu vit cch ny s lm cho cu lnh khng r ngha. Do ta c th
s dng cc du ngoc.
if ( (x > 5) && (y > 5 || z > 5) )
Ch trong khi vit chng trnh cn trnh by sao cho d c v d
hiu.

III.5.5 Mt s cch vit tt.


V d 1:
if (x) // if x is true (nonzero)
x = 0;
Cu lnh c ngha : nu x c gi tr khc 0, t n l 0. Ta c th vit
cch khc r rng hn:
if (x != 0) // if x is nonzero
x = 0;
V d 2:
Hai cu lnh sau l tng ng :
if (!x) // if x is false (zero)
if (x == 0) // if x is zero

Trang 35
T hc C++ trong 21 ngy.
III.6 Ton t ph thuc.
Ton t ph thuc ( ?: ) l cc ton t bc ba ch c C++ ; l ton t vi
3 s hng.
- Ton t ph thuc thc hin vi 3 biu thc v tr v mt gi tr :
( biu thc 1) ? ( biu thc 2) : (biu thc 3)
Cu lnh c ngha : Nu biu thc-1 l ng, tr v gi tr biu
thc-2 ; nu sai tr v gi tr biu thc-3.
Listing 4.9. A demonstration of the conditional operator .
1: // Listing 4.9 - demonstrates the conditional operator
2: //
3: #include <iostream.h>
4: int main()
5: {
6: int x, y, z;
7: cout << "Enter two numbers.\n";
8: cout << "First: ";
9: cin >> x;
10: cout << "\nSecond: ";
11: cin >> y;
12: cout << "\n";
13:
14: if (x > y)
15: z = x;
16: else
17: z = y;
18:
19: cout << "z: " << z;
20: cout << "\n";
21:
22: z = (x > y) ? x : y;
23:
24: cout << "z: " << z;
25: cout << "\n";
26: return 0;

Trang 36
T hc C++ trong 21 ngy.
27: }
Output: Enter two numbers.
First: 5

Second: 8

z: 8
z: 8

IV Cc hm.
Hm l g ?
Hm l mt chng trnh con m c th lm vic trn d liu v tr v
mt gi tr. Trong chng trnh C++ c ti thiu mt hm, main(). Khi ch-
ng trnh bt u, main() c t ng gi. main() c th gi cc hm
khc.
Mi hm c tn ca n v khi tn c gp, vic x l chng trnh r
nhnh vo trong thn hm. Khi hm tr v, vic x l tr li trn dng tip
theo ca hm gi.
Cc hm c hai cch to ra:
- Do ngi s dng nh ngha.
- C sn trong trnh bin dch.

IV.1 Khai bo v nh ngha hm.


S dng cc hm trong chng trnh,u tin phi khai bo hm v sau
nh ngha hm . Khai bo l ch ra tn, kiu tr v, cc tham s ca
hm. nh ngha l bo trnh bin dch bit hm lm vic nh th no.
Khng c hm no c gi t hm khc m khng khai bo. Khai bo l th
tc u tin.
Khai bo hm.
C 3 cch khai bo mt hm:
- Vit nguyn mu vo trong mt file, sau s dng mt ch dn
#include gp n vo trong chng trnh ca bn.
- Vit nguyn mu vo trong file m hm ca bn c s dng.

Trang 37
T hc C++ trong 21 ngy.
- nh ngha hm trc khi n c gi bi bt k hm. Khi lm iu ny,
vic nh ngha hot ng nh chnh s khai bo ca n.
Cch th nht, l tng ti v kh cho vic sa v thay i.
Cch th hai, gi s rng hm A() cn c th gi hm B(), nhng hm
B() cng cn c th gi hm A() trong mt s trng hp.
C th nh ngha hm A() trc khi nh ngha hm B() v cng
hm B() trc khi nh ngha hm A(), v vy ti thiu 1 trong s chng
phi c khai bo trong bt c trng hp no.
Cch th ba, cc nguyn mu l mt k thut g ri y sc mnh v tt.
Nu nguyn mu ca bn khai bo rng hm gm mt tp cc tham s
ring bit, hoc rng n tr v mt kiu gi tr c th, v sau hm
khng sp xp nguyn mu, trnh bin dch c th ra hiu bng c li
ca bn thay v i n hin ln khi chy chng trnh .

IV.1.1 Cc nguyn mu hm.


Nhiu hm c sn, bn c th s dng chng trong chng trnh ca
bn bng cch s dng # include . i vi cc hm ca chnh bn vit, bn
phi gp nguyn mu.
Nguyn mu hm l mt cu lnh , ngha l n kt thc vi du chm
phy (;). N kiu tr v ca hm, tn, v danh sch tham s.
Danh sch tham s l mt danh sch ca tt c cc tham s v kiu ca
chng, phn cch bi du phy (commas).
Nguyn mu hm v s nh ngha hm phi ging nhau chnh xc v
kiu tr v, tn, danh sch tham s. Nu chng khng ging nhau , bn s
nhn c mt li "compile-time". Ch : nguyn mu hm khng cn gm
tn ca tham s, m ch l kiu ca chng. Mt nguyn mu trng ging
nh :
Long Area (int , int ) ;
Nguyn mu ny khai bo mt hm tn l Area() tr v mt long v c hai
tham s, c hai l s nguyn. Mc d y l theo qui nh, n khng phi
l tng tt. Tn tham s thm vo lm cho nguyn mu r rng hn. Hm
tng t vi cc tham s c dt tn c th l :
Long Area (int length, int width) ;

Trang 38
T hc C++ trong 21 ngy.
Ch rng: tt c cc hm c mt kiu tr v. Nu khng nh r, kiu
tr v mc nh l int . Chng trnh ca bn s hiu d dng hn, mc
d, nu khai bo r rng kiu tr v ca mi hm, k c main() .
Listing 5.1. A function declaration and the definition and
use of that function.
1: // Listing 5.1 - demonstrates the use of function prototypes
2:
3: typedef unsigned short USHORT;
4: #include <iostream.h>
5: USHORT FindArea(USHORT length, USHORT width); //function prototype
6:
7: int main()
8: {
9: USHORT lengthOfYard;
10: USHORT widthOfYard;
11: USHORT areaOfYard;
12:
13: cout << "\nHow wide is your yard? ";
14: cin >> widthOfYard;
15: cout << "\nHow long is your yard? ";
16: cin >> lengthOfYard;
17:
18: areaOfYard= FindArea(lengthOfYard,widthOfYard);
19:
20: cout << "\nYour yard is ";
21: cout << areaOfYard;
22: cout << " square feet\n\n";
23: return 0;
24: }
25:
26: USHORT FindArea(USHORT l, USHORT w)
27: {
28: return l * w;
29: }

Trang 39
T hc C++ trong 21 ngy.
Output: How wide is your yard? 100

How long is your yard? 200

Your yard is 20000 square feet

IV.1.2 nh ngha hm .
nh ngha hm bao gm u hm v thn hm. u hm chnh xc
ging nh nguyn mu hm, ngoi tr cc tham s phi c t tn, v
khng c du chm phy kt thc.
Thn hm l mt tp cc lnh bn trong cc du ngoc.
Hm:
C php nguyn mu hm:
Return_type function_name ( [type [parameterName] ] .....) ;
C php nh ngha hm:
Return_type function_name ( [type [parameterName] ] .....) ;
{
cu lnh ;
}
Nguyn mu hm ch ra : kiu tr v, tn, danh sch tham s. Hm khng
cn c cc tham s, v nguyn mu khng cn danh sch cc tn ca
chng, ch c cc kiu ca chng. Mt nguyn mu lun kt thc vi du
chm phy (;).
nh ngha hm phi ph hp kiu tr v v danh sch tham s vi nguyn
mu ca n. N phi cung cp tn cho cc tham s, v thn nh ngha
hm phi c bao quanh bng cc du ngoc. Tt c cc lnh bn trong
thn hm phi c kt thc vi du chm phy (;), nhng hm t n khng
kt thc vi mt du chm phy m n kt thc vi mt du ng ngoc.
Nu hm tr v mt gi tr, n kt thc vi mt cu lnh return, mc d
cc lnh return c th xut hin hp php bt c ni no trong thn
hm. Mi hm c 1 kiu tr v. Nu khng r rng, kiu tr v s l int.
Nu mt hm khng tr v mt gi tr, kiu tr v ca n s l void.

Function Prototype Examples

long FindArea(long length, long width); // returns long, has two parameters

Trang 40
T hc C++ trong 21 ngy.
void PrintMessage(int messageNumber); // returns void, has one parameter
int GetChoice(); // returns int, has no parameters
BadFunction(); // returns int, has no parameters

Function Definition Examples


long Area(long l, long w)
{
return l * w;
}

void PrintMessage(int whichMsg)


{
if (whichMsg == 0)
cout << "Hello.\n";
if (whichMsg == 1)
cout << "Goodbye.\n";
if (whichMsg > 1)
cout << "I'm confused.\n";
}

IV.1.3 X l hm.
Khi bn gi mt hm, vic x l bt u vi cu lnh u tin sau du
ngoc m ({). Nhnh c th c x l bng cch s dng lnh if. Cc hm
cng c th gi cc hm khc thm ch gi chnh chng.

IV.2 Bin khu vc.


Bin khu vc ch tn ti trong khu vc bn trong hm ca n. Khi hm
tr v, cc bin khu vc l bin khng c hiu lc na.
Bin khu vc c nh ngha nh bt c bin khc. Cc tham s t
bn trong hm cng coi l bin khu vc v c th c s dng chnh xc
bi v nu chng c nh ngha bn trong thn hm.
Listing 5.2. The use of local variables and parameters.
1: #include <iostream.h>
2:
3: float Convert(float);

Trang 41
T hc C++ trong 21 ngy.
4: int main()
5: {
6: float TempFer;
7: float TempCel;
8:
9: cout << "Please enter the temperature in Fahrenheit: ";
10: cin >> TempFer;
11: TempCel = Convert(TempFer);
12: cout << "\nHere's the temperature in Celsius: ";
13: cout << TempCel << endl;
14: return 0;
15: }
16:
17: float Convert(float TempFer)
18: {
19: float TempCel;
20: TempCel = ((TempFer - 32) * 5) / 9;
21: return TempCel;
22: }

Output: Please enter the temperature in Fahrenheit: 212


Here's the temperature in Celsius: 100
Please enter the temperature in Fahrenheit: 32
Here's the temperature in Celsius: 0
Please enter the temperature in Fahrenheit: 85
Here's the temperature in Celsius: 29.4444

V d khc:
1: #include <iostream.h>
2:
3: float Convert(float);
4: int main()
5: {
6: float TempFer;

Trang 42
T hc C++ trong 21 ngy.
7: float TempCel;
8:
9: cout << "Please enter the temperature in Fahrenheit: ";
10: cin >> TempFer;
11: TempCel = Convert(TempFer);
12: cout << "\nHere's the temperature in Celsius: ";
13: cout << TempCel << endl;
14: }
15:
16: float Convert(float Fer)
17: {
18: float Cel;
19: Cel = ((Fer - 32) * 5) / 9;
20: return Cel;
21: }
Hin nay, cc bin c khai bo bn trong u ca mt vng for (for int i =
0; i<SomeValue ; i++ )

IV.3 Bin ton cc.


Cc bin c nh ngha bn ngoi ca bt c hm c phm vi ln v
v vy c sn bt c hm trong chng trnh, k c main() .
Bin khu vc vi tn tng t nh cc bin ton cc khng lm thay i
bin ton cc. Nu mt hm c 1 bin vi tn ging bin ton cc, tn c
xem l bin khu vc--khng l bin ton cc-- khi c dng trong hm.
Listing 5.3. Demonstrating global and local variables .
1: #include <iostream.h>
2: void myFunction(); // prototype
3:
4: int x = 5, y = 7; // global variables
5: int main()
6: {
7:
8: cout << "x from main: " << x << "\n";
9: cout << "y from main: " << y << "\n\n";

Trang 43
T hc C++ trong 21 ngy.
10: myFunction();
11: cout << "Back from myFunction!\n\n";
12: cout << "x from main: " << x << "\n";
13: cout << "y from main: " << y << "\n";
14: return 0;
15: }
16:
17: void myFunction()
18: {
19: int y = 10;
20:
21: cout << "x from myFunction: " << x << "\n";
22: cout << "y from myFunction: " << y << "\n\n";
23: }

Output: x from main: 5


y from main: 7

x from myFunction: 5
y from myFunction: 10

Back from myFunction!

x from main: 5
y from main: 7
V d bin khu vc.
Listing 5.4. Variables scoped within a block.
1: // Listing 5.4 - demonstrates variables
2: // scoped within a block
3:
4: #include <iostream.h>
5:
6: void myFunc();
7:

Trang 44
T hc C++ trong 21 ngy.
8: int main()
9: {
10: int x = 5;
11: cout << "\nIn main x is: " << x;
12:
13: myFunc();
14:
15: cout << "\nBack in main, x is: " << x;
16: return 0;
17: }
18:
19: void myFunc()
20: {
21:
22: int x = 8;
23: cout << "\nIn myFunc, local x: " << x << endl;
24:
25: {
26: cout << "\nIn block in myFunc, x is: " << x;
27:
28: int x = 9;
29:
30: cout << "\nVery local x: " << x;
31: }
32:
33: cout << "\nOut of block, in myFunc, x: " << x << endl;
34: }

Output: In main x is: 5


In myFunc, local x: 8

In block in myFunc, x is: 8


Very local x: 9
Out of block, in myFunc, x: 8

Trang 45
T hc C++ trong 21 ngy.
Back in main, x is: 5
Chng trnh bt u vi s khi to 1 bin khu vc, x, trn dng 10,
trong main(). In ra trn dng 11 xc nh rng x c khi to vi gi tr
5. MyFunc() c gi, v 1 bin khu vc, cng c t tn x, c khi to
vi gi tr 8 trn dng 22. Gi tr c in ra trn dng 23.
Mt khi c bt u trn dng 25, v bin x t hm c in li trn
dng 26. Mt bin mi cng c t tn x, nhng khu vc khi c to
ra trn dng 28 v c khi to vi gi tr 9.
Gi tr ca bin x mi nht c in ra trn dng 30. Khi kt thc trn
dng 31, v bin c to ra trn dng 28 -"out of scope".
Khi x c in ra trn dng 33, x c nh ngha trn dng 28; gi tr
ca n vn l 8.

IV.3.1 Cu lnh hm.


Hu nh khng c gii hn v s kiu cu lnh m c th bn trong thn
hm. Mc d vy bn khng th nh ngha mt hm khc t bn trong
mt hm, bn c th gi 1 hm. Cc hm c th thm ch gi chnh
chng.
Mc d khng c gii hn v kch thc ca 1 hm trong C++, nhng xu
hng xy dng hm c kch thc nh. Nhiu nh lp trnh khuyn lm cho
hm va trn mt mn hnh n v vy bn c th nhn ton b
hm cng mt lc. y l mt qui lut lt trang, thng ngt qung bi cc
nh lp trnh gii, nhng mt hm cng nh th cng d hiu v sa
cha.
Mi hm nn thc hin mt cng vic n l v d hiu.

IV.3.2 i s ca hm.
Cc i s hm c l l 1 i s hm, bao gm cc hng s, biu thc
lgc v ton hc, v cc hm khc m tr v gi tr .
Bt c biu thc C++ c th l 1 i s hm, bao gm cc hng s,
biu thc lgc v ton hc, v cc hm khc m tr v gi tr .

Trang 46
T hc C++ trong 21 ngy.
IV.3.3 S dng cc hm nh l cc tham s thc hin cc
chc nng.
Mc d l qui lut i vi mt hm thc hin nh 1 tham s ca
hm th hai m tr v 1 gi tr,n c th lm cho m chng trnh kh
c v rc ri.
V d, c cc hm : double(), triple(), square(), v cube(); mi hm tr v 1
gi tr. C th vit.
Answer = (double(triple(square(cube(myValue)))));
Cu lnh ny dng 1 bin, myValue, v coi n nh 1 i s i vi hm
cube(), gi tr tr v c coi l i s ca hm square(), gi tr tr v ca
n coi l i s ca hm triple(), v gi tr tr v a ti hm double(). Gi
tr tr v ca hm double(), triple(), square(), cube() c a ti
Answer.
Kh c th chc chn on m no thc hin (l gi tr trc triple hay sau
l square ?).
Mt thay i k tip l gn mi bc ti bin trung gian ca n:
unsigned long myValue = 2;
unsigned long cubed = cube(myValue); // cubed = 8
unsigned long squared = square(cubed); // squared = 64
unsigned long tripled = triple(squared); // tripled = 196
unsigned long Answer = double(tripled); // Answer = 392

IV.3.4 Tham s l cc bin khu vc.


i s a vo trong hm l khu vc cho hm. S thay i lm cho cc i
s khng nh hng ti gi tr trong gi hm. iu ny c bit nh truyn
gi tr, ngha l mt bn sao khu vc ca mi i s lm trong hm.
Nhng bn sao khu vc ny c coi nh l bt c bin khu vc khc.
Listing 5.5. A demonstration of passing by value.
1: // Listing 5.5 - demonstrates passing by value
2:
3: #include <iostream.h>
4:
5: void swap(int x, int y);
6:
7: int main()

Trang 47
T hc C++ trong 21 ngy.
8: {
9: int x = 5, y = 10;
10:
11: cout << "Main. Before swap, x: " << x << " y: " << y << "\n";
12: swap(x,y);
13: cout << "Main. After swap, x: " << x << " y: " << y << "\n";
14: return 0;
15: }
16:
17: void swap (int x, int y)
18: {
19: int temp;
20:
21: cout << "Swap. Before swap, x: " << x << " y: " << y << "\n";
22:
23: temp = x;
24: x = y;
25: y = temp;
26:
27: cout << "Swap. After swap, x: " << x << " y: " << y << "\n";
28:
29: }

Output: Main. Before swap, x: 5 y: 10


Swap. Before swap, x: 5 y: 10
Swap. After swap, x: 10 y: 5
Main. After swap, x: 5 y: 10

IV.3.5 Gi tr tr v.
Cc hm tr v gi tr hoc tr v dng void. Void l 1 tn hiu bo cho
trnh bin dch s khng c gi tr tr v.
tr v mt gi tr t 1 hm, vit t kho return theo sau l gi tr mun
tr v. Gi tr c th t n l 1 biu thc m tr v mt gi tr. V d:
return 5;
return (x > 5);

Trang 48
T hc C++ trong 21 ngy.
return (MyFunction());
y l tt c nhng lnh return theo qui nh, gi s rng hm
MyFunction() t n tr v mt gi tr. G tr trong cu lnh th hai, return
(x>5), s l zero nu x khng ln hn 5, hoc n s l 1. Ci c tr v l
gi tr ca biu thc ,0 (false) hay 1(true), khng phi gi tr ca x.
Khi t kho return c bt gp, biu thc sau return c tr v nh gi tr
ca hm. S thc hin chng trnh tr v ngay lp tc khi gi hm, v
bt c cu lnh sau return khng c s l.
l ng qui nh c hn mt cu lnh return trong 1 hm n.
Listing 5.6. A demonstration of multiple return
statements.
1: // Listing 5.6 - demonstrates multiple return
2: // statements
3:
4: #include <iostream.h>
5:
6: int Doubler(int AmountToDouble);
7:
8: int main()
9: {
10:
11: int result = 0;
12: int input;
13:
14: cout << "Enter a number between 0 and 10,000 to double: ";
15: cin >> input;
16:
17: cout << "\nBefore doubler is called... ";
18: cout << "\ninput: " << input << " doubled: " << result << "\n";
19:
20: result = Doubler(input);
21:
22: cout << "\nBack from Doubler...\n";
23: cout << "\ninput: " << input << " doubled: " << result << "\n";

Trang 49
T hc C++ trong 21 ngy.
24:
25:
26: return 0;
27: }
28:
29: int Doubler(int original)
30: {
31: if (original <= 10000)
32: return original * 2;
33: else
34: return -1;
35: cout << "You can't get here!\n";
36: }
Output: Enter a number between 0 and 10,000 to double: 9000
Before doubler is called...
input: 9000 doubled: 0
Back from doubler...
input: 9000 doubled: 18000
Enter a number between 0 and 10,000 to double: 11000
Before doubler is called...
input: 11000 doubled: 0
Back from doubler...
input: 11000 doubled: -1

IV.3.6 Tham s mc nh.


i vi mi tham s khai bo v nh ngha trong nguyn mu hm, hm
ang gi phi a vo mt gi tr. Gi tr c a vo phi l kiu c
khai bo. V vy, nu c 1 hm khai bo nh sau.
Long myFunction (int);
Hm phi nhn mt bin s nguyn. Nu nh ngha hm khng ging
hoc nu khng a vo mt s nguyn th s nhn c mt li bin dch.
Mt s ngoi tr i vi qui lut ny l nu nguyn mu hm khai bo 1 gi
tr mc nh i vi tham s. Gi tr mc nh l 1 gi tr s dng
nu dng dng "none". Khai bo trc c th c vit nh sau:
Long myFunction (int x = 50) ;

Trang 50
T hc C++ trong 21 ngy.
Nguyn mu ni rng, "myFunction ()" tr v mt gi tr long v nhn 1
tham s s nguyn. Nu mt i s khng c a vo, s dng gi tr
mc nh 50. Bi v tn tham s khng cn trong nguyn mu hm,
nguyn mu ny c th c vit nh sau:
Long myFunction (int = 50);
nh ngha hm khng thay i bi khai bo 1 tham s mc nh. u
nh ngha hm i vi hm ny s l :
long myFunction (int x)
Nu hm gi khng c 1 tham s, trnh bin dch s in x vi gi tr mc
nh 50. Tn ca tham s mc nh trong nguyn mu khng ging nh
tn trong u hm; gi tr mc nh c gn cng v tr, khng c
tn.
Bt c hoc tt c cc tham s ca hm c th c gn gi tr mc nh.
Mt s rc ri l : Nu bt c tham s no khng c gi tr mc nh,
khng tham s c trc no c th c 1 gi tr mc nh.
Nu nguyn mu hm trng ging nh:
long myFunction (int Param1, int Param2, int Param3);
C th gn 1 gi tr mc nh ch cho Param2, nu gn 1 gi tr mc
nh cho Param3. C th gn 1 gi tr mc nh ch cho Param1 nu
gn cc gi tr mc nh cho c hai Param2 v Param3.
Listing 5.7. A demonstration of default parameter values.
1: // Listing 5.7 - demonstrates use
2: // of default parameter values
3:
4: #include <iostream.h>
5:
6: int AreaCube(int length, int width = 25, int height = 1);
7:
8: int main()
9: {
10: int length = 100;
11: int width = 50;
12: int height = 2;
13: int area;

Trang 51
T hc C++ trong 21 ngy.
14:
15: area = AreaCube(length, width, height);
16: cout << "First area equals: " << area << "\n";
17:
18: area = AreaCube(length, width);
19: cout << "Second time area equals: " << area << "\n";
20:
21: area = AreaCube(length);
22: cout << "Third time area equals: " << area << "\n";
23: return 0;
24: }
25:
26: AreaCube(int length, int width, int height)
27: {
28:
29: return (length * width * height);
30: }

Output: First area equals: 10000


Second time area equals: 5000
Third time area equals: 2500

IV.3.7 Cc hm xp chng.
C++ cho php to ra hn 1hm cng tn. iu ny c gi l xp chng
hm. Cc hm phi khc nhau trong danh sch tham s, vi kiu tham s
khc nhau, mt s tham s khc nhau hoc c hai. V d:
int myFunction (int, int);
int myFunction (long, long);
int myFunction (long);
Kiu tr v c th ging nhau hoc khc nhau trn cc hm xp chng.
Ch : hai hm c cng tn v dang sch tham s, nhng khc nhau kiu tr
v, to ra mt li bin dch.
Ch : Hm "Overloading" cng c gi l hm "polymorphism": Hm
nhiu dng.

Trang 52
T hc C++ trong 21 ngy.
Gi s vit 1 hm kiu double vi bt c u vo no. Bn mun a vo
trong 1 kiu int, 1 kiu long, 1 kiu float, hoc 1 kiu double. Khng c
xp chng hm, bn phi to ra 4 hm vi cc tn :
int DoubleInt(int);
long DoubleLong(long);
float DoubleFloat(float);
double DoubleDouble(double);
Vi hm xp chng, c th khai bo nh sau:
int Double(int);
long Double(long);
float Double(float);
double Double(double);
y l cch d c v d s dng.Khng phi lo lng v hm no
gi; ch cn a vo 1 bin, v hm bn phi c gi t ng
Listing 5.8. A demonstration of function polymorphism .
1: // Listing 5.8 - demonstrates
2: // function polymorphism
3:
4: #include <iostream.h>
5:
6: int Double(int);
7: long Double(long);
8: float Double(float);
9: double Double(double);
10:
11: int main()
12: {
13: int myInt = 6500;
14: long myLong = 65000;
15: float myFloat = 6.5F;
16: double myDouble = 6.5e20;
17:
18: int doubledInt;
19: long doubledLong;

Trang 53
T hc C++ trong 21 ngy.
20: float doubledFloat;
21: double doubledDouble;
22:
23: cout << "myInt: " << myInt << "\n";
24: cout << "myLong: " << myLong << "\n";
25: cout << "myFloat: " << myFloat << "\n";
26: cout << "myDouble: " << myDouble << "\n";
27:
28: doubledInt = Double(myInt);
29: doubledLong = Double(myLong);
30: doubledFloat = Double(myFloat);
31: doubledDouble = Double(myDouble);
32:
33: cout << "doubledInt: " << doubledInt << "\n";
34: cout << "doubledLong: " << doubledLong << "\n";
35: cout << "doubledFloat: " << doubledFloat << "\n";
36: cout << "doubledDouble: " << doubledDouble << "\n";
37:
38: return 0;
39: }
40:
41: int Double(int original)
42: {
43: cout << "In Double(int)\n";
44: return 2 * original;
45: }
46:
47: long Double(long original)
48: {
49: cout << "In Double(long)\n";
50: return 2 * original;
51: }
52:
53: float Double(float original)

Trang 54
T hc C++ trong 21 ngy.
54: {
55: cout << "In Double(float)\n";
56: return 2 * original;
57: }
58:
59: double Double(double original)
60: {
61: cout << "In Double(double)\n";
62: return 2 * original;
63: }
Output: myInt: 6500
myLong: 65000
myFloat: 6.5
myDouble: 6.5e+20
In Double(int)
In Double(long)
In Double(float)
In Double(double)
DoubledInt: 13000
DoubledLong: 130000
DoubledFloat: 13
DoubledDouble: 1.3e+21

IV.3.8 Cc hm "InLine".
Khi nh ngha 1 hm, thng thng trnh bin dch to ra 1 tp cc lnh
trong b nh. Khi gi 1 hm, vic x l ca chng trnh nhy ti cc lnh
ny, v khi tr v hm, vic thc hin nhy tr v dng tip theo trong
hm gi. Nu gi hm 10 ln, chng trnh nhy ti tp lnh tng t mi
ln. Ngha l ch c sao chp hm 1 ln, khng phi 10 ln.
C 1 s chc nng mo u trong vic nhy vo v nhy ra khi hm. i
vi hm nh ch 1 dng hoc 2 dng m lnh v 1 s kh nng c th c li
nu chng trnh c th trnh c vic nhy ny ch x l 1 hoc 2
lnh. Khi ni v hiu qu , cc nh lp trnh ni rng: Chng trnh chy
nhay hn nu hm gi c th c trnh.

Trang 55
T hc C++ trong 21 ngy.
Nu 1 hm c khai bo vi t kho "inline", trnh bin dch khng to
ra mt hm thc : n sao chp m t hm inline trc tip t hm gi.
Khng c bc nhy; n ch nh l nu bn vit cc lnh ca hm bn
phi sang hm gi.
Ch rng: Trong hm inline c th a ra mt gi tr ln. Nu hm -
c gi 10 ln, m inline c copy sang hm gi mi ln trong 10 ln .
Vic ci tin gim nh tc c th t c bng cch tng kh nng x
l chng trnh . Cc trnh bin dch ngy nay thc hin cng vic rt ln,
v hu nh khng c li ln t vic khai bo mt hm inline.
Listing 5.9. Demonstrates an inline function.
1: // Listing 5.9 - demonstrates inline functions
2:
3: #include <iostream.h>
4:
5: inline int Double(int);
6:
7: int main()
8: {
9: int target;
10:
11: cout << "Enter a number to work with: ";
12: cin >> target;
13: cout << "\n";
14:
15: target = Double(target);
16: cout << "Target: " << target << endl;
17:
18: target = Double(target);
19: cout << "Target: " << target << endl;
20:
21:
22: target = Double(target);
23: cout << "Target: " << target << endl;
24: return 0;

Trang 56
T hc C++ trong 21 ngy.
25: }
26:
27: int Double(int target)
28: {
29: return 2*target;
30: }
Output: Enter a number to work with: 20

Target: 40
Target: 80
Target: 160

IV.4 qui.
Mt hm c th gi chnh n. iu ny c gi l qui, v qui c
th l trc tip hoc khng trc tip. L trc tip khi 1 hm t gi chnh
n; l khng trc tip khi 1 hm gi mt hm khc m sau gi hm
u tin.
Hm qui cn mt iu kin dng, nu khng n s khng bao gi kt
thc. Trong chui Fibonacci , iu kin dng l n<3.
Thut ton s dng cho chui :
1. Hi user v v tr trong chui.
2. Gi hm fib() vi v tr . Nhn gi tr user a vo.
3. Hm fib() xc nh i s (n). Nu n<3, n tr v 1; ngc li fib()
t gi n ( qui) n-2, t gi li n-1 v tr v tng s.
Nu gi fib(1), n tr v 1. Nu gi fib(2) , n tr v 1, gi fib(3), n tr
v tng ca fib(2) v fib(1). V fib(2) tr v 1 v fib(1) tr v 1, fib(3) s
tr v 2.
Nu gi fib(4), n tr v tng ca fib(3) v fib(2). Chng ta thit lp
fib(3) tr v 2 v fib(2) tr v 1, v vy fib(4) s l tng ca nhng s ny
v tr v 3, l s th 4 trong chui.
Thc hin cc bc ny nu gi fib(5), n tr v 5.
Phng php ny hu nh khng c hiu qu gii quyt bi ton ny ( vi
fib(20), hm fib() c gi 13529 ln) , nhng n vn thc hin. Cn thn:
nu vi n qu ln, n s ht b nh. Mi hm fib() c gi, b nh c thit

Trang 57
T hc C++ trong 21 ngy.
lp ring ra. Khi n tr v b nh c gii phng. Vi qui, b nh tip tc
ring ra trc khi n c gii phng, v phng php ny c th chim b
nh rt nhanh.
Listing 5.10. Demonstrates recursion using the Fibonacci
series.
1: // Listing 5.10 - demonstrates recursion
2: // Fibonacci find.
3: // Finds the nth Fibonacci number
4: // Uses this algorithm: Fib(n) = fib(n-1) + fib(n-2)
5: // Stop conditions: n = 2 || n = 1
6:
7: #include <iostream.h>
8:
9: int fib(int n);
10:
11: int main()
12: {
13:
14: int n, answer;
15: cout << "Enter number to find: ";
16: cin >> n;
17:
18: cout << "\n\n";
19:
20: answer = fib(n);
21:
22: cout << answer << " is the " << n << "th Fibonacci number\n";
23: return 0;
24: }
25:
26: int fib (int n)
27: {
28: cout << "Processing fib(" << n << ")... ";
29:

Trang 58
T hc C++ trong 21 ngy.
30: if (n < 3 )
31: {
32: cout << "Return 1!\n";
33: return (1);
34: }
35: else
36: {
37: cout << "Call fib(" << n-2 << ") and fib(" << n-1 << ").\n";
38: return( fib(n-2) + fib(n-1));
39: }
40: }

Output: Enter number to find: 5

Processing fib(5)... Call fib(3) and fib(4).


Processing fib(3)... Call fib(1) and fib(2).
Processing fib(1)... Return 1!
Processing fib(2)... Return 1!
Processing fib(4)... Call fib(2) and fib(3).
Processing fib(2)... Return 1!
Processing fib(3)... Call fib(1) and fib(2).
Processing fib(1)... Return 1!
Processing fib(2)... Return 1!
5 is the 5th Fibonacci number
qui khng thng s dng trong lp trnh C++, nhng n c th l cng
c y sc mnh i vi nhu cu no .
Ch : qui l 1 phn rt kho lo ca lp trnh nng cao.

IV.5 Stack v hm.


y l nhng ci xy ra khi 1 chng trnh chy trn 1 PC di mi trng
DOS, r nhnh ti hm:
1. a ch trong con tr lnh c tng ln ti lnh tip theo qua vic
gi hm. a ch sau c thay th trn stack, v n s tr v
a ch khi hm tr v.

Trang 59
T hc C++ trong 21 ngy.
2. Ngn c to ra trn stack i vi kiu tr v c khai bo. Trn
h thng vi s nguyn 2-byte, nu kiu tr v c khai bo l int, 2-
byte khc c thm vo stack, nhng khng gi tr c thay th trong
cc byte ny.
3. a ch ca hm c gi, c gi trong khu vc c bit ca b
nh, gi s rng c np vo trong con tr lnh, v vy lnh sau
c x l s l bn trong hm c gi.
4. nh hin ti ca stack c gi trong con tr c bit c gi l
khung stack. Mi th c thm vo stack t by gi ti khi hm tr
v s c xem xt ti.
5. Tt c cc i s vi hm c thay th trn stack.
6. Lnh by gi trong con tr lnh c x l, v th x l lnh u
tin ca hm.
7. Cc bin khu vc c y vo trong stack nh chng c nh
ngha .
Khi hm c tr v , gi tr tr v c thay th trong khu vc ca stack tr
li bc 2.Stack sau c y tt c ln khung con tr.

V Cc lp c bn.

V.1 To ra cc kiu mi.

V.1.1 Ti sao phi to mt kiu mi.


Chng trnh thng c vit gii nhng bi ton ca th gii thc,
nh l lu gi cc bn ghi ca nhn vin, m phng cng vic ca mt h
thng t nng. Mc d n c kh nng gii cc bi ton phc tp bng
cch s dng cc chng trnh c vit ch vi s nguyn v k t, n s d
dng thc hin cc bi ton ln v phc tp hn nu c th to i din
ca cc i tng m s ni n. Ni cch khc, m phng cng vic mt h
thng nung nng d dng hn nu c th to ra cc bin m i din l
cc bung, cc cm bin nhit, b n nhit, v ni hi.

V.1.2 Lp v cc b phn.
Thc hin mt kiu mi bng cch khai bo mt lp (class).Mt lp ch
l mt tp cc bin-- thng l cc kiu khc nhau-- kt hp vi 1 tp cc
hm c lin quan.

Trang 60
T hc C++ trong 21 ngy.
Mt lp cho php gi gn nhng phn khc nhau v nhng hm khc
nhau vo trong mt tp hp, m c gi l mt i tng (objects).
Mt lp c th bao gm bt c kiu bin no cng nh cc kiu lp khc.
Cc bin trong lp c coi nh l cc bin b phn hay cc b phn d liu.
Ch : Member variables cng c bit nh data members, l cc bin trong
lp.
Member functions cng c bit nh l methods l cc hm trong lp.
Member functions cng nh cc bin thnh vin l cc phn ca lp. Chng
xc nh i tng (objects) ca lp c th lm c g.

V.1.2.1 Khai bo mt lp (class).


khai bo 1 lp, s dng t kho class theo sau l du m ngoc ({),
v sau l danh sch cc thnh vin d liu v cc h thng ca lp. Kt
thc khai bo l du ng ngoc (}) v du chm phy. V d khai bo 1
lp c gi l Cat :
class Cat
{
unsigned int itsAge;
unsigned int itsWeight;
Meow();
};
Khai bo lp ny khng nh v tr b nh cho Cat. N ch cho trnh
bin dch bit Cat l g, d liu g n c ( itsAge v itsWeight), v n c
th lm c g ( Meow() ). N cng ch cho trnh bin dch bit mt lp
Cat ln bao nhiu, bao nhiu "room" trnh bin dch phi thit lp cho Cat
m bn to ra. Trong v d ny , nu mt s nguyn l hai byte, mt Cat
ch l 4-byte : itsAge l 2 byte, itsWeight l 2 byte khc. Meow() khng
chim "room" no, v khng c khng gian lu tr dnh cho hm thnh
vin(methods).

V.1.2.2 nh ngha i tng (Object).


nh ngha mt i tng ca lp mi ch nh l nh ngha mt bin s
nguyn:
unsigned int GrossWeight; // define an unsigned integer
Cat Frisky; // define a Cat

Trang 61
T hc C++ trong 21 ngy.
on m ny nh ngha 1 bin gi l Gross Weight l s nguyn khng
du. N cng nh ngha Frisky, l i tng ca lp Cat.
Ch : Mt i tng l 1 trng hp ring bit ca mt lp.
truy nhp vo cc b phn trong lp, ngi ta thng dng du (.).
Trong v d trn, gn 50 vo bin thnh vin Weight ca Frisky, phi
vit:
Frisky.Weight = 50;
Tng t, gi hm Meow(), nn vit :
Frisky.Meow() ;

V.1.2.3 Gn cho i tng, khng gn cho lp.


Trong C++, khng gn gi tr cho cc kiu; m gn gi tr cho bin. V d,
bn khng bao gi c vit :
Int = 5 ;
Trnh bin dch s a ra mt li, v khng th gn 5 cho mt s nguyn.
Bn phi vit nh sau:
Int x ;
X=5;
Tng t, khng th vit :
Cat.age = 5 ;
Trnh bin dch s a ra mt li, v khng th gn 5 cho phn tn ca mt
lp Cat. Bn phi nh ngha mt i tng Cat v gn 5 cho i tng .
V d:
Cat Frisky; // just like int x;
Frisky.age = 5; // just like x = 5;

V.1.3 Private v Public.


Cc t kho khc dng khai bo lp. C hai loi thng dng l : public
v private.
Tt c cc phn (thnh vin) ca mt lp-- d liu v phng php
(methods)-- l private theo mc nh. Cc thnh vin private c th c
truy nhp ch bn trong method ca chnh lp . Cc thnh vin private
c th c truy nhp thng qua bt c i tng no ca lp. S khc nhau
ny l c quan trng v kh hiu. hiu r rng hn, quan st v d sau:
class Cat
{

Trang 62
T hc C++ trong 21 ngy.
unsigned int itsAge;
unsigned int itsWeight;
Meow();
};
Trong v d ny , itsAge, itsWeight, v Meow() tt c l private, v tt c
thnh vin ca 1 lp l private theo mc nh.
Mc d vy, nu bn vit:
Cat Boots;
Boots.itsAge=5; // error! can't access private data!
Trnh bin dch s bo 1 li .
Cch s dng Cat v vy bn c th truy nhp vo c cc thnh vin data
l:
class Cat
{
public:
unsigned int itsAge;
unsigned int itsWeight;
Meow();
};
By gi itsAge , itsWeight, v Meow() tt c l public. Boots.itsAge = 5
bin dch khng gp li no.
Listing 6.1. Accessing the public members of a simple
class.
1: // Demonstrates declaration of a class and
2: // definition of an object of the class,
3:
4: #include <iostream.h> // for cout
5:
6: class Cat // declare the class object
7: {
8: public: // members which follow are public
9: int itsAge;
10: int itsWeight;
11: };

Trang 63
T hc C++ trong 21 ngy.
12:
13:
14: void main()
15: {
16: Cat Frisky;
17: Frisky.itsAge = 5; // assign to the member variable
18: cout << "Frisky is a cat who is " ;
19: cout << Frisky.itsAge << " years old.\n";
20:
Output: Frisky is a cat who is 5 years old.
Mt qui lut chung ca thit k l nn gi li d liu thnh phn ca mt
private lp. V vy, bn phi to ra cc hm public c bit nh l b truy
nhp h thng thit lp v nhn cc bin private thnh vin. Nhng
b truy nhp h thng l cc hm thnh vin m cc phn ca chng
trnh gi nhn c v thit lp cc bin private thnh vin.
Ch : Mt public accessor method l 1 hm thnh vin ca lp c dng
hoc c gi tr ca bin thnh vin private ca lp hoc thit
lp gi tr ca n.
Cc hm truy nhp cho php phn loi chi tit bao nhiu d liu lu tr
c s dng. iu ny cho php thay i d liu c lu gi, khng phi
vit li hm m s dng d liu.
Nu mt hm cn truy nhp trc tip vo itsAge ca Cat, hm s cn
phi vit li nu bn l tc gi ca lp Cat, quyt nh thay i d liu
c lu tr. Bng cch gi hm GetAge(). V d minh ho:
Listing 6.2. A class with accessor methods.
1: // Cat class declaration
2: // Data members are private, public accessor methods
3: // mediate setting and getting the values of the private data
4:
5: class Cat
6: {
7: public:
8: // public accessors
9: unsigned int GetAge();

Trang 64
T hc C++ trong 21 ngy.
10: void SetAge(unsigned int Age);
11:
12: unsigned int GetWeight();
13: void SetWeight(unsigned int Weight);
14:
15: // public member functions
16: Meow();
17:
18: // private member data
19: private:
20: unsigned int itsAge;
21: unsigned int itsWeight;
22:
23: };
thit lp tui ca Frisky, ta c th a gi tr vo hm SetAge() nh sau:
Cat Frisky;
Frisky.SetAge(5); // set Frisky's age using the public accessor

V.1.4 T kho Class.


C php nh sau:
Class class_name
{
// t kha iu khin truy nhp
// cc bin lp v cc hm c khai bo y.
};
T kho Class dng khai bo cc kiu mi. Mt lp l mt tp hp ca
lp d liu thnh vin, m l cc bin ca cc kiu khc nhau, bao gm cc
lp khc nhau. Cc lp cng c cc hm lp-- cc methods-- l cc hm c
x l d liu trong lp v thc hin cc dch v khc cho lp. Vic
nh ngha cc i tng trong lp thc hin tng t nh nh ngha bin
bt k. C th vo cc thnh vin ca lp v cc hm bng cch s dng
du chm (.). Bn c th s dng cc t kho iu khin truy nhp
khai bo cc phn ca lp nh l public hay private. Mc nh i vi iu
khin truy nhp l private. Mi t kho thay i iu khin truy nhp t

Trang 65
T hc C++ trong 21 ngy.
im n ht lp hoc n t kha iu khin truy nhp tip theo.
V d:
class Cat
{
public:
unsigned int Age;
unsigned int Weight;
void Meow();
};

Cat Frisky;
Frisky.Age = 8;
Frisky.Weight = 18;
Frisky.Meow();
V d:
class Car
{
public: // the next five are public
void Start();
void Accelerate();
void Brake();
void SetYear(int year);
int GetYear();

private: // the rest is private


int Year;
Char Model [255];
}; // end of class declaration

Car OldFaithful; // make an instance of car


int bought; // a local variable of type int
OldFaithful.SetYear(84) ; // assign 84 to the year
bought = OldFaithful.GetYear(); // set bought to 84
OldFaithful.Start(); // call the start method

Trang 66
T hc C++ trong 21 ngy.
V.1.4.1 Cc hm b sung trong lp.
Hm b sung c gi l nh ngha hm.
Mt nh ngha hm thnh vin bt u vi tn ca lp, sau l 2 du
2 chm (::), tn ca hm, v cc tham s ca n. V d:
Listing 6.3. Implementing the methods of a simple class.
1: // Demonstrates declaration of a class and
2: // definition of class methods,
3:
4: #include <iostream.h> // for cout
5:
6: class Cat // begin declaration of the class
7: {
8: public: // begin public section
9: int GetAge(); // accessor function
10: void SetAge (int age); // accessor function
11: void Meow(); // general function
12: private: // begin private section
13: int itsAge; // member variable
14: };
15:
16: // GetAge, Public accessor function
17: // returns value of itsAge member
18: int Cat::GetAge()
19: {
20: return itsAge;
21: }
22:
23: // definition of SetAge, public
24: // accessor function
25: // returns sets itsAge member
26: void Cat::SetAge(int age)
27: {
28: // set member variable its age to
29: // value passed in by parameter age

Trang 67
T hc C++ trong 21 ngy.
30: itsAge = age;
31: }
32:
33: // definition of Meow method
34: // returns: void
35: // parameters: None
36: // action: Prints "meow" to screen
37: void Cat::Meow()
38: {
39: cout << "Meow.\n";
40: }
41:
42: // create a cat, set its age, have it
43: // meow, tell us its age, then meow again.
44: int main()
45: {
46: Cat Frisky;
47: Frisky.SetAge(5);
48: Frisky.Meow();
49: cout << "Frisky is a cat who is " ;
50: cout << Frisky.GetAge() << " years old.\n";
51: Frisky.Meow();
52; return 0;
53: }
Output: Meow.
Frisky is a cat who is 5 years old.
Meow.

V.1.5 Cc hm xy dng v xa mc nh.


Nu bn khng khai bo mt hm xy dng hoc 1 hm xo, trnh
bin dch thc hin cho bn. Hm xy dng v xo mc nh khng c
i s v khng lm g.
khai bo mt i tng khng a vo cc tham s, nh l
Cat Rags ; // Rags khng nhn tham s
Bn phi c mt hm xy dng trong lp.

Trang 68
T hc C++ trong 21 ngy.
Cat () ;
Khi nh ngha mt i tng ca 1 lp, cc hm xy dng c gi.
Nu hm xy dng Cat() c 2 tham s, phi nh ngha mt i tng Cat
bng cch vit
Cat Frisky (5,7);
Nu c 1 tham s th vit:
Cat Frisky (3);
Khi hm xy dng khng c tham s th b du ngoc v vit:
Cat Frisky ;
Listing 6.4. Using constructors and destructors.
1: // Demonstrates declaration of a constructors and
2: // destructor for the Cat class
3:
4: #include <iostream.h> // for cout
5:
6: class Cat // begin declaration of the class
7: {
8: public: // begin public section
9: Cat(int initialAge); // constructor
10: ~Cat(); // destructor
11: int GetAge(); // accessor function
12: void SetAge(int age); // accessor function
13: void Meow();
14: private: // begin private section
15: int itsAge; // member variable
16: };
17:
18: // constructor of Cat,
19: Cat::Cat(int initialAge)
20: {
21: itsAge = initialAge;
22: }
23:
24: Cat::~Cat() // destructor, takes no action

Trang 69
T hc C++ trong 21 ngy.
25: {
26: }
27:
28: // GetAge, Public accessor function
29: // returns value of itsAge member
30: int Cat::GetAge()
31: {
32: return itsAge;
33: }
34:
35: // Definition of SetAge, public
36: // accessor function
37:
38: void Cat::SetAge(int age)
39: {
40: // set member variable its age to
41: // value passed in by parameter age
42: itsAge = age;
43: }
44:
45: // definition of Meow method
46: // returns: void
47: // parameters: None
48: // action: Prints "meow" to screen
49: void Cat::Meow()
50: {
51: cout << "Meow.\n";
52: }
53:
54: // create a cat, set its age, have it
55 // meow, tell us its age, then meow again.
56: int main()
57: {
58: Cat Frisky(5);

Trang 70
T hc C++ trong 21 ngy.
59: Frisky.Meow();
60: cout << "Frisky is a cat who is " ;
61: cout << Frisky.GetAge() << " years old.\n";
62: Frisky.Meow();
63: Frisky.SetAge(7);
64: cout << "Now Frisky is " ;
65: cout << Frisky.GetAge() << " years old.\n";
66; return 0;
67: }

Output: Meow.
Frisky is a cat who is 5 years old.
Meow.
Now Frisky is 7 years old.
Ch :
Khng nn a tham s cho cc hm xo ( destructors ). Cc hm xy
dng (instructors ) v hm xo khng nn tr v gi tr . S dng hm xy
dng khi to cho i tng .

V.1.5.1 Cc hm thnh vin Const.


Nu khai bo mt hm trong lp l const, bn phi hy vng hm s khng
lm thay i gi tr ca bt c thnh vin no ca lp. khai bo mt
hm khng i trong lp, t t kho const sau du ngoc n nhng tr-
c du chm phy. V d khi bo hm khng i SomeFunction() khng c
i s v tr v dng void:
Void someFunction() const ;
V d
Void SetAge (int anAge) ;
Int GetAge () ;
SetAge() khng th l const v n thay i bin thnh vin itsAge.
GetAge() c th l const v n khng thay i tt c lp. GetAge() tr
v gi tr hin ti ca bin thnh vin itsAge. V vy, khai bo hm ny
nn vit:
Void SetAge (int anAge) ;
Int GetAge () const ;

Trang 71
T hc C++ trong 21 ngy.
V.2 t khai bo lp v hm trong lp u.
Mi hm m bn khai bo cho lp, phi c mt nh ngha . S nh
ngha cng c gi l s b xung hm. Ging nh cc hm khc, nh
ngha ca mt hm trong lp c mt u v 1 thn hm.
S nh ngha phi trong 1 file m trnh bin dch c th tm
thy. Hu ht cc trnh bin dch C++ mun cc file kt thc vi .C
hoc .CCP. Trong quyn sch ny vit l .CCP.
Bn t do t khai bo trong file ny, nhng l khng tt cho lp trnh
thc t. Quy c m hu ht cc lp trnh vin chp nhn t khai bo vo
trong ci c gi l u file, thng vi tn kt thc l .H hoc .HP, .HPP .
Trong quyn sch ny u file vi .HPP.
V d, t khai bo ca lp Cat vo trong 1 file c tn CAT.HPP, v t
khai bo ca hm trong lp vo trong 1 file c gi l CAT.CPP. Sau gn
u file vi file .CPP bng cch t m lnh sau u file CAT.CPP:
#include Cat.hpp
iu ny bo cho trnh bin dch c CAT.HPP bn trong file. Vic c file
u bo cho chng mi th chng cn bit; chng c th b qua
cc file b xung.

V.2.1.1 B xung Inline.


Khai bo vi hm GetWeight() :
inline int Cat::GetWeight()
{
return itsWeight; // return the Weight data member
}
Bn cng c th t nh ngha ca hm vo trong khai bo ca lp, m
t ng thc hin hm inline . V d :
class Cat
{
public:
int GetWeight() { return itsWeight; } // inline
void SetWeight(int aWeight);
};
V d:
class Cat

Trang 72
T hc C++ trong 21 ngy.
{
public:
int GetWeight()
{
return itsWeight;
} // inline
void SetWeight(int aWeight);
};
V d khai bo lp cat trong file CAT.HPP
Listing 6.6. Cat class declaration in CAT.HPP
1: #include <iostream.h>
2: class Cat
3: {
4: public:
5: Cat (int initialAge);
6: ~Cat();
7: int GetAge() { return itsAge;} // inline!
8: void SetAge (int age) { itsAge = age;} // inline!
9: void Meow() { cout << "Meow.\n";} // inline!
10: private:
11: int itsAge;
12: };
Listing 6.7. Cat implementation in CAT.CPP.
1: // Demonstrates inline functions
2: // and inclusion of header files
3:
4: #include "cat.hpp" // be sure to include the header files!
5:
6:
7: Cat::Cat(int initialAge) //constructor
8: {
9: itsAge = initialAge;
10: }
11:

Trang 73
T hc C++ trong 21 ngy.
12: Cat::~Cat() //destructor, takes no action
13: {
14: }
15:
16: // Create a cat, set its age, have it
17: // meow, tell us its age, then meow again.
18: int main()
19: {
20: Cat Frisky(5);
21: Frisky.Meow();
22: cout << "Frisky is a cat who is " ;
23: cout << Frisky.GetAge() << " years old.\n";
24: Frisky.Meow();
25: Frisky.SetAge(7);
26: cout << "Now Frisky is " ;
27: cout << Frisky.GetAge() << " years old.\n";
28: return 0;
29: }

Output: Meow.
Frisky is a cat who is 5 years old.
Meow.
Now Frisky is 7 years old.
Trong v d ny, trn dng 4 c #include "cat.hpp" , n bo cho tin x l
c file cat.hpp vo trong file ny. K thut ny cho php bn t khai
bo vo trong mt file b xung khc. y l k thut rt thng dng trong
lp trnh C++. in hnh, khai bo lp trong file .HPP v sau c
#include vo trong file c lin kt .CPP.

V.2.2 Cc lp vi cc lp khc nh l d liu thnh vin.


Ngi ta khng thng xy dng mt lp phc tp bng vic khai bo cc lp
n gin hn v gp chng vo trong khai bo ca lp phc tp.
Quan st v d th 2. Mt hnh ch nht l kt hp ca cc ng thng.
Mt ng thng c 2 im. Mt im c nh ngha bng 1 to
x,y . V d sau ch ra mt khai bo hon chnh ca mt lp hnh ch

Trang 74
T hc C++ trong 21 ngy.
nht, xut hin trong RECTANGLE.HPP. V mt hnh ch nhtdc nh
ngha l 4 ng thng lin kt vi nhau 4 im, mi im coi l mt
to trn th, u tin khai bo mt lp Point, gi cc to x,y
ca mi im.
Listing 6.8. Declaring a complete class.
1: // Begin Rect.hpp
2: #include <iostream.h>
3: class Point // holds x,y coordinates
4: {
5: // no constructor, use default
6: public:
7: void SetX(int x) { itsX = x; }
8: void SetY(int y) { itsY = y; }
9: int GetX()const { return itsX;}
10: int GetY()const { return itsY;}
11: private:
12: int itsX;
13: int itsY;
14: }; // end of Point class declaration
15:
16:
17: class Rectangle
18: {
19: public:
20: Rectangle (int top, int left, int bottom, int right);
21: ~Rectangle () {}
22:
23: int GetTop() const { return itsTop; }
24: int GetLeft() const { return itsLeft; }
25: int GetBottom() const { return itsBottom; }
26: int GetRight() const { return itsRight; }
27:
28: Point GetUpperLeft() const { return itsUpperLeft; }
29: Point GetLowerLeft() const { return itsLowerLeft; }

Trang 75
T hc C++ trong 21 ngy.
30: Point GetUpperRight() const { return itsUpperRight; }
31: Point GetLowerRight() const { return itsLowerRight; }
32:
33: void SetUpperLeft(Point Location) {itsUpperLeft = Location;}
34: void SetLowerLeft(Point Location) {itsLowerLeft = Location;}
35: void SetUpperRight(Point Location) {itsUpperRight = Location;}
36: void SetLowerRight(Point Location) {itsLowerRight = Location;}
37:
38: void SetTop(int top) { itsTop = top; }
39: void SetLeft (int left) { itsLeft = left; }
40: void SetBottom (int bottom) { itsBottom = bottom; }
41: void SetRight (int right) { itsRight = right; }
42:
43: int GetArea() const;
44:
45: private:
46: Point itsUpperLeft;
47: Point itsUpperRight;
48: Point itsLowerLeft;
49: Point itsLowerRight;
50: int itsTop;
51: int itsLeft;
52: int itsBottom;
53: int itsRight;
54: };
55: // end Rect.hpp
Listing 6.9. RECT.CPP.
1: // Begin rect.cpp
2: #include "rect.hpp"
3: Rectangle::Rectangle(int top, int left, int bottom, int right)
4: {
5: itsTop = top;
6: itsLeft = left;
7: itsBottom = bottom;

Trang 76
T hc C++ trong 21 ngy.
8: itsRight = right;
9:
10: itsUpperLeft.SetX(left);
11: itsUpperLeft.SetY(top);
12:
13: itsUpperRight.SetX(right);
14: itsUpperRight.SetY(top);
15:
16: itsLowerLeft.SetX(left);
17: itsLowerLeft.SetY(bottom);
18:
19: itsLowerRight.SetX(right);
20: itsLowerRight.SetY(bottom);
21: }
22:
23:
24: // compute area of the rectangle by finding corners,
25: // establish width and height and then multiply
26: int Rectangle::GetArea() const
27: {
28: int Width = itsRight-itsLeft;
29: int Height = itsTop - itsBottom;
30: return (Width * Height);
31: }
32:
33: int main()
34: {
35: //initialize a local Rectangle variable
36: Rectangle MyRectangle (100, 20, 50, 80 );
37:
38: int Area = MyRectangle.GetArea();
39:
40: cout << "Area: " << Area << "\n";
41: cout << "Upper Left X Coordinate: ";

Trang 77
T hc C++ trong 21 ngy.
42: cout << MyRectangle.GetUpperLeft().GetX();
43: return 0;
44: }
Output: Area: 3000
Upper Left X Coordinate: 20

V.3 Cu trc (structures).


Mt t kha rt gn vi t kho class l struct , c dng khai bo mt
cu trc. Trong C++, mt cu trc chnh xc ng nh mt lp, ngoi tr cc
thnh vin ca n mc nh l public. Bn c th khai bo 1 cu trc
chnh xc nh khai bo 1 lp.
Xem li v d trn listing 6.8 :
- Dng 3, l : class Point to struct Point .
- Dng 17, l : class Rectangle to struct Rectangle .
Khi chy chng trnh th kt qu khng thay i.
Ch :
t khai bo lp vo trong file HPP v cc hm thnh vin trong file CPP. C
th s dng const bt c khi no.

VI Cc loi vng lp.

VI.1 Ngun gc vng lp go to.


Cc vng lp bao gm mt nhn, mt s cu lnh v mt bc nhy.
Trong C++, mt nhn ch l mt tn theo sau l du (:). Mt b c nhy c
thc hin bng cch vit goto vo sau tn nhn.
Listing 7.1. Looping with the keyword goto.
1: // Listing 7.1
2: // Looping with goto
3:
4: #include <iostream.h>
5:
6: int main()
7: {

Trang 78
T hc C++ trong 21 ngy.
8: int counter = 0; // initialize counter
9: loop: counter ++; // top of the loop
10: cout << "counter: " << counter << "\n";
11: if (counter < 5) // test the value
12: goto loop; // jump to the top
13:
14: cout << "Complete. Counter: " << counter << ".\n";
15: return 0;
16: }
Output: counter: 1
counter: 2
counter: 3
counter: 4
counter: 5
Complete. Counter: 5.

VI.1.1 Ti sao trnh dng lp goto.


Vic s dng lnh goto s gy ra s ln xn v kh khn, khng th c
chng trnh mt cch d dng c . Do nhng iu ny m ngi ta t khi
s dng lnh goto.
thay th cho vic s dng lnh goto, ngi ta a ra cc lnh: for, while,
v do ... while.
Ch khng nn dng goto. V n gy ra nhng phc tp.

VI.1.2 Cu lnh goto.


s dng lnh goto, ta vit sau goto l tn nhn. iu ny to ra b c nhy
v iu kin ti nhn. V d:
if (value > 10)
goto end ;
if (value < 10)
goto end;
cout << "value is 10!";
end: cout << "done";

VI.2 Vng lp While.


Vng lp While s lp li khi no iu kin bt u vn cn ng.

Trang 79
T hc C++ trong 21 ngy.
Listing 7.2. while loops.
1: // Listing 7.2
2: // Looping with while
3:
4: #include <iostream.h>
5:
6: int main()
7: {
8: int counter = 0; // initialize the condition
9:
10: while(counter < 5) // test condition still true
11: {
12: counter++; // body of the loop
13: cout << "counter: " << counter << "\n";
14: }
15:
16: cout << "Complete. Counter: " << counter << ".\n";
17: return 0;
18: }
Output: counter: 1
counter: 2
counter: 3
counter: 4
counter: 5
Complete. Counter: 5.

VI.2.1 Cu lnh While.


C php:
While (iu kin )
Cu lnh ;
iu kin l bt c biu thc no, cu lnh c th l 1 cu lnh hoc
mt khi cc lnh. Khi iu kin l ng (TRUE), , cu lnh c x l, v
sau iu kin c kim tra li. Qu trnh s tip tc n khi iu
kin kim tra l FALSE, khi vng lp kt thc v x l dng u tin
sau cu lnh .

Trang 80
T hc C++ trong 21 ngy.
V d:
// count to 10
int x = 0;
while (x < 10)
cout << "X: " << x++;

VI.2.2 Cu lnh While phc tp hn.


iu kin kim tra trong vng lp while c th phc tp, n c th s
dng ton t lgc: && (AND), // (OR), v ! (NOT).
Listing 7.3. Complex while loops.
1: // Listing 7.3
2: // Complex while statements
3:
4: #include <iostream.h>
5:
6: int main()
7: {
8: unsigned short small;
9: unsigned long large;
10: const unsigned short MAXSMALL=65535;
11:
12: cout << "Enter a small number: ";
13: cin >> small;
14: cout << "Enter a large number: ";
15: cin >> large;
16:
17: cout << "small: " << small << "...";
18:
19: // for each iteration, test three conditions
20: while (small < large && large > 0 && small < MAXSMALL)
21:
22: {
23: if (small % 5000 == 0) // write a dot every 5k lines
24: cout << ".";
25:

Trang 81
T hc C++ trong 21 ngy.
26: small++;
27:
28: large-=2;
29: }
30:
31: cout << "\nSmall: " << small << " Large: " << large << endl;
32: return 0;
33: }
Output: Enter a small number: 2
Enter a large number: 100000
small: 2.........
Small: 33335 Large: 33334

VI.2.3 Continue v break.


Lnh continue nhy tr li u ca vng lp. Lnh break lp tc kt thc
vng lp while v chng trnh x l tip sau du ng ngoc.
V d:
Listing 7.4. break and continue.
1: // Listing 7.4
2: // Demonstrates break and continue
3:
4: #include <iostream.h>
5:
6: int main()
7: {
8: unsigned short small;
9: unsigned long large;
10: unsigned long skip;
11: unsigned long target;
12: const unsigned short MAXSMALL=65535;
13:
14: cout << "Enter a small number: ";
15: cin >> small;
16: cout << "Enter a large number: ";
17: cin >> large;

Trang 82
T hc C++ trong 21 ngy.
18: cout << "Enter a skip number: ";
19: cin >> skip;
20: cout << "Enter a target number: ";
21: cin >> target;
22:
23: cout << "\n";
24:
25: // set up 3 stop conditions for the loop
26: while (small < large && large > 0 && small < 65535)
27:
28: {
29:
30: small++;
31:
32: if (small % skip == 0) // skip the decrement?
33: {
34: cout << "skipping on " << small << endl;
35: continue;
36: }
37:
38: if (large == target) // exact match for the target?
39: {
40: cout << "Target reached!";
41: break;
42: }
43:
44: large-=2;
45: } // end of while loop
46:
47: cout << "\nSmall: " << small << " Large: " << large << endl;
48: return 0;
49: }
Output: Enter a small number: 2
Enter a large number: 20
Enter a skip number: 4

Trang 83
T hc C++ trong 21 ngy.
Enter a target number: 6
skipping on 4
skipping on 8

Small: 10 Large: 8

VI.2.3.1 Lnh Continue.


Lm cho vng lp while hoc for tr li u vng lp. V d:
if (value > 10)
goto end;
if (value < 10)
goto end;
cout << "value is 10!";
end:
cout << "done";

VI.2.3.2 Cu lnh Break.


Lm cho vng lp while hoc for lp tc kt thc. V d:
while (condition)
{
if (condition2)
break;
// statements;
}

VI.2.4 Vng lp While(1).


y l vng lp While khng bao gi kt thc (lp v hn). V 1 lun
l ng v lp khng bao gi kt thc tr khi gp lnh break.
Listing 7.5. while (1) loops.
1: // Listing 7.5
2: // Demonstrates a while true loop
3:
4: #include <iostream.h>
5:
6: int main()
7: {
8: int counter = 0;

Trang 84
T hc C++ trong 21 ngy.
9:
10: while (1)
11: {
12: counter ++;
13: if (counter > 10)
14: break;
15: }
16: cout << "Counter: " << counter << "\n";
17: return 0;
18:
Output: Counter: 11

VI.3 Vng lp do ... While.

VI.3.1 Do ... While.


Vng lp ny x l khi lp trc khi kim tra iu kin ca n v chc
chn rng khi lp lun c thc hin vi thi gian ti thiu.

1: // Listing 7.7
2: // Demonstrates do while
3:
4: #include <iostream.h>
5:
6: int main()
7: {
8: int counter;
9: cout << "How many hellos? ";
10: cin >> counter;
11: do
12: {
13: cout << "Hello\n";
14: counter--;
15: } while (counter >0 );
16: cout << "Counter is: " << counter << endl;
17: return 0;

Trang 85
T hc C++ trong 21 ngy.
18: }

Output: How many hellos? 2


Hello
Hello
Counter is: 0
Cc lnh continue v break lm vic trong vng lp do ...while c tc dng
nh trong vng lp while. S khc nhau gia while v do...while l khi
no kim tra iu kin .

VI.3.2 C php vng lp do ... while.


C php:
Do
Cu lnh
While (iu kin) ;
Cu lnh c thc hin sau iu kin c xc nh. Nu iu kin
l TRUE, vng lp c lp li, ngc li nu l FALSE, vng lp kt thc.
V d 1:
// count to 10
int x = 0;
do
cout << "X: " << x++;
while (x < 10)
V d 2:
// print lowercase alphabet.
char ch = `a';
do
{
cout << ch << ` `;
ch++;
} while ( ch <= `z' );

Trang 86
T hc C++ trong 21 ngy.
VI.4 Vng lp For.
Khi lp trnh vi vng lp while, ta lun thng tm cho mnh iu kin
thit lp ban u, kim tra xem iu kin c ng khng, v tng ln
hoc cch khc thay i bin mi ln lp li.
Listing 7.8. While reexamined.
1: // Listing 7.8
2: // Looping with while
3:
4: #include <iostream.h>
5:
6: int main()
7: {
8: int counter = 0;
9:
10: while(counter < 5)
11: {
12: counter++;
13: cout << "Looping! ";
14: }
15:
16: cout << "\nCounter: " << counter << ".\n";
17: return 0;
18: }
Output: Looping! Looping! Looping! Looping! Looping!
Counter: 5.
V d v vng lp for:
Listing 7.9. Demonstrating the for loop.
1: // Listing 7.9
2: // Looping with for
3:
4: #include <iostream.h>
5:
6: int main()
7: {

Trang 87
T hc C++ trong 21 ngy.
8: int counter;
9: for (counter = 0; counter < 5; counter++)
10: cout << "Looping! ";
11:
12: cout << "\nCounter: " << counter << ".\n";
13: return 0;
14: }
Output: Looping! Looping! Looping! Looping! Looping!
Counter: 5.

VI.4.1 C php vng lp FOR.


C php cu lnh for :
For ( Khi to; Kim tra; hot ng)
Cu lnh ;
V d:
// print Hello ten times
for (int i = 0; i<10; i++)
cout << "Hello! ";
V d 2:
for (int i = 0; i < 10; i++)
{
cout << "Hello!" << endl;
cout << "the value of i is: " << i << endl;
}

VI.4.2 Vng lp For cp cao.


Cu lnh for c y sc mnh v s linh hot.
Mt vng lp for lm vic theo cc bc sau:
1. Thc hin php ton khi to.
2. Xc nh iu kin .
3. Nu iu kin TRUE, thc hin lnh hot ng v lp.
Sau mi ln, vng lp lp li cc bc 2 v 3. Vic khi to nhiu bin v
tng chng nn, v thc hin nhiu hn mt lnh . Khi to v hot ng
c th thay th bng nhiu cu lnh C++, mi cu lnh c ngn cch
bi 1 du phy.

Trang 88
T hc C++ trong 21 ngy.
Listing 7.10. Demonstrating multiple statements in for
loops.
1: //listing 7.10
2: // demonstrates multiple statements in
3: // for loops
4:
5: #include <iostream.h>
6:
7: int main()
8: {
9: for (int i=0, j=0; i<3; i++, j++)
10: cout << "i: " << i << " j: " << j << endl;
11: return 0;
12: }

Output: i: 0 j: 0
i: 1 j: 1
i: 2 j: 2
V d v cu lnh Null trong vng lp FOR:
1: // Listing 7.11
2: // For loops with null statements
3:
4: #include <iostream.h>
5:
6: int main()
7: {
8: int counter = 0;
9:
10: for( ; counter < 5; )
11: {
12: counter++;
13: cout << "Looping! ";
14: }
15:

Trang 89
T hc C++ trong 21 ngy.
16: cout << "\nCounter: " << counter << ".\n";
17: return 0;
18: }

output: Looping! Looping! Looping! Looping! Looping!


Counter: 5.
Trong thc t, s dng break v continue to ra mt vng for khng c
3 cu lnh .
V d cu lnh For rng:
1: //Listing 7.12 illustrating
2: //empty for loop statement
3:
4: #include <iostream.h>
5:
6: int main()
7: {
8: int counter=0; // initialization
9: int max;
10: cout << "How many hellos?";
11: cin >> max;
12: for (;;) // a for loop that doesn't end
13: {
14: if (counter < max) // test
15: {
16: cout << "Hello!\n";
17: counter++; // increment
18: }
19: else
20: break;
21: }
22: return 0;
23: }

Output: How many hellos?3

Trang 90
T hc C++ trong 21 ngy.
Hello!
Hello!
Hello!
Vng lp for(; ;) l lp v hn ging nh vng lp while(1) .

VI.5 Vng lp lng.


Cc vng lp c th c lng vo bn trong thn ca mt vng lp khc.
Vng lp bn trong c thc hin y i vi mi ln thc hin vng
lp ngoi.
Listing 7.14. Illustrates nested for loops.
1: //Listing 7.14
2: //Illustrates nested for loops
3:
4: #include <iostream.h>
5:
6: int main()
7: {
8: int rows, columns;
9: char theChar;
10: cout << "How many rows? ";
11: cin >> rows;
12: cout << "How many columns? ";
13: cin >> columns;
14: cout << "What character? ";
15: cin >> theChar;
16: for (int i = 0; i<rows; i++)
17: {
18: for (int j = 0; j<columns; j++)
19: cout << theChar;
20: cout << "\n";
21: }
22: return 0;
23: }

Output: How many rows? 4

Trang 91
T hc C++ trong 21 ngy.
How many columns? 12
What character? x
xxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxx

VI.6 S dng vng lp vi chui s.


Nh trn trnh by v chui Fibonacci. Chui Fibonacci c dng:
1, 1, 2, 3,5 , 8, 13, 21, 34, .....
Dng vng lp ta c th thc hin nh sau:
1: // Listing 7.15
2: // Demonstrates solving the nth
3: // Fibonacci number using iteration
4:
5: #include <iostream.h>
6:
7: typedef unsigned long int ULONG;
8:
9: ULONG fib(ULONG position);
10: int main()
11: {
12: ULONG answer, position;
13: cout << "Which position? ";
14: cin >> position;
15: cout << "\n";
16:
17: answer = fib(position);
18: cout << answer << " is the ";
19: cout << position << "th Fibonacci number.\n";
20: return 0;
21: }
22:
23: ULONG fib(ULONG n)
24: {

Trang 92
T hc C++ trong 21 ngy.
25: ULONG minusTwo=1, minusOne=1, answer=2;
26:
27: if (n < 3)
28: return 1;
29:
30: for (n - = 3; n; n--)
31: {
32: minusTwo = minusOne;
33: minusOne = answer;
34: answer = minusOne + minusTwo;
35: }
36:
37: return answer;
38: }
Output: Which position? 4

3 is the 4th Fibonacci number.

Which position? 5

5 is the 5th Fibonacci number.

Which position? 20

6765 is the 20th Fibonacci number.

Which position? 100

3314859971 is the 100th Fibonacci number.

VI.7 Cu lnh Switch.


Cu lnh switch c dng:
switch (expression)
{
case valueOne: statement;

Trang 93
T hc C++ trong 21 ngy.
break;
case valueTwo: statement;
break;
....
case valueN: statement;
break;
default: statement;
}
expression l bt c biu thc no, statements c th l mt lnh hoc 1
khi lnh. Switch xc nh expression v so snh kt qu vi mi gi tr
case .
Listing 7.16. Demonstrating the switch statement.
1: //Listing 7.16
2: // Demonstrates switch statement
3:
4: #include <iostream.h>
5:
6: int main()
7: {
8: unsigned short int number;
9: cout << "Enter a number between 1 and 5: ";
10: cin >> number;
11: switch (number)
12: {
13: case 0: cout << "Too small, sorry!";
14: break;
15: case 5: cout << "Good job!\n"; // fall through
16: case 4: cout << "Nice Pick!\n"; // fall through
17: case 3: cout << "Excellent!\n"; // fall through
18: case 2: cout << "Masterful!\n"; // fall through
19: case 1: cout << "Incredible!\n";
20: break;
21: default: cout << "Too large!\n";
22: break;

Trang 94
T hc C++ trong 21 ngy.
23: }
24: cout << "\n\n";
25: return 0;
26: }

Output: Enter a number between 1 and 5: 3


Excellent!
Masterful!
Incredible!

Enter a number between 1 and 5: 8


Too large!
V d khc.
switch (choice)
{
case 0:
cout << "Zero!" << endl;
break
case 1:
cout << "One!" << endl;
break;
case 2:
cout << "Two!" << endl;
default:
cout << "Default!" << endl;
}
Example 2

switch (choice)
{
choice 0:
choice 1:
choice 2:
cout << "Less than 3!";
break;

Trang 95
T hc C++ trong 21 ngy.
choice 3:
cout << "Equals 3!";
break;
default:
cout << "greater than 3!";
}

VI.7.1.1 S dng lnh switch vi menu.


Listing 7.17. Demonstrating a forever loop.
1: //Listing 7.17
2: //Using a forever loop to manage
3: //user interaction
4: #include <iostream.h>
5:
6: // types & defines
7: enum BOOL { FALSE, TRUE };
8: typedef unsigned short int USHORT;
9:
10: // prototypes
11: USHORT menu();
12: void DoTaskOne();
13: void DoTaskMany(USHORT);
14:
15: int main()
16: {
17:
18: BOOL exit = FALSE;
19: for (;;)
20: {
21: USHORT choice = menu();
22: switch(choice)
23: {
24: case (1):
25: DoTaskOne();
26: break;

Trang 96
T hc C++ trong 21 ngy.
27: case (2):
28: DoTaskMany(2);
29: break;
30: case (3):
31: DoTaskMany(3);
32: break;
33: case (4):
34: continue; // redundant!
35: break;
36: case (5):
37: exit=TRUE;
38: break;
39: default:
40: cout << "Please select again!\n";
41: break;
42: } // end switch
43:
44: if (exit)
45: break;
46: } // end forever
47: return 0;
48: } // end main()
49:
50: USHORT menu()
51: {
52: USHORT choice;
53:
54: cout << " **** Menu ****\n\n";
55: cout << "(1) Choice one.\n";
56: cout << "(2) Choice two.\n";
57: cout << "(3) Choice three.\n";
58: cout << "(4) Redisplay menu.\n";
59: cout << "(5) Quit.\n\n";
60: cout << ": ";

Trang 97
T hc C++ trong 21 ngy.
61: cin >> choice;
62: return choice;
63: }
64:
65: void DoTaskOne()
66: {
67: cout << "Task One!\n";
68: }
69:
70: void DoTaskMany(USHORT which)
71: {
72: if (which == 2)
73: cout << "Task Two!\n";
74: else
75: cout << "Task Three!\n";
76: }

Output: **** Menu ****

(1) Choice one.


(2) Choice two.
(3) Choice three.
(4) Redisplay menu.
(5) Quit.

:1
Task One!
**** Menu ****
(1) Choice one.
(2) Choice two.
(3) Choice three.
(4) Redisplay menu.
(5) Quit.

:3

Trang 98
T hc C++ trong 21 ngy.
Task Three!
**** Menu ****
(1) Choice one.
(2) Choice two.
(3) Choice three.
(4) Redisplay menu.
(5) Quit.

:5

VII n tp t I VI .
1: #include <iostream.h>
2:
3: typedef unsigned short int USHORT;
4: typedef unsigned long int ULONG;
5: enum BOOL { FALSE, TRUE};
6: enum CHOICE { DrawRect = 1, GetArea,
7: GetPerim, ChangeDimensions, Quit};
8: // Rectangle class declaration
9: class Rectangle
10: {
11: public:
12: // constructors
13: Rectangle(USHORT width, USHORT height);
14: ~Rectangle();
15:
16: // accessors
17: USHORT GetHeight() const { return itsHeight; }
18: USHORT GetWidth() const { return itsWidth; }
19: ULONG GetArea() const { return itsHeight * itsWidth; }
20: ULONG GetPerim() const { return 2*itsHeight + 2*itsWidth; }
21: void SetSize(USHORT newWidth, USHORT newHeight);
22:
23: // Misc. methods
24: void DrawShape() const;

Trang 99
T hc C++ trong 21 ngy.
25:
26: private:
27: USHORT itsWidth;
28: USHORT itsHeight;
29: };
30:
31: // Class method implementations
32: void Rectangle::SetSize(USHORT newWidth, USHORT newHeight)
33: {
34: itsWidth = newWidth;
35: itsHeight = newHeight;
36: }
37:
38:
39: Rectangle::Rectangle(USHORT width, USHORT height)
40: {
41: itsWidth = width;
42: itsHeight = height;
43: }
44:
45: Rectangle::~Rectangle() {}
46:
47: USHORT DoMenu();
48: void DoDrawRect(Rectangle);
49: void DoGetArea(Rectangle);
50: void DoGetPerim(Rectangle);
51:
52: void main ()
53: {
54: // initialize a rectangle to 10,20
55: Rectangle theRect(30,5);
56:
57: USHORT choice = DrawRect;
58: USHORT fQuit = FALSE;

Trang 100
T hc C++ trong 21 ngy.
59:
60: while (!fQuit)
61: {
62: choice = DoMenu();
63: if (choice < DrawRect || choice > Quit)
64: {
65: cout << "\nInvalid Choice, please try again.\n\n";
66: continue;
67: }
68: switch (choice)
69: {
70: case DrawRect:
71: DoDrawRect(theRect);
72: break;
73: case GetArea:
74: DoGetArea(theRect);
75: break;
76: case GetPerim:
77: DoGetPerim(theRect);
78: break;
79: case ChangeDimensions:
80: USHORT newLength, newWidth;
81: cout << "\nNew width: ";
82: cin >> newWidth;
83: cout << "New height: ";
84: cin >> newLength;
85: theRect.SetSize(newWidth, newLength);
86: DoDrawRect(theRect);
87: break;
88: case Quit:
89: fQuit = TRUE;
90: cout << "\nExiting...\n\n";
91: break;
92: default:

Trang 101
T hc C++ trong 21 ngy.
93: cout << "Error in choice!\n";
94: fQuit = TRUE;
95: break;
96: } // end switch
97: } // end while
98: } // end main
99:
100:
101: USHORT DoMenu()
102: {
103: USHORT choice;
104: cout << "\n\n *** Menu *** \n";
105: cout << "(1) Draw Rectangle\n";
106: cout << "(2) Area\n";
107: cout << "(3) Perimeter\n";
108: cout << "(4) Resize\n";
109: cout << "(5) Quit\n";
110:
111: cin >> choice;
112: return choice;
113: }
114:
115: void DoDrawRect(Rectangle theRect)
116: {
117: USHORT height = theRect.GetHeight();
118: USHORT width = theRect.GetWidth();
119:
120: for (USHORT i = 0; i<height; i++)
121: {
122: for (USHORT j = 0; j< width; j++)
123: cout << "*";
124: cout << "\n";
125: }
126: }

Trang 102
T hc C++ trong 21 ngy.
127:
128:
129: void DoGetArea(Rectangle theRect)
130: {
131: cout << "Area: " << theRect.GetArea() << endl;
132: }
133:
134: void DoGetPerim(Rectangle theRect)
135: {
136: cout << "Perimeter: " << theRect.GetPerim() << endl;
137: }
Output: *** Menu ***
(1) Draw Rectangle
(2) Area
(3) Perimeter
(4) Resize
(5) Quit
1
******************************
******************************
******************************
******************************
******************************

*** Menu ***


(1) Draw Rectangle
(2) Area
(3) Perimeter
(4) Resize
(5) Quit
2
Area: 150

*** Menu ***


(1) Draw Rectangle

Trang 103
T hc C++ trong 21 ngy.
(2) Area
(3) Perimeter
(4) Resize
(5) Quit
3
Perimeter: 70

*** Menu ***


(1) Draw Rectangle
(2) Area
(3) Perimeter
(4) Resize
(5) Quit
4

New Width: 10
New height: 8
**********
**********
**********
**********
**********
**********
**********
**********

*** Menu ***


(1) Draw Rectangle
(2) Area
(3) Perimeter
(4) Resize
(5) Quit
2
Area: 80

Trang 104
T hc C++ trong 21 ngy.

*** Menu ***


(1) Draw Rectangle
(2) Area
(3) Perimeter
(4) Resize
(5) Quit
3
Perimeter: 36

*** Menu ***


(1) Draw Rectangle
(2) Area
(3) Perimeter
(4) Resize
(5) Quit
5

Exiting...

VIII Con tr.

VIII.1Con tr l g ?
Con tr l 1 bin gi mt a ch b nh.

VIII.1.1 Lu a ch vo trong con tr.


Mi bin u c mt a ch. Thm ch khng cn bit a ch c
th ca mt bin bit, bn c th a ch vo mt con tr.
V d, gi s, howOld l mt s nguyn. khai bo 1 con tr gi l pAge
lu a ch ca n, ta vit:
Int *pAge = 0;
Khai bo ny pAge l mt con tr int . pAge c khai bo lu a ch
ca mt s nguyn.

Trang 105
T hc C++ trong 21 ngy.
Ch rng pAge l mt bin ging nh bt k bin no. Khi khai bo mt
bin con tr nh pAge, n c thit lp lu a ch. pAge ch c khc
kiu bin.
Trong v d ny, pAge c khi to l zero. Mt con tr m gi tr ca n l
0 th c gi l con tr rng (null). Tt c cc con tr, khi chng c to ra,
nn c khi to cho mt ci g .Nu bn khng bit gn g cho con tr
,th gn 0. Mt con tr m khng c khi to , c gi l con tr t do
(wild pointer). Con tr t do l rt nguy him.
Nu bn khi to con tr l 0, bn phi gn mt cch c th ca howOld cho
pAge. V d:
unsigned short int howOld = 50; // make a variable
unsigned short int * pAge = 0; // make a pointer
pAge = &howOld; // put howOld's address in pAge
Dng u tin to ra mt bin --howOld v khi to gi tr l 50. Dng th
hai khai bo 1 con tr kiu unsigned short int v khi to l zero. PAge l
mt con tr bi v du hoa th (*) sau kiu bin v trc tn bin.
Dng th 3 gn a ch ca howOld cho con tr pAge. C th ni rng
a ch howOld ang c gn bi a ch ca ton t (&). Nu a ch
ca ton t khng c s dng, gi tr ca howOld s c gn. iu c
th hoc khng th c c mt a ch ng.
Theo quan im ny, pAge c gi tr a ch ca howOld. HowOld ln lt
c gi tr 50. C th thc hin iu ny vi mt bc nh:
unsigned short int howOld = 50; // make a variable
unsigned short int * pAge = &howOld; // make pointer to howOld
pAge l con tr cha a ch ca bin howOld. S dng pAge, bn c th
xc nh gi tr ca bin howOld, trong trng hp ny l 50. Truy cp
howOld bng cch s dng con tr pAge c gi l gin tip, bi v khng
trc tip truy cp howOld bng pAge. Ngy nay, ta s xem cch s dng
gin tip truy nhp vo gi tr ca bin.
Gin tip ngha l truy nhp gi tr a ch c gi bi con tr. Con tr
cung cp mt cch khng trc tip nhn c gi tr lu a ch .

VIII.1.2 Tn con tr v ton t gin tip.


Tn con tr thng bt u vi ch p, nh l : pAge hoc pNumber.

Trang 106
T hc C++ trong 21 ngy.
Ton t gin tip (*) cng c gi l ton t "dereference". Khi mt con tr
c "dereferenced", gi tr a ch c lu tr bi con tr c truy nhp.
Cc bin thng thng cung cp truy nhp trc tip ti gi tr ca chng.
Nu to ra mt bin mi ca kiu unsigned short int c gi l yourAge, v
mun gn gi tr trong howOld cho bin mi , ta vit:
Unsigned short int yourAge ;
YourAge = howOld ;
Mt con tr cung cp truy nhp gin tip ti gi tr ca bin m a ch
n lu tr. gn gi tr trong howOld cho bin mi yourAge bng cch s
dng con tr pAge, ta vit:
Unsigned short int yourAge ;
YourAge = *pAge ;
(*) ng trc bin pAge c ngha " gi tr lu ". Lnh gn ny "a gi tr
lu a ch trong pAge v gn n cho yourAge"
khi con tr c "dereferenced", ton t gin tip ch ra gi tr vng b
nh c lu trong con tr c truy nhp, hn l a ch ca chnh n.
*pAge = 5 ; // gn 5 cho gi tr pAge.

VIII.1.2.1 Con tr, a ch v bin.


Ta phi phn bit c gia con tr v a ch m con tr lu, v gi
tr a ch lu bi con tr. y l ngun gc ca nhng phin phc v
con tr.
Quan st on m lnh sau:
int theVariable = 5;
int * pPointer = &theVariable ;
theVariable c khai bo l mt bin s nguyn c khi to vi gi tr 5.
pPointer c khai bo l mt con tr cho mt s nguyn; n c khi to vi
a ch ca theVariable. Gi tr a ch m pPointer lu gi l 5.

VIII.1.3 Thao tc d liu s dng con tr.


Mi ln con tr c gn a ch ca mt bin, bn c th s dng con
tr truy nhp vo d liu trong bin . V d 8.2 gii thch a
ch ca bin khu vc c gn cho con tr nh th no v con tr thao tc
gi tr trong bin nh th no.
1: // Listing 8.2 Using pointers
2:

Trang 107
T hc C++ trong 21 ngy.
3: #include <iostream.h>
4:
5: typedef unsigned short int USHORT;
6: int main()
7: {
8: USHORT myAge; // a variable
9: USHORT * pAge = 0; // a pointer
10: myAge = 5;
11: cout << "myAge: " << myAge << "\n";
12:
13: pAge = &myAge; // assign address of myAge to pAge
14:
15: cout << "*pAge: " << *pAge << "\n\n";
16:
17: cout << "*pAge = 7\n";
18:
19: *pAge = 7; // sets myAge to 7
20:
21: cout << "*pAge: " << *pAge << "\n";
22: cout << "myAge: " << myAge << "\n\n";
23:
24:
25: cout << "myAge = 9\n";
26:
27: myAge = 9;
28:
29: cout << "myAge: " << myAge << "\n";
30: cout << "*pAge: " << *pAge << "\n";
31:
32: return 0;
33: }

Output: myAge: 5
*pAge: 5

Trang 108
T hc C++ trong 21 ngy.
*pAge = 7
*pAge: 7
myAge: 7

myAge = 9
myAge: 9
*pAge: 9
Ch : *pointer: ch ra gi tr ca a ch m con tr lu gi

VIII.1.3.1 Kim tra a ch .


Con tr cho php bn thao tc a ch khng cn bit gi tr thc ca
chng.
Listing 8.3. Finding out what is stored in pointers.
1: // Listing 8.3 What is stored in a pointer.
2:
3: #include <iostream.h>
4:
5: typedef unsigned short int USHORT;
6: int main()
7: {
8: unsigned short int myAge = 5, yourAge = 10;
9: unsigned short int * pAge = &myAge; // a pointer
10:
11: cout << "myAge:\t" << myAge << "\tyourAge:\t" << yourAge << "\n";
12: cout << "&myAge:\t" << &myAge << "\t&yourAge:\t" << &yourAge <<"\n";
13:
14: cout << "pAge:\t" << pAge << "\n";
15: cout << "*pAge:\t" << *pAge << "\n";
16:
17: pAge = &yourAge; // reassign the pointer
18:
19: cout << "myAge:\t" << myAge << "\tyourAge:\t" << yourAge << "\n";
20: cout << "&myAge:\t" << &myAge << "\t&yourAge:\t" << &yourAge <<"\n";
21:
22: cout << "pAge:\t" << pAge << "\n";

Trang 109
T hc C++ trong 21 ngy.
23: cout << "*pAge:\t" << *pAge << "\n";
24:
25: cout << "&pAge:\t" << &pAge << "\n";
26: return 0;
27: }
Output: myAge: 5 yourAge: 10
&myAge: 0x355C &yourAge: 0x355E
pAge: 0x355C
*pAge: 5
myAge: 5 yourAge: 10
&myAge: 0x355C &yourAge: 0x355E
pAge: 0x355E
*pAge: 10
&pAge: 0x355A
Trong dng 8, myAge v yourAge c khai bo l cc bin kiu s nguyn
khng du short. Trong dng 9, pAge c khai bo l 1 con tr cho s
nguyn khng du short, v c khi to vi a ch ca bin myAge .
Dng 11 v 12 in gi tr v a ch ca myAge v yourAge .Dng 14 in
ni dung ca pAge, m l a ch ca myAge . Dng 15 in kt qu ca
"dereferencing" pAge, m in gi tr pAge-- gi tr trong myAge, hoc 5.
y l bn cht ca con tr. Dng 14 ch ra pAge lu c ca myAge, v
dng 15 ch ra cch nhn gi tr c lu trong myAge bng cch
"dereferencing" con tr pAge.
Dng 17, pAge c gn li ti im c ca yourAge. Gi tr v a ch li
c in ra. u ra a ra pAge by gi c a ch ca bin yourAge v t
c gi tr trong yourAge .
Dng 25 in ra a ch ca chnh pAge. Nh bt c bin no, n c 1 a
ch v a ch c th c lu trong 1 con tr.
S dng (*) truy nhp d liu lu gi ti a ch tron con tr . Khi to
con tr hoc a ch c th hoc gi tr null.

VIII.2Con tr.
khai bo mt con tr, vit kiu bin ng sau ton t con tr (*) v
tn ca con tr. V d:

Trang 110
T hc C++ trong 21 ngy.
unsigned short int *pPointer = 0 ;
gn hoc khi to con tr, s dng ton t a ch (&). V d:
unsigned short int theVariable = 5;
unsigned short int * pPointer = & theVariable;

VIII.3NEW
Bn c th nh r v tr b nh trn b nh trng (free store) trong
C++ bng cch s dng t kho new . New theo sau kiu ca i tng m
bn mun nh r v tr v vy trnh bin dch bit c cn bao nhiu
b nh. V vy, new unsigned short int nh r 2 byte nh v new long
nh r 4 byte nh.
Gi tr tr v t new l mt a ch b nh. N phi c gn vo mt con
tr. to ra mt unsigned short trn b nh rng, ta phi vit:
unsigned short int * pPointer;
pPointer = new unsigned short int;
Bn c th khi to con tr nh sau:
unsigned short int * pPointer = new unsigned short int;
Trong mi trng hp trn, pPointer coi nh mt con tr s nguyn khng du .
Ta c th vit:
*pPointer = 72 ;
Lnh ny c ngha, "gn gi tr 72 cho vng trn b nh rng ti cc im
pPointer ".

VIII.4Delete.
Khi bn kt thc vi khu vc ca b nh, bn phi gi "delete" thuc con tr.
Delete tr v vng nh cho b nh t do. Vng nh xc nh vi new khng t
ng gii phng c.
khi phc li b nh b nh rng, ta s dng t kho delete. V d:
delete pPointer ;
Listing 8.4. Allocating, using, and deleting pointers.
1: // Listing 8.4
2: // Allocating and deleting a pointer
3:
4: #include <iostream.h>

Trang 111
T hc C++ trong 21 ngy.
5: int main()
6: {
7: int localVariable = 5;
8: int * pLocal= &localVariable;
9: int * pHeap = new int;
10: if (pHeap == NULL)
11: {
12: cout << "Error! No memory for pHeap!!";
13: return 0;
14: }
15: *pHeap = 7;
16: cout << "localVariable: " << localVariable << "\n";
17: cout << "*pLocal: " << *pLocal << "\n";
18: cout << "*pHeap: " << *pHeap << "\n";
19: delete pHeap;
20: pHeap = new int;
21: if (pHeap == NULL)
22: {
23: cout << "Error! No memory for pHeap!!";
24: return 0;
25: }
26: *pHeap = 9;
27: cout << "*pHeap: " << *pHeap << "\n";
28: delete pHeap;
29: return 0;
30: }

Output: localVariable: 5
*pLocal: 5
*pHeap: 7
*pHeap: 9

VIII.5To i tng trn Free Store.


Nu bn khai bo mt i tng kiu Cat, bn c th khai bo mt con tr
trong lp Cat, c php nh sau:

Trang 112
T hc C++ trong 21 ngy.
Cat *pCat = new Cat ;
Listing 8.5. Creating and deleting objects on the free
store.
1: // Listing 8.5
2: // Creating objects on the free store
3:
4: #include <iostream.h>
5:
6: class SimpleCat
7: {
8: public:
9: SimpleCat();
10: ~SimpleCat();
11 private:
12 int itsAge;
13 };
14
15 SimpleCat::SimpleCat()
16 {
17 cout << "Constructor called.\n";
18 itsAge = 1;
19 }
20
21 SimpleCat::~SimpleCat()
22 {
23 cout << "Destructor called.\n";
24 }
25
26 int main()
27 {
28 cout << "SimpleCat Frisky...\n";
29 SimpleCat Frisky;
30 cout << "SimpleCat *pRags = new SimpleCat...\n";
31 SimpleCat * pRags = new SimpleCat;

Trang 113
T hc C++ trong 21 ngy.
32 cout << "delete pRags...\n";
33 delete pRags;
34 cout << "Exiting, watch Frisky go...\n";
35 return 0;
36 }

Output: SimpleCat Frisky...


Constructor called.
SimpleCat *pRags = new SimpleCat..
Constructor called.
delete pRags...
Destructor called.
Exiting, watch Frisky go...
Destructor called.

VIII.6Truy nhp cc thnh phn d liu.


truy nhp cc thnh phn, ta dng ton t chm (.):
(*pRags).GetAge() ;
Nu dng cch vit ny th s rt phc tp, trong C++ dng cch vit tt l
ton t ( -> ).
Listing 8.6. Accessing member data of objects on the free
store.
1: // Listing 8.6
2: // Accessing data members of objects on the heap
3:
4: #include <iostream.h>
5:
6: class SimpleCat
7: {
8: public:
9: SimpleCat() {itsAge = 2; }
10: ~SimpleCat() {}
11: int GetAge() const { return itsAge; }
12: void SetAge(int age) { itsAge = age; }

Trang 114
T hc C++ trong 21 ngy.
13: private:
14: int itsAge;
15: };
16:
17: int main()
18: {
19: SimpleCat * Frisky = new SimpleCat;
20: cout << "Frisky is " << Frisky->GetAge() << " years old\n";
21: Frisky->SetAge(5);
22: cout << "Frisky is " << Frisky->GetAge() << " years old\n";
23: delete Frisky;
24: return 0;
25: }

Output: Frisky is 2 years old


Frisky is 5 years old
Listing 8.7. Pointers as member data.
1: // Listing 8.7
2: // Pointers as data members
3:
4: #include <iostream.h>
5:
6: class SimpleCat
7: {
8: public:
9: SimpleCat();
10: ~SimpleCat();
11: int GetAge() const { return *itsAge; }
12: void SetAge(int age) { *itsAge = age; }
13:
14: int GetWeight() const { return *itsWeight; }
15: void setWeight (int weight) { *itsWeight = weight; }
16:
17: private:

Trang 115
T hc C++ trong 21 ngy.
18: int * itsAge;
19: int * itsWeight;
20: };
21:
22: SimpleCat::SimpleCat()
23: {
24: itsAge = new int(2);
25: itsWeight = new int(5);
26: }
27:
28: SimpleCat::~SimpleCat()
29: {
30: delete itsAge;
31: delete itsWeight;
32: }
33:
34: int main()
35: {
36: SimpleCat *Frisky = new SimpleCat;
37: cout << "Frisky is " << Frisky->GetAge() << " years old\n";
38: Frisky->SetAge(5);
39: cout << "Frisky is " << Frisky->GetAge() << " years old\n";
40: delete Frisky;
41: return 0;
42: }

Output: Frisky is 2 years old


Frisky is 5 years old

VIII.6.1 Con tr This .


Mi hm thnh vin trong lp u c mt tham s n : con tr this .
Con tr this dnh cho i tng ring. V vy, trong mi ln gi GetAge()
hay SetAge(), con tr this i vi i tng c bao gm mt tham s n.
Listing 8.8. Using the this pointer.
1: // Listing 8.8

Trang 116
T hc C++ trong 21 ngy.
2: // Using the this pointer
3:
4: #include <iostream.h>
5:
6: class Rectangle
7: {
8: public:
9: Rectangle();
10: ~Rectangle();
11: void SetLength(int length) { this->itsLength = length; }
12: int GetLength() const { return this->itsLength; }
13:
14: void SetWidth(int width) { itsWidth = width; }
15: int GetWidth() const { return itsWidth; }
16:
17: private:
18: int itsLength;
19: int itsWidth;
20: };
21:
22: Rectangle::Rectangle()
23: {
24: itsWidth = 5;
25: itsLength = 10;
26: }
27: Rectangle::~Rectangle()
28: {}
29:
30: int main()
31: {
32: Rectangle theRect;
33: cout << "theRect is " << theRect.GetLength() << " feet long.\n";
34: cout << "theRect is " << theRect.GetWidth() << " feet wide.\n";
35: theRect.SetLength(20);

Trang 117
T hc C++ trong 21 ngy.
36: theRect.SetWidth(10);
37: cout << "theRect is " << theRect.GetLength()<< " feet long.\n";
38: cout << "theRect is " << theRect.GetWidth()<< " feet wide.\n";
39: return 0;
40: }

Output: theRect is 10 feet long.


theRect is 5 feet long.
theRect is 20 feet long.
theRect is 10 feet long.
Cc hm SetLength() v GetLength() s dng con tr this truy nhp cc
bin thnh vin ca i tung Rectangle. Cc hm GetWidth v SetWidth
khng s dng.

VIII.7Con tr hng (const Pointer).


S dng t kho const cho con tr trc kiu ca n. Cc v d sau y l
hp php:
const int * pOne;
int * const pTwo;
const int * const pThree;
pOne l mt con tr vi mt hng s nguyn. Gi tr c lu tr khng thay
i c .
pTwo l con tr hng vi mt s nguyn. S nguyn c th c thay i,
nhng pTwo cng khng th tr ti bt c ci g.
pThree l con tr hng i vi mt hng s nguyn. Gi tr c lu khng
th c thay i, v pThree khng th thay i tr ti bt c th g.
const int * p1; // the int pointed to is constant
int * const p2; // p2 is constant, it can't point to anything else
Listing 8.10. Using pointers to const objects.

1: // Listing 8.10
2: // Using pointers with const methods
3:
4: #include <iostream.h>

Trang 118
T hc C++ trong 21 ngy.
5:
6: class Rectangle
7: {
8: public:
9: Rectangle();
10: ~Rectangle();
11: void SetLength(int length) { itsLength = length; }
12: int GetLength() const { return itsLength; }
13:
14: void SetWidth(int width) { itsWidth = width; }
15: int GetWidth() const { return itsWidth; }
16:
17: private:
18: int itsLength;
19: int itsWidth;
20: };
21:
22: Rectangle::Rectangle():
23: itsWidth(5),
24: itsLength(10)
25: {}
26:
27: Rectangle::~Rectangle()
28: {}
29:
30: int main()
31: {
32: Rectangle* pRect = new Rectangle;
33: const Rectangle * pConstRect = new Rectangle;
34: Rectangle * const pConstPtr = new Rectangle;
35:
36: cout << "pRect width: " << pRect->GetWidth() << " feet\n";
37: cout << "pConstRect width: " << pConstRect->GetWidth() << " feet\n";
38: cout << "pConstPtr width: " << pConstPtr->GetWidth() << " feet\n";

Trang 119
T hc C++ trong 21 ngy.
39:
40: pRect->SetWidth(10);
41: // pConstRect->SetWidth(10);
42: pConstPtr->SetWidth(10);
43:
44: cout << "pRect width: " << pRect->GetWidth() << " feet\n";
45: cout << "pConstRect width: " << pConstRect->GetWidth() << " feet\n";
46: cout << "pConstPtr width: " << pConstPtr->GetWidth() << " feet\n";
47: return 0;
48: }

Output: pRect width: 5 feet


pConstRect width: 5 feet
pConstPtr width: 5 feet
pRect width: 10 feet
pConstRect width: 5 feet
pConstPtr width: 10 feet

VIII.8Tm li.
Con tr cung cp mt cch y sc mnh truy nhp d liu gin tip.
Mi bin c mt a ch, m c th t c bng cch s dng ton t
a ch ca (&) . a ch c th c lu trong mt con tr.
Con tr c khai bo bng cch vit kiu ca i tng m chng tr ti,
sau l ton t gin tip (*) v tn ca con tr. Con tr nn c khi to
tr ti mt i tng hoc rng (null : 0 ).
Bn c th truy nhp gi tr a ch c lu trong mt con tr bng cch
s dng ton t gin tip (*). Bn c th khai bo con tr const, m khng
th c gn li tr ti i tng khc, v cc con tr ti cc i tng hng
(const), m khng th c dng thay i cc i tng m chng tr ti.
to cc i tng mi trn b nh free, bn s dng t kho new v gn
a ch tr li cho con tr. Bn gii phng b nh bng cch gi t kho
delete con tr. Delete gii phng b nh, nhng n khng ph hu con tr.
V vy, bn phi gn li con tr sau khi b nh c gii phng.

Trang 120
T hc C++ trong 21 ngy.

IX Tham kho ( References).

IX.1 Reference l g ?
Reference l mt b danh; khi bn to mt reference, bn khi to n vi
tn ca mt i tng khc, target. T , reference hot ng nh mt tn
c chn cho target, v bt c ci g lm cho reference thc cht l lm
cho target.
Ta c th to ra mt reference bng cch vit kiu ca i tng target,
theo sau ton t reference (&), sau l tn ca reference. Reference c
th s dng bt c tn bin hp php no, nhng trong sch ny chng ta s
dng tin t vi tn "r". V vy, nu bn c mt bin s nguyn tn
someInt, bn c th thc hin mt reference cho bin bng cch vit
nh sau:
int &rSomeRef = SomeInt ;
Lnh ny c l : " rSomeRef l mt reference cho mt s nguyn m
c khi to a cho someInt."
Ch :
Ton t reference (&) tng t biu tng nh c dng i vi a ch ca
ton t . y khng l cc ton t ging nhau.

Listing 9.1. Creating and using references.

1: //Listing 9.1
2: // Demonstrating the use of References
3:
4: #include <iostream.h>
5:
6: int main()
7: {
8: int intOne;
9: int &rSomeRef = intOne;
10:
11: intOne = 5;
12: cout << "intOne: " << intOne << endl;

Trang 121
T hc C++ trong 21 ngy.
13: cout << "rSomeRef: " << rSomeRef << endl;
14:
15: rSomeRef = 7;
16: cout << "intOne: " << intOne << endl;
17: cout << "rSomeRef: " << rSomeRef << endl;
18: return 0;
19: }

Output: intOne: 5
rSomeRef: 5
intOne: 7
rSomeRef: 7
Nu khai bo mt Reference, nhng nu khng khi to n th s gp phi
li bin dch. Reference phi c khi to.

IX.1.1 S sng ton t a ch & References.


Nu bn i hi a ch i vi mt Reference, n tr v a ch ca
target ca n. l iu t nhin ca n. Chng l cc b danh cho target.
Listing 9.2. Taking the address of a reference.

1: //Listing 9.2
2: // Demonstrating the use of References
3:
4: #include <iostream.h>
5:
6: int main()
7: {
8: int intOne;
9: int &rSomeRef = intOne;
10:
11: intOne = 5;
12: cout << "intOne: " << intOne << endl;
13: cout << "rSomeRef: " << rSomeRef << endl;
14:
15: cout << "&intOne: " << &intOne << endl;

Trang 122
T hc C++ trong 21 ngy.
16: cout << "&rSomeRef: " << &rSomeRef << endl;
17:
18: return 0;
19: }

Output: intOne: 5
rSomeRef: 5
&intOne: 0x3500
&rSomeRef: 0x3500
Listing 9.3. Assigning to a reference.
1: //Listing 9.3
2: //Reassigning a reference
3:
4: #include <iostream.h>
5:
6: int main()
7: {
8: int intOne;
9: int &rSomeRef = intOne;
10:
11: intOne = 5;
12: cout << "intOne:\t" << intOne << endl;
13: cout << "rSomeRef:\t" << rSomeRef << endl;
14: cout << "&intOne:\t" << &intOne << endl;
15: cout << "&rSomeRef:\t" << &rSomeRef << endl;
16:
17: int intTwo = 8;
18: rSomeRef = intTwo; // not what you think!
19: cout << "\nintOne:\t" << intOne << endl;
20: cout << "intTwo:\t" << intTwo << endl;
21: cout << "rSomeRef:\t" << rSomeRef << endl;
22: cout << "&intOne:\t" << &intOne << endl;
23: cout << "&intTwo:\t" << &intTwo << endl;
24: cout << "&rSomeRef:\t" << &rSomeRef << endl;

Trang 123
T hc C++ trong 21 ngy.
25: return 0;
26: }

Output: intOne: 5
rSomeRef: 5
&intOne: 0x213e
&rSomeRef: 0x213e

intOne: 8
intTwo: 8
rSomeRef: 8
&intOne: 0x213e
&intTwo: 0x2130
&rSomeRef: 0x213e
Ch :
S dng references to ra mt b danh cho 1 i tng. Nn khi to tt
c cc reference. Khng nn c gng gn li mt reference.

IX.1.2 Reference.
Bt c i tng no cng c th c xt n, bao gm cc i tng c
ngi s dng nh ngha. Ch rng bn to ra mt reference cho mt
i tng, nhng khng phi cho 1 lp. Bn khng c vit :
Int & rIntRef = int ; // sai
Bn phi khi to rIntRef cho mt s nguyn c th , nh l:
int howBig = 200;
int & rIntRef = howBig;
Trong cch tng t, bn khng nn khi to 1 reference cho mt CAT:
CAT & rCatRef = CAT ; // sai
Bn phi khi to rCatRef cho mt i tng CAT c th :
CAT frisky ;
CAT & rCatRef = frisky ;
Chng ta c th truy nhp vo d liu thnh vin bng cch dng ton t
chm (.).
Listing 9.4. References to objects.

Trang 124
T hc C++ trong 21 ngy.

1: // Listing 9.4
2: // References to class objects
3:
4: #include <iostream.h>
5:
6: class SimpleCat
7: {
8: public:
9: SimpleCat (int age, int weight);
10: ~SimpleCat() {}
11: int GetAge() { return itsAge; }
12: int GetWeight() { return itsWeight; }
13: private:
14: int itsAge;
15: int itsWeight;
16: };
17:
18: SimpleCat::SimpleCat(int age, int weight)
19: {
20: itsAge = age;
21: itsWeight = weight;
22: }
23:
24: int main()
25: {
26: SimpleCat Frisky(5,8);
27: SimpleCat & rCat = Frisky;
28:
29: cout << "Frisky is: ";
30: cout << Frisky.GetAge() << " years old. \n";
31: cout << "And Frisky weighs: ";
32: cout << rCat.GetWeight() << " pounds. \n";
33: return 0;
34: }

Trang 125
T hc C++ trong 21 ngy.
Output: Frisky is: 5 years old.
And Frisky weighs 8 pounds.

IX.1.2.1 C php References.


Khai bo mt reference bng cch vit kiu, sau l ton t &, sau l
tn reference. Reference phi c khi to cng thi im to ra.
V d:
int hisAge;
int &rAge = hisAge;
V d:
CAT boots;
CAT &rCatRef = boots;

IX.1.2.2 Hm swap() lm vic vi con tr.


Listing 9.6. Passing by reference using pointers.

1: //Listing 9.6 Demonstrates passing by reference


2:
3: #include <iostream.h>
4:
5: void swap(int *x, int *y);
6:
7: int main()
8: {
9: int x = 5, y = 10;
10:
11: cout << "Main. Before swap, x: " << x << " y: " << y << "\n";
12: swap(&x,&y);
13: cout << "Main. After swap, x: " << x << " y: " << y << "\n";
14: return 0;
15: }
16
17: void swap (int *px, int *py)
18: {
19: int temp;
20:

Trang 126
T hc C++ trong 21 ngy.
21: cout << "Swap. Before swap, *px: " << *px << " *py: " << *py << "\n";
22:
23: temp = *px;
24: *px = *py;
25: *py = temp;
26:
27: cout << "Swap. After swap, *px: " << *px << " *py: " << *py << "\n";
28:
29: }

Output: Main. Before swap, x: 5 y: 10


Swap. Before swap, *px: 5 *py: 10
Swap. After swap, *px: 10 *py: 5
Main. After swap, x: 10 y: 5
Listing 9.7. swap() rewritten with references.
1: //Listing 9.7 Demonstrates passing by reference
2: // using references!
3:
4: #include <iostream.h>
5:
6: void swap(int &x, int &y);
7:
8: int main()
9: {
10: int x = 5, y = 10;
11:
12: cout << "Main. Before swap, x: " << x << " y: " << y << "\n";
13: swap(x,y);
14: cout << "Main. After swap, x: " << x << " y: " << y << "\n";
15: return 0;
16: }
17:
18: void swap (int &rx, int &ry)
19: {

Trang 127
T hc C++ trong 21 ngy.
20: int temp;
21:
22: cout << "Swap. Before swap, rx: " << rx << " ry: " << ry << "\n";
23:
24: temp = rx;
25: rx = ry;
26: ry = temp;
27:
28: cout << "Swap. After swap, rx: " << rx << " ry: " << ry << "\n";
29:
30: }
Output: Main. Before swap, x:5 y: 10
Swap. Before swap, rx:5 ry:10
Swap. After swap, rx:10 ry:5
Main. After swap, x:10, y:5
Listing 9.8. Returning values with pointers.

1: //Listing 9.8
2: // Returning multiple values from a function
3:
4: #include <iostream.h>
5:
6: typedef unsigned short USHORT;
7:
8: short Factor(USHORT, USHORT*, USHORT*);
9:
10: int main()
11: {
12: USHORT number, squared, cubed;
13: short error;
14:
15: cout << "Enter a number (0 - 20): ";
16: cin >> number;
17:

Trang 128
T hc C++ trong 21 ngy.
18: error = Factor(number, &squared, &cubed);
19:
20: if (!error)
21: {
22: cout << "number: " << number << "\n";
23: cout << "square: " << squared << "\n";
24: cout << "cubed: " << cubed << "\n";
25: }
26: else
27: cout << "Error encountered!!\n";
28: return 0;
29: }
30:
31: short Factor(USHORT n, USHORT *pSquared, USHORT *pCubed)
32: {
33: short Value = 0;
34: if (n > 20)
35: Value = 1;
36: else
37: {
38: *pSquared = n*n;
39: *pCubed = n*n*n;
40: Value = 0;
41: }
42: return Value;
43: }
Output: Enter a number (0-20): 3
number: 3
square: 9
cubed: 27

X Mng

Trang 129
T hc C++ trong 21 ngy.
Mng l mt tp cc v tr lu tr d liu, mi v tr lu tr c
gi l mt thnh phn ca mng.
Khai bo mng: Kiu mng tn mng ch s mng: l s
phn t trong mng, bao quanh l du ngoc vung [ ].
V d :
Long longarray[25] ; // mng ny c 25 phn t
Cc phn t ca mng tnh t 0: longarray[0] , longarray[1], ... ,
longarray[24]
V d :
1: #include <iostream.h>
3:
4: int main()
5: {
6: int myArray[5];
7: int i;
8: for ( i=0; i<5; i++) // 0-4
9: {
10: cout << "Value for myArray[" << i << "]: ";
11: cin >> myArray[i];
12: }
13: for (i = 0; i<5; i++)
14: cout << i << ": " << myArray[i] << "\n";
15: return 0;
16: }

Output:
Value for myArray[0]: 3
Value for myArray[1]: 6
Value for myArray[2]: 9
Value for myArray[3]: 12
Value for myArray[4]: 15
0: 3
1: 6
2: 9
3: 12
4: 15

Trang 130
T hc C++ trong 21 ngy.
X.1 Khi to mng
C th khi to mng khi khai bo. V d:
Int intArray[5] = {10, 15, 20, 25, 35} ;
Nu qun kch thc ca mng, mt mng s c kch thc bng
ng s phn t khi to. V d:
Int intArray[ ] = { 5, 12, 15, 18, 20 };
Hm dng ly kch thc ca mng :
Const USHORT IntArraylength ;
IntArraylength = sizeof(IntArray)/sizeof(IntArray[0]) ;
Ly kch thc ton mng chia cho kch thc mt phn t.
Ch : Khng c khi to cc phn t ln hn khai bo cho
mng. Tuy nhin c th khi to 2 phn t trong 5 phn t ca
c mng:
Int IntArray[5] = {2, 6};
Nu khng khi to cho cc phn t ca mng th cc phn t s
c gn mc nh l 0.
Listing 11.3. Using consts and enums in arrays.
1: // Listing 11.3
2: // Dimensioning arrays with consts and enumerations
3:
4: #include <iostream.h>
5: int main()
6: {
7: enum WeekDays { Sun, Mon, Tue,
8: Wed, Thu, Fri, Sat, DaysInWeek };
9: int ArrayWeek[DaysInWeek] = { 10, 20, 30, 40, 50, 60, 70 };
10:
11: cout << "The value at Tuesday is: " << ArrayWeek[Tue];
12: return 0;
13: }
Output: The value at Tuesday is: 30
Mng cc i tng.
Bt c i tng no , mc d c sn hoc c nh
ngha, cng c th c lu trong mt mng.

Trang 131
T hc C++ trong 21 ngy.
Vic truy nhp d liu thnh phn trong mt mng i tng,
tri qua 2 bc:
- Xc nh s phn t ca mng nh ch s trong ton t [ ]
- Thm ton t (.) truy nhp bin thnh vin c th
V d:
Listing 11.4. Creating an array of objects.

1: // Listing 11.4 - An array of objects


2:
3: #include <iostream.h>
4:
5: class CAT
6: {
7: public:
8: CAT() { itsAge = 1; itsWeight=5; }
9: ~CAT() {}
10: int GetAge() const { return itsAge; }
11: int GetWeight() const { return itsWeight; }
12: void SetAge(int age) { itsAge = age; }
13:
14: private:
15: int itsAge;
16: int itsWeight;
17: };
18:
19: int main()
20: {
21: CAT Litter[5];
22: int i;
23: for (i = 0; i < 5; i++)
24: Litter[i].SetAge(2*i +1);
25:
26: for (i = 0; i < 5; i++)
27: {
28: cout << "Cat #" << i+1<< ": ";
29: cout << Litter[i].GetAge() << endl;
30: }
31: return 0;
32: }

Output: cat #1: 1


cat #2: 3
cat #3: 5
cat #4: 7
cat #5: 9

Trang 132
T hc C++ trong 21 ngy.
X.2 Mng nhiu chiu.
Mng nhiu chiu l c t hai chiu tr ln. Mi chiu c xc
nh bng mt du ngoc vung:
Int Mang [5] [3] ;
Khi to:
Th t xc nh l: 3 phn t u tin thuc Mang[0], 3 phn
t tip theo l thuc Mang[1] , v tip tc ...
Ta c th vit :
Int Mang[5][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15 } ;
r dng, nn vit nh sau:
Int Mang[5][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12},
{13, 14, 15} } ;

X.2.1 Mng con tr.


Listing 11.6. Storing an array on the free store.
1: // Listing 11.6 - An array of pointers to objects
2:
3: #include <iostream.h>
4:
5: class CAT
6: {
7: public:
8: CAT() { itsAge = 1; itsWeight=5; }
9: ~CAT() {} // destructor
10: int GetAge() const { return itsAge; }
11: int GetWeight() const { return itsWeight; }
12: void SetAge(int age) { itsAge = age; }
13:
14: private:
15: int itsAge;
16: int itsWeight;
17: };
18:
19: int main()
20: {
21: CAT * Family[500];
22: int i;
23: CAT * pCat;
24: for (i = 0; i < 500; i++)

Trang 133
T hc C++ trong 21 ngy.
25: {
26: pCat = new CAT;
27: pCat->SetAge(2*i +1);
28: Family[i] = pCat;
29: }
30:
31: for (i = 0; i < 500; i++)
32: {
33: cout << "Cat #" << i+1 << ": ";
34: cout << Family[i]->GetAge() << endl;
35: }
36: return 0;
37: }

Output: Cat #1: 1


Cat #2: 3
Cat #3: 5
...
Cat #499: 997
Cat #500: 999

Mng khai bo c tn Family, n gi 500 con tr i tng CAT.

X.2.2 Khai bo Mng trn Free Store.


C th a ton b mng ln Free Store, thc hin bng cch gi
t kho new v s dng ton t ch s. Kt qu l mt con tr
tr ti mt vng trn free store m cha mng . Vd:
Cat *Family = new Cat[500];
Khai bo Family l mt con tr tr ti phn t u tin trong
mng 500 Cat. Ni cch khc Family ch ti -- hoc c a ch
ca -- Family[0].
u im ca vic s dng Family theo cch ny l bn c th s
dng con tr s hc truy cp ti mi thnh vin ca Family.
V d:
CAT *Family = new CAT[500];
CAT *pCat = Family; //pCat points to Family[0]
pCat->SetAge(10); // set Family[0] to 10
pCat++; // advance to Family[1]
pCat->SetAge(20); // set Family[1] to 20
X.2.3 So snh con tr tr ti mng v mng con tr.

V d : C 3 khai bo.

Trang 134
T hc C++ trong 21 ngy.
1: Cat Fone[500] ;

2: Cat *Ftwo[500] ;

3: Cat *Fthree = new Cat[500] ;

FOne l mt mng 500 Cat.

Ftwo l mt mng 500 con tr tr ti cc Cat.


Fthree l mt con tr tr ti mt mng 500 Cat.
Trong khai bo th ba, Fthree l mt bin ca Fone.

X.3 Tn con tr v mng


Trong C++, tn mng l mt con tr hng tr ti phn t u
tin ca mng. V vy, trong khai bo:
Cat Family[50] ;
Family l mt con tr tr ti a ch &Family[0]: a ch ca
phn t u tin ca mng Family.
Ta c th vit : Family + 4 truy nhp n d liu ca
Family[4].

X.4 Mng k t (CHAR).


Trong C++, mt chui (String) l mt mng cc k t, kt thc l
mt k t null. Ta c th khai bo v khi to mt mng k t nh
cc mng thng thng nh sau:
Char Greeting[ ] = { 'H', 'e', 'l', 'l', 'o', ' ' W', 'o', 'r', 'l', 'd',
'\0' };
'\0' l k t null, trong nhiu hm C++ chp nhn nh l du kt
thc chui. gim s phc tp v c th gy ra li, C++ cho
php vit nh sau:
char Greeting[ ] = "Hello World" ; // Vi cch ny khng cn c
k t null ('\0')

Trang 135
T hc C++ trong 21 ngy.
Chui Hello World chim 12 byte. Hello chim 5 byte, space 1
byte, World 5 byte v null chim 1 byte.
Listing 11.8. Filling an array.
1: //Listing 11.8 char array buffers
2:
3: #include <iostream.h>
4:
5: int main()
6: {
7: char buffer[80];
8: cout << "Enter the string: ";
9: cin >> buffer;
10: cout << "Here's the buffer: " << buffer << endl;
11: return 0;
12: }

Output: Enter the string: Hello World


Here's the buffer: Hello

C hai kh nng li vi chng trnh ny:


- Th 1: Nu user a vo hn 79 k t (mt k t l ca null),
cin vit vo vt qu im kt thc ca mng buffer .
- Th 2: Nu user nhp vo 1 space, cin cho rng l kt
thc chui, v dng vic ghi vo buffer.
gii quyt iu ny, phi gi mt phng thc c bit vi
cin: get().cin.get() c 3 tham s:
- in y buffer
- S k t ti a nhn vo.
- nh ra ranh gii kt thc nhp vo.
Ranh gii mc nh l newline.
Listing 11.9. Filling an array.
1: //Listing 11.9 using cin.get()
2:
3: #include <iostream.h>
4:
5: int main()
6: {
7: char buffer[80];
8: cout << "Enter the string: ";

Trang 136
T hc C++ trong 21 ngy.
9: cin.get(buffer, 79); // get up to 79 or newline
10: cout << "Here's the buffer: " << buffer << endl;
11: return 0;
12: }

Output: Enter the string: Hello World


Here's the buffer: Hello World

X.5 Hm Strcpy( ) v Strncpy( ).


C++ tha hng t C mt s hm , trong c hai hm ny.
Listing 11.10. Using strcpy().
1: #include <iostream.h>
2: #include <string.h>
3: int main()
4: {
5: char String1[] = "No man is an island";
6: char String2[80];
7:
8: strcpy(String2,String1);
9:
10: cout << "String1: " << String1 << endl;
11: cout << "String2: " << String2 << endl;
12: return 0;
13: }

Output: String1: No man is an island


String2: No man is an island
Hm Strcpy( ) c hai tham s l chui ch v sau l chui
ngun, nu chui ngun ln hn chui ch, Strcpy( ) s ghi
ln phn cui ca buffer. chng li iu ny, s dng hm
Strncpy( ). Hm ny s copy n k t, n s copy ti k t null u
tin hoc ti s k t ti a c ch r trong chui ch.
Listing 11.11. Using strncpy().
1: #include <iostream.h>
2: #include <string.h>
3: int main()
4: {
5: const int MaxLength = 80;
6: char String1[] = "No man is an island";
7: char String2[MaxLength+1];
8:
9:
10: strncpy(String2,String1,MaxLength);
11:
12: cout << "String1: " << String1 << endl;
13: cout << "String2: " << String2 << endl;

Trang 137
T hc C++ trong 21 ngy.
14: return 0;
15: }

Output: String1: No man is an island


String2: No man is an island

X.6 String Classes


Listing 11.12. Using a String class.
1: //Listing 11.12
2:
3: #include <iostream.h>
4: #include <string.h>
5:
6: // Rudimentary string class
7: class String
8: {
9: public:
10: // constructors
11: String();
12: String(const char *const);
13: String(const String &);
14: ~String();
15:
16: // overloaded operators
17: char & operator[](unsigned short offset);
18: char operator[](unsigned short offset) const;
19: String operator+(const String&);
20: void operator+=(const String&);
21: String & operator= (const String &);
22:
23: // General accessors
24: unsigned short GetLen()const { return itsLen; }
25: const char * GetString() const { return itsString; }
26:
27: private:
28: String (unsigned short); // private constructor
29: char * itsString;
30: unsigned short itsLen;
31: };
32:
33: // default constructor creates string of 0 bytes
34: String::String()
35: {
36: itsString = new char[1];
37: itsString[0] = `\0';
38: itsLen=0;
39: }
40:
41: // private (helper) constructor, used only by
42: // class methods for creating a new string of

Trang 138
T hc C++ trong 21 ngy.
43: // required size. Null filled.
44: String::String(unsigned short len)
45: {
46: itsString = new char[len+1];
47: for (unsigned short i = 0; i<=len; i++)
48: itsString[i] = `\0';
49: itsLen=len;
50: }
51:
52: // Converts a character array to a String
53: String::String(const char * const cString)
54: {
55: itsLen = strlen(cString);
56: itsString = new char[itsLen+1];
57: for (unsigned short i = 0; i<itsLen; i++)
58: itsString[i] = cString[i];
59: itsString[itsLen]='\0';
60: }
61:
62: // copy constructor
63: String::String (const String & rhs)
64: {
65: itsLen=rhs.GetLen();
66: itsString = new char[itsLen+1];
67: for (unsigned short i = 0; i<itsLen;i++)
68: itsString[i] = rhs[i];
69: itsString[itsLen] = `\0';
70: }
71:
72: // destructor, frees allocated memory
73: String::~String ()
74: {
75: delete [] itsString;
76: itsLen = 0;
77: }
78:
79: // operator equals, frees existing memory
80: // then copies string and size
81: String& String::operator=(const String & rhs)
82: {
83: if (this == &rhs)
84: return *this;
85: delete [] itsString;
86: itsLen=rhs.GetLen();
87: itsString = new char[itsLen+1];
88: for (unsigned short i = 0; i<itsLen;i++)
89: itsString[i] = rhs[i];
90: itsString[itsLen] = `\0';
91: return *this;
92: }
93:

Trang 139
T hc C++ trong 21 ngy.
94: //nonconstant offset operator, returns
95: // reference to character so it can be
96: // changed!
97: char & String::operator[](unsigned short offset)
98: {
99: if (offset > itsLen)
100: return itsString[itsLen-1];
101: else
102: return itsString[offset];
103: }
104:
105: // constant offset operator for use
106: // on const objects (see copy constructor!)
107: char String::operator[](unsigned short offset) const
108: {
109: if (offset > itsLen)
110: return itsString[itsLen-1];
111: else
112: return itsString[offset];
113: }
114:
115: // creates a new string by adding current
116: // string to rhs
117: String String::operator+(const String& rhs)
118: {
119: unsigned short totalLen = itsLen + rhs.GetLen();
120: String temp(totalLen);
121: for (unsigned short i = 0; i<itsLen; i++)
122: temp[i] = itsString[i];
123: for (unsigned short j = 0; j<rhs.GetLen(); j++, i++)
124: temp[i] = rhs[j];
125: temp[totalLen]='\0';
126: return temp;
127: }
128:
129: // changes current string, returns nothing
130: void String::operator+=(const String& rhs)
131: {
132: unsigned short rhsLen = rhs.GetLen();
133: unsigned short totalLen = itsLen + rhsLen;
134: String temp(totalLen);
135: for (unsigned short i = 0; i<itsLen; i++)
136: temp[i] = itsString[i];
137: for (unsigned short j = 0; j<rhs.GetLen(); j++, i++)
138: temp[i] = rhs[i-itsLen];
139: temp[totalLen]='\0';
140: *this = temp;
141: }
142:
143: int main()
144: {

Trang 140
T hc C++ trong 21 ngy.
145: String s1("initial test");
146: cout << "S1:\t" << s1.GetString() << endl;
147:
148: char * temp = "Hello World";
149: s1 = temp;
150: cout << "S1:\t" << s1.GetString() << endl;
151:
152: char tempTwo[20];
153: strcpy(tempTwo,"; nice to be here!");
154: s1 += tempTwo;
155: cout << "tempTwo:\t" << tempTwo << endl;
156: cout << "S1:\t" << s1.GetString() << endl;
157:
158: cout << "S1[4]:\t" << s1[4] << endl;
159: s1[4]='x';
160: cout << "S1:\t" << s1.GetString() << endl;
161:
162: cout << "S1[999]:\t" << s1[999] << endl;
163:
164: String s2(" Another string");
165: String s3;
166: s3 = s1+s2;
167: cout << "S3:\t" << s3.GetString() << endl;
168:
169: String s4;
170: s4 = "Why does this work?";
171: cout << "S4:\t" << s4.GetString() << endl;
172: return 0;
173: }

Output: S1: initial test


S1: Hello world
tempTwo: ; nice to be here!
S1: Hello world; nice to be here!
S1[4]: o
S1: Hellx World; nice to be here!
S1[999]: !
S3: Hellx World; nice to be here! Another string
S4: Why does this work?
T dng 7-- 31 khai bo lp mt string n gin. Cc dng 11--
13 c 3 hm constructor : constructor mc nh, constructor
copy, constructor ly k t kt thc chui null.

Trang 141

You might also like