Você está na página 1de 135

Tù häc C++ trong 21 ngµy.

Teache yourself C++.

Danh môc:
C¸c phÇn cña mét ch¬ng tr×nh C++.
Giíi thiÖu hµm Cout.
Cout.
Tr×nh bµy chó thÝch.
§Þnh nghÜa hµm.
H»ng sè vµ biÕn sè.
C¸c kiÓu biÕn sè.
Typedef.
Ký tù dÆc biÖt.
H»ng sè.
H»ng sè liÖt kª.
BiÓu thøc vµ c©u lÖnh.
C©u lÖnh .
BiÓu thøc.
C¸c to¸n tö.
To¸n tö t¨ng vµ gi¶m.
C©u lÖnh if.
To¸n tö l« gÝc.
To¸n tö phô thuéc.

C¸c lo¹i hµm.


Khai b¸o hµm
Nguyªn mÉu hµm.
BiÕn khu vùc (biÕn ®Þa ph¬ng).
BiÕn toµn côc.
Gi¸ trÞ tr¶ vÒ.
Tham sè mÆc ®Þnh.
C¸c hµm xÕp chång.
C¸c hµm InLine.

Trang 1
Tù häc C++ trong 21 ngµy.
§Ö qui.

C¸c líp c¬ b¶n

T¹o ra mét kiÓu míi.


Khai b¸o líp( class ).
§Þnh nghÜa ®èi tîng (objects).
Private vµ public.
Class.
C¸c hµm trong líp.
C¸ch ®Æt khai b¸o líp vµ hµm.

C¸c lo¹i vßng lÆp.

LÖnh goto.
While.
Continue vµ break.
While(1).
Do ... While.
FOR.
Vßng lÆp lång.
Switch.

Con trá.

Con trá, ®Þa chØ, biÕn.

Khai b¸o con trá.

Reference

Có ph¸p:

Trang 2
Tù häc C++ trong 21 ngµy.

I C¸c phÇn cña ch¬ng tr×nh C++.


C¸c ch¬ng tr×nh C++ bao gåm : c¸c ®èi tîng (obj), c¸c biÕn (var) vµ c¸c thµnh phÇn
kh¸c.

I.1 Mét ch¬ng tr×nh ®¬n gi¶n.


VÝ dô lÊy ch¬ng tr×nh HELLO.CPP ®Ó gi¶i thÝch c¸c phÇn cña mét ch¬ng tr×nh C++.
1: #include <iostream.h>
2:
3: int main()
4: {
5: cout << "Hello World!\n";
6: return 0;
7: }
Hello World!
Dßng 1 lµ th viÖn # iostream.h.
- Ký tù ®Çu tiªn lµ biÓu tîng # : lµ mét tÝn hiÖu ®Ó cho bé tiÒn xö lý. Mçi lÇn b¾t ®Çu
biªn dÞch, bé tiÒn xö lý ®îc ch¹y. Bé tiÒn xö lý ®äc m· nguån cña b¹n, t×m kiÕm nh÷ng
dßng b¾t ®Çu víi dÊu ( #) vµ thùc hiÖn c¸c dßng nµy tríc khi biªn dÞch.

Trang 3
Tù häc C++ trong 21 ngµy.
- Include lµ mét lÖnh tiÒn xö lý. DÊu ngoÆc ®¬n <file name > chØ cho bé tiÒn xö lý ®Ó
t×m trong tÊt c¶ c¸c vÞ trÝ th«ng thêng ®èi víi file nµy. NÕu bé biªn dÞch ®îc thiÕt lËp
®óng, dÊu ngoÆc < > sÏ lµm cho bé tiÒn xö lý t×m kiÕm file " iostream.h" trong th môc
mµ chøa tÊt c¶ c¸c file H cho bé biªn dÞch.
- ( file "iostream.h" [ Input-Oput-Stream] ®îc dïng bëi hµm "cout"_ gióp cho viÖc viÕt ra
mµn h×nh. )
- Dßng 3 b¾t ®Çu ch¬ng tr×nh th«ng thêng víi hµm cã tªn " main() ". Mäi ch¬ng ttr×nh C+
+ ®Òu cã 1 hµm main(). Nãi chung," hµm lµ 1 khèi m· lÖnh mµ thùc hiÖn 1 hoÆc nhiÒu
c«ng viÖc." C¸c hµm th«ng thêng ®îc gäi bëi c¸c hµm kh¸c, nhng main() lµ ®Æc biÖt. Khi
ch¬ng tr×nh b¾t ®Çu, main() ®îc tù ®éng gäi lªn.
- ( main(), gièng nh tÊt c¸c hµm, ph¶i ®Þnh râ lo¹i gi¸ trÞ nµo nã sÏ tr¶ vÒ. KiÓu gi¸ trÞ tr¶
vÒ ®èi víi main() trong HELLO.CPP lµ "void" _nghÜa lµ hµm nµy sÏ kh«ng tr¶ vÒ bÊt
cø gi¸ trÞ nµo. )
- TÊt c¶ c¸c hµm b¾t ®Çu víi mét ngoÆc më ({) vµ kÕt thóc mét dÊu ngoÆc ®ãng (}).
DÊu ngoÆc cña main() lµ trªn dßng 4 vµ dßng 7.
- PhÇn c¨n b¶n cña ch¬ng tr×nh lµ dßng sè 5. Hµm "cout" dïng ®Ó in mét b¶n tin ra mµn
h×nh.
- C¸ch dïng cout : tõ cout ®Æt sau to¸n tö (<<). BÊt cø c¸i g× sau dÇu nµy th× ®Òu ®îc
viÕt lªn mµn h×nh. NÕu b¹n muèn viÕt mét chuçi ký tù, ph¶i viÕt chóng trong dÊu ngoÆc
kÐp ("), nh dßng 5.
- Cuèi cïng lµ 2 ký tù : " \n " _ b¶o hµm cout nh¶y xuèng mét dßng míi sau tõ Hello
World ! §©y lµ m· ®Æc biÖt ®îc gi¶i thÝch kü ë phÇn sau.
- Trong quyÓn s¸ch nµy hµm main() sÏ lu«n tr¶ vÒ 0.

I.2 Mét c¸i nh×n ng¾n gän vÒ hµm Cout.


Listing 2.2.Using cout.
1: // Listing 2.2 using cout
2:
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;

Trang 4
Tù häc C++ trong 21 ngµy.
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 trªn dßng 7, mçi gi¸ trÞ ®îc t¸ch ra bëi to¸n tö chÌn. Gi¸ trÞ ®Çu tiªn
lµ chuçi " Here is 5: ". Chó ý cã dÊu c¸ch sau dÊu hai chÊm. DÊu c¸ch lµ mét phÇn cña chuçi.
TiÕp ®Õn, gi¸ trÞ 5 ®îc ®a ra ®Õn to¸n tö chÌn vµ ký tù dßng míi ( lu«n lu«n trong dÊu
ngoÆc kÐp hay dÊu ngoÆc ®¬n). §iÒu nµy t¹o ra dßng:
Here is 5: 5
®îc in ra mµn h×nh. V× kh«ng cã ký tù dßng míi nªn gi¸ trÞ sau ®ã sÏ ®îc in ngay sau ®ã.
§©y gäi lµ mãc nèi 2 gi¸ trÞ.
Trªn dßng 8, b¶n tin ®îc in ra, vµ sau ®ã lÖnh " endl" ®îc sö dông. Môc ®Ých cña "endl "
lµ ®Ó viÕt mét dßng míi ra mµn h×nh.

?Trªn dßng 9, ( \t) ®îc ®a vµo. §©y lµ chÌn mét ký tù "tab" vµ nã ®îc dïng trªn dßng 8-
12. Dßng 9 chØ ra r»ng kh«ng chØ cã c¸c sè nguyªn, sè nguyªn dµi còng ®îc in ra.
Dßng 10 gi¶i thÝch r»ng: cout sÏ thùc hiÖn phÇn bæ sung ®¬n gi¶n. Gi¸ trÞ cña 8+5 ®îc
®a ra bëi cout, nhng 13 ®îc in ra.

Trang 5
Tù häc C++ trong 21 ngµy.
Trªn dßng 11, gi¸ trÞ 5/8 ®îc chÌn vµo cout. Sè h¹ng (float) chØ ra cho cout r»ng b¹n muèn
gi¸ trÞ nµy cã gi¸ trÞ t¬ng hÖ sè 10, vµ v× vËy mét ph©n sè ®îc in.
Trªn dßng 12, gi¸ trÞ 7000*7000 ®a tíi cout vµ sè h¹ng (double) chØ cho cout biÕt b¹n
muèn c¸i nµy ®îc in ra sö dông ký hiÖu to¸n häc

I.3 Chó thÝch (Comments).


Dïng ®Ó gi¶i thÝch c©u lÖnh cho dÔ hiÓu vµ giíi thiÖu ®îc c¸c th«ng tin vÒ t¸c gi¶ vµ
thêi gian söa ®æi míi nhÊt cho dÔ n©ng cÊp.
Trong C++ cã hai c¸ch b¸o hiÖu lêi chó thÝch lµ : ( // ) vµ ( /* ).
DÊu ( // ) nµy b¶o cho ch¬ng tr×nh biªn dÞch bá qua tÊt c¶ nh÷ng g× sau dÊu chó thÝch
nµy, tíi tËn hÕt dßng.
DÊu ( /* ) nµy b¶o cho ch¬ng tr×nh biªn dÞch bá qua tÊt c¶ nh÷ng g× sau dÊu chó thÝch
nµy, tíi khi t×m thÊy mét ( /* ) kh¸c.
C¸ch sö dông Comments:
Mét qui luËt chung, nªn cã mét chó thÝch ë ®Çu cña toµn ch¬ng tr×nh, nãi lªn ch¬ng
ttr×nh lµm c¸i g×.
Mçi hµm còng nªn cã chó thÝch gi¶i thÝch hµm lµm c¸i g× vµ nã tr¶ vÒ gi¸ trÞ nµo.
NÕu trong ch¬ng tr×nh cã c©u lÖnh nµo khã hiÓu th× còng nªn cã chó thÝch lµm s¸ng tá
vÊn ®Ò.
Listing 2.3. HELP.CPP demonstrates comments.
1: #include <iostream.h>
2:
3: int main()
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: }

Trang 6
Tù häc C++ trong 21 ngµy.
Hello World!
That comment ended!
 Chó thÝch ë ®Çu mçi file.
- Th«ng tin vÒ tªn cña ch¬ng tr×nh.
- Tªn cña file
- Cã hµm hoÆc ch¬ng tr×nh g×.
- M« t¶ chung vÒ c«ng viÖc cña ch¬ng tr×nh.
- Tªn t¸c gi¶.
- LÞch sö cña qu¸ tr×nh söa ®æi.
- Tr×nh biªn dÞch vµ kÕt nèi nµo vµ c¸c c«ng cô kh¸c ®îc dïng ®Ó thùc hiÖn ch¬ng
tr×nh.
- Thªm c¸c chó ý nÕu cÇn.
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.
Revisions: 1.00 10/1/94 (jl) First release 1.01 10/2/94 (jl) Capitalized "World"

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

I.4 Hµm ( Functions ).


Hµm main() lµ ®Æc biÖt. C¸c hµm th«ng thêng ®îc gäi trong ch¬ng tr×nh cña b¹n. Mét
ch¬ng tr×nh ®îc xö lý tõng dßng theo thø tù mµ nã cã trong m· nguån, tËn khi ®Õn mét hµm.
Sau ®ã ch¬ng tr×nh rÏ nh¸nh ®Ó xö lý hµm. Khi hµm kÕt thóc, nã tr¶ l¹i ®iÒu khiÓn cho
dßng m· ngay sau nã.
Khi mét ch¬ng tr×nh cÇn thùc hiÖn mét dÞch vô, nã cã thÓ gäi mét hµm ®Ó thùc hiÖn
dÞch vô ®ã. VÝ dô sau minh ho¹ ®iÒu ®ã:
Listing 2.4. Demonstrating a call to a function.

Trang 7
Tù häc C++ trong 21 ngµy.
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
In Demonstration Function
Back in main

C¸ch sö dông hµm:


Hµm hoÆc tr¶ vÒ gi¸ trÞ hoÆc chóng tr¶ vÒ void ( nghÜa lµ chóng tr¶ vÒ sè kh«ng
"nothing" ).
Mét hµm mµ céng hai sè nguyªn, ph¶i tr¶ vÒ tæng vµ v× vËy sÏ ®îc ®Þnh nghÜa ®Ó tr¶
vÒ mét gi¸ trÞ sè nguyªn.
Mét hµm mµ chØ in mét b¶n tin kh«ng cã c¸i g× ®Ó tr¶ vÒ, v× vËy sÏ ®îc khai b¸o ®Ó
tr¶ vÒ d¹ng "void".
Mét hµm bao gåm : ®Çu ®Ò vµ th©n hµm.
 §Çu ®Ò bao gåm lÇn lît : kiÓu tr¶ vÒ, tªn hµm, vµ c¸c tham sè dµnh cho hµm. C¸c tham
sè dµnh cho hµm cho phÐp c¸c gi¸ trÞ ®îc ®a vµo bªn trong hµm. V× vËy,nÕu hµm ®Ó
céng 2 sè, c¸c sè sÏ lµ tham sè cho hµm.
VÝ dô mét ®Çu ®Ò d¹ng hµm th«ng thêng:

Trang 8
Tù häc C++ trong 21 ngµy.
int Sum(int a, int b)
Mçi tham sè ®îc khai b¸o cïng víi kiÓu gi¸ trÞ sÏ ®a vµo ; gi¸ trÞ th«ng thêng ®îc ®a vµo
b»ng c¸ch gäi hµm ®îc gäi lµ ®èi sè. NhiÒu nhµ lËp tr×nh sö dông sö dông hai sè h¹ng : tham
sè (parameters) vµ ®èi sè (arguments) nh lµ " synonyms". Nh÷ng ngêi kh¸c cÈn thËn ®èi víi
viÖc ph©n biÖt thîc vÒ chuyªn m«n. Trong s¸ch nµy sÏ sö dông c¸c sè h¹ng ®ã cã thÓ ho¸n
®æi cho nhau.
 Th©n hµm bao gåm : mét dÊu ngoÆc më, kh«ng cã hoÆc cã c¸c c©u lÖnh vµ dÊu ngoÆc
®ãng. C¸c lÖnh cÊu tróc nªn c«ng viÖc cña hµm. Mét hµm cã thÓ tr¶ vÒ mét gi¸ trÞ, sö
dông mét lÖnh tr¶ vÒ. LÖnh nµy còng lµm cho hµm kÕt thóc. NÕu kh«ng ®a vµo mét
lÖnh tr¶ vÒ bªn trong hµm, nã sÏ tù ®éng tr¶ vÒ d¹ng void ë cuèi hµm. Gi¸ trÞ ®îc tr¶ vÒ
ph¶i lµ d¹ng ®· ®îc khai b¸o ë ®Çu hµm.
Listing 2.5. FUNC.CPP demonstrates a simple function.
1: #include <iostream.h>
2: int Add (int x, int y)
3: {
4:
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: }

Trang 9
Tù häc C++ trong 21 ngµy.
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...

II H»ng sè vµ biÕn sè.

II.1 BiÕn sè lµ g×:


Trong C++, biÕn sè lµ n¬i ®Ó lu gi÷ th«ng tin. Mét biÕn sè lµ mét vÞ trÝ trong bé nhí
cña m¸y tÝnh mµ cã thÓ lu gi÷ mét gi¸ trÞ vµ tõ ®ã b¹n cã thÓ truy nhËp vµo gi¸ trÞ ®ã sau
nµy.
Bé nhí cña m¸y tÝnh cã thÓ ®îc xem nh lµ mét lo¹t c¸c "cubbyholes". Mçi "cubbyholes"
hay vÞ trÝ trong bé nhí ®îc ®¸nh sè lÇn lît. Nh÷ng sè nµy ®îc biÕt lµ ®Þa chØ bé nhí. Mét
biÕn lu gi÷ trong mét hoÆc nhiÒu "cubbyholes" ®Ó lu mét gi¸ trÞ.
Tªn biÕn ( vÝ dô : myVariable) lµ mét nh·n trªn 1 hay nhiÒu "cubbyholes", v× vËy cã thÓ
t×m nã dÔ dµng kh«ng cÇn sù hiÓu biÕt ®Þa chØ bé nhí th«ng thêng cña nã.
C¸ch thiÕt lËp biÕn:
Khi ®Þnh nghÜa mét biÕn trong C++, b¹n ph¶i b¶o cho tr×nh biªn dÞch biÕt biÕn lµ
kiÓu g× : sè nguyªn, ký tù,.... §©y lµ th«ng tin b¸o cho tr×nh biªn dÞch biÕt kÝch thíc lín bao
nhiªu ®Ó thiÕt lËp mét kho¶ng bé nhí vµ kiÓu gi¸ trÞ b¹n muèn lu trong biÕn cña b¹n.
Mçi "cubbyholes" lµ lín 1 byte. NÕu kiÓu biÕn t¹o ra lµ kÝch thíc 2 byte, nã cÇn 2 byte
cña bé nhí, hay 2 "cubbyholes". KiÓu biÕn sÏ cho tr×nh biªn dÞch biÕt cÇn bao nhiªu bé nhí
®Ó dµnh cho biÕn.

II.1.1 KÝch thíc kiÓu sè nguyªn (Intergers)


- Mét biÕn char (dïng ®Ó lu ký tù) thêng lµ mét byte long. Mét short interger lµ 2 byte
trªn hÇu hÕt c¸c m¸y tÝnh, mét long interger thêng lµ 4 byte, vµ mét interger (kh«ng
ph¶i lµ long hay short) cã thÓ lµ 2 hay 4 byte.

Trang 10
Tù häc C++ trong 21 ngµy.
- Mét character lµ mét ch÷ ®¬n, sè, hay biÓu tîng chiÕm 1 byte cña bé nhí.
Listing 3.1. Determining the size of variable types on your computer.
1: #include <iostream.h>
2:
3: int main()
4: {
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ã dÊu vµ kh«ng dÊu.


Nãi chung tÊt c¶ c¸c kiÓu sè nguyªn lµ 2 d¹ng ch×nh : cã dÊu vµ kh«ng cã dÊu. Môc ®Ých ë
®©y lµ thØnh tho¶ng b¹n cÇn sè ©m vµ kh«ng cÇn. Sè nguyªn ( short vµ long )kh«ng cã tõ
"unsigned" ®îc coi lµ cã dÊu (signed). Sè nguyªn cã dÊu hoÆc lµ sè d¬ng hoÆc sè ©m. Sè
nguyªn kh«ng dÊu lu«n lµ d¬ng.
- Sè nguyªn kh«ng dÊu short cã gi¸ trÞ tõ : 0 ®Õn 65535
- Sè nguyªn cã dÊu short cã gi¸ trÞ tõ : -32768 ®Õn 32767

II.1.3 C¸c kiÓu biÕn c¬ b¶n


- BiÕn dÊu ph¶y ®éng dïng ®Ó biÓu diÔn sè thùc (real)
- BiÕn Character chiÕm 1 byte dïng ®Ó chøa 256 ký tù hoÆc biÓu tîng cña b¶ng ASCII
hoÆc ASCII më réng.
Table 3.1. Variable Types.

Trang 11
Tù häc C++ trong 21 ngµy.

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

C¸ch t¹o mét biÕn:


§Çu tiªn lµ kiÓu biÕn, sau ®ã lµ mét hoÆc nhiÒu dÊu c¸ch, sau ®ã lµ tªn biÕn vµ
dÊu chÊm phÈy.
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Ó t¹o nhiÒu biÕn cïng mét lóc nh sau:


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

Trang 12
Tù häc C++ trong 21 ngµy.
II.1.4 Tõ kho¸.
Bao gåm : if, while , for, main.
Kh«ng ®îc sö dông tõ khãa lµm tªn biÕn.

II.1.5 G¸n gi¸ trÞ cho biÕn


G¸n gi¸ trÞ cho biÕn b»ng c¸ch sö dông to¸n tö (=). VÝ dô:
unsigned short Width;
Width = 5;
B¹n cã thÓ gép ba bíc thµnh mét bíc.
unsigned short Width = 5;
T¬ng tù, cã thÓ khëi t¹o cho nhiÒu biÕn cïng mét lóc nh sau:
long width = 5, length = 7;
VÝ dô nµy khëi t¹o biÕn sè nguyªn long lµ width =5 vµ biÕn sè nguyªn long lµ length =7. Ta
cã thÓ kÕt hîp c¶ khai b¸o vµ khëi t¹o 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

Trang 13
Tù häc C++ trong 21 ngµy.
Area: 50

II.1.6 Typedef
Ta cã thÓ c¶m thÊy ch¸n ng¾t vµ buån tÎ nÕu cø ph¶i sö dông kiÓu khai b¸o unsigned short
int.
C++ cho phÐp b¹n t¹o ra mét bÝ danh cho côm tõ nµy b»ng c¸ch sö dông tõ kho¸ typedef, viÕt
t¾t cho sù ®Þnh nghÜa kiÓu.
Ta ®Þnh nghÜa b»ng c¸ch: sau tõ kho¸ typedef lµ kiÓu vµ sau ®ã lµ tªn míi. VÝ dô:
Typedef unsigned short int USHORT
Tªn míi USHORT sÏ dïng ë bÊt cø ®©u thay thÕ cho viÖc viÕt : 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 HiÖn tîng nh¶y vßng trong sè nguyªn cã dÊu vµ kh«ng cã dÊu.
HiÖn tîng nh¶y vßng khi biÕn sè vît qu¸ gi¸ trÞ cho phÐp cña kiÓu khai b¸o.

Trang 14
Tù häc C++ trong 21 ngµy.
Listing 3.4.A demonstration of putting too large a value in an unsigned
integer.
1: #include <iostream.h>
2: int main()
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

Trang 15
Tù häc C++ trong 21 ngµy.
small number:-32767

II.1.8 Characters
BiÕn ký tù ( type char ) lµ 1 byte, ®ñ ®Ó chøa 256 gi¸ trÞ. Mét char cã thÓ ®îc dÞch nh lµ
mét sè nhá ( 0-255) hay nh lµ mét sè cña tËp ASCII. Trong m· ASCII, "a" ®îc x¸c ®Þnh b»ng
gi¸ trÞ 97. TÊt c¶ chò thêng vµ ch÷ hoa, chò sè vµ c¸c dÊu chÊm cã gi¸ trÞ trong kho¶ng 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 C¸c ký tù ®Æc biÖt


Tr×nh biªn dÞch C++ chÊp nhËn mét sè ký tù ®Þnh d¹ng. B¹n ph¶i ®Æt ký tù nµy vµo trong
®o¹n m· b»ng c¸ch ®¸nh dÊu g¹ch chÐo ( ®îc gäi lµ ký tù ®iÒu khiÓn ), sau ®ã lµ kÝ tù. V×
vËy ®Ó ®a mét ký tù tab vµo trong ®o¹n m·, thùc hiÖn nh sau :
Char tabCharacter = '\t' ;
VÝ dô nµy khai b¸o mét biÕn char (tabCharacter) vµ khëi t¹o nã víi ký tù \t , mµ ®îc chÊp
nhËn nh lµ mét tab. C¸c ký tù in ®Æc biÖt ®îc dïng khi in hoÆc ra mµn h×nh hoÆc ra mét
thiÕt 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

Trang 16
Tù häc C++ trong 21 ngµy.
II.2 H»ng sè.
Gièng nh biÕn sè, h»ng sè còng lµ n¬i l÷u tr÷ d÷ liÖu. B¹n ph¶i khëi t¹o h»ng sè khi t¹o ra nã
vµ kh«ng thÓ g¸n mét gi¸ trÞ míi.
Trong C++ cã hai kiÓu h»ng : ch÷ vµ biÓu tîng.

II.2.1 H»ng sè kiÓu ch÷


VÝ dô :
Int myAge = 39 ;
MyAge lµ mét biÕn kiÓu int ; 39 lµ mét h»ng sè d¹ng ch÷. B¹n kh«ng thÓ g¸n mét gi¸ trÞ cho
39, vµ gi¸ trÞ cña nã kh«ng thÓ thay ®æi ®îc.

II.2.2 H»ng sè kiÓu biÓu tîng.


Lµ mét h»ng sè mµ ®îc ®¹i diÖn b»ng 1 tªn, chØ nh lµ mét biÕn nhng kh«ng gièng nh
biÕn, gi¸ trÞ cña nã sau khi khëi t¹o th× kh«ng thay ®æi ®îc.
NÕu ch¬ng tr×nh cã mét biÕn sè nguyªn ®Æt tªn lµ : students vµ mét biÕn kh¸c tªn lµ :
classes, cã thÓ tÝnh to¸n cã bao nhiªu sinh viªn, nÕu ®· biÕt cã 15sinh viªn/1 líp :
Students = classes * 15 ;
Trong vÝ dô nµy, 15 lµ h»ng sè kiÓu ch÷ sè. §o¹n m· trë lªn dÔ ®äc vµ dÔ söa. NÕu thay thÕ
b»ng mét h»ng sè kiÓu ch÷ cho gi¸ trÞ nµy th× sÏ lµ:
Students = classes * studentsPerClass ;
NÕu sau ®ã muèn thay ®æi sè sinh viªn/líp, cã thÓ lµm ®iÒu ®ã ë n¬i ®Þnh nghÜa h»ng sè
studentsPerClass kh«ng cÇn thùc hiÖn sù thay ®æi ë bÊt cø n¬i nµo b¹n dïng gi¸ trÞ nµy.
Cã hai c¸ch khai b¸o mét h»ng sè kiÓu biÓu tîng trong C++. C¸ch truyÒn thèng vµ kiÓu hiÖn
nay lµ dïng bé tiÒn xö lý, #define. H»ng sè ®Þnh nghÜa víi #define ®Ó ®Þnh nghÜa mét
h»ng sè theo c¸ch truyÒn thèng, cã thÓ thùc hiÖn nh sau:
#define studentsPerClass 15
Chó ý r»ng studentsPerClass lµ kh«ng ph¶i lµ kiÓu cô thÓ ( int, char,....). #define thùc hiÖn
mét sù thay thÕ ®o¹n v¨n b¶n ®¬n gi¶n. Mçi lÇn tiÒn xö lý nh×n thÊy tõ studentsPerClass, nã
sÏ thay b»ng 15.
V× bé tiÒn xö lý ch¹y tríc tr×nh biªn dÞch, do ®ã tr×nh biªn dÞch kh«ng bao giê nh×n thÊy
h»ng sè ; nã chØ thÊy sè 15. C¸c biÕn ®Þnh nghÜa const, mÆc dï #define lµm viÖc, cã mét
c¸ch míi tèt h¬n nhiÒu c¸ch ®Þnh nghÜa h»ng trong C++ :
const unsigned short int studentsPerClass = 15;
VÝ dô nµy còng khai b¸o mét h»ng sè biÓu tîng ®Æt tªn studentsPerClass, nhng lÇn nµy
studentsPerClass lµ kiÓu unsigned short int. Ph¬ng ph¸p nµy cã mét sè u ®iÓm lµm cho viÖc

Trang 17
Tù häc C++ trong 21 ngµy.
söa dÔ dµng h¬n vµ ng¨n ngõa sù rèi lo¹n. Sù kh¸c nhau lín nhÊt lµ h»ng nµy cã mét kiÓu, vµ
tr×nh biªn dÞch cã thÓ b¾t buéc dïng ®óng theo kiÓu cña nã.
Chó ý : kh«ng nªn dïng kiÓu int chung mµ chØ râ kiÓu short hay long.

II.2.3 H»ng sè liÖt kª.


Cho phÐp t¹o ra nhiÒu kiÓu míi vµ sau ®ã ®Ó ®Þnh nghÜa c¸c biÕn cña nh÷ng kiÓu
nµy,toµn bé gi¸ trÞ ®îc h¹n chÕ trong mét tËp c¸c gi¸ ttrÞ cã thÓ. VÝ dô b¹n cã thÓ khai b¸o
COLOR lµ mét b¶ng kiÖt kª, vµ cã thÓ ®Þnh nghÜa cã 5 gi¸ trÞ ®èi víi COLOR : RED,
BLUE, GREEN, WHITE vµ BLACK.
Có ph¸p ®èi víi h»ng sè liÖt kª ®îc viÕt víi tõ kho¸ enum, sau ®ã lµ tªn kiÓu, mét dÊu ngoÆc
më, mçi gi¸ trÞ ®îc ph©n c¸ch bëi mét dÊu phÈy, cuèi cïng lµ dÊu ngoÆc ®ãng vµ dÊu chÊm
phÈy. VÝ dô:
Enum COLOR { RED, BLUE, GREEN, WHITE, BLACK } ;
LÖnh nµy thùc hiÖn 2 c«ng viÖc:
- Nã ®Æt tªn COLOR cho liÖt kª, ®ã lµ mét kiÓu míi.
- Nã g¸n cho RED mét h»ng sè biÓu tîng 0, BLUE mét h»ng sè biÓu tîng 1, GREEN lµ 3,
vµ tiÕp tôc.
Mäi h»ng sè liÖt kª cã gi¸ trÞ nguyªn. NÕu kh«ng chØ râ c¸ch x¸c ®Þnh kh¸c th× h»ng sè ®Çu
tiªn sÏ cã gi¸ trÞ 0, vµ tiÕp tôc t¨ng lªn. BÊt cø 1 trong c¸c h»ng sè nµy cã thÓ ®îc khëi t¹o víi
mét gi¸ trÞ cô thÓ. V× vËy nÕu viÕt:
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 nghÜa biÕn kiÓu COLOR, nhng chóng cã thÓ ®îc g¸n 1 trong c¸c gi¸ trÞ liÖt kª
( trong trêng hîp nµy, RED, BLUE, GREEN, WHITE, hoÆc BLACK, hoÆc 100, 101, 500,
501, 700 ). Cã thÓ g¸n bÊt cø gi¸ trÞ mµu nµo cho biÕn COLOR. Trong thùc tÕ, b¹n cã thÓ
g¸n bÊt cø sè nguyªn nµo, thËm chÝ nÕu nã kh«ng lµ mµu theo qui ®Þnh, mÆc dï mét tr×nh
biªn dÞch tèt ph¸t ra c¶nh b¸o nÕu b¹n thùc hiÖn. Do ®ã c¸c biÕn cña kiÓu liÖt kª thêng lµ gi¸
trÞ kiÓu " unsigned int ", vµ nh÷ng h»ng sè liÖt kª ®ã t¬ng ®¬ng víi c¸c biÕn sè nguyªn. VÝ
dô :
Listing 3.7. A demonstration of enumerated constants.
1: #include <iostream.h>
2: int main()
3: {

Trang 18
Tù häc C++ trong 21 ngµy.
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!
Trªn dßng 4, h»ng sè kiÓu liÖt kª DAYS ®îc ®Þnh nghÜa, víi 7 gi¸ trÞ b¾t ®Çu tõ 0. Ngêi sö
dông ®îc nh¾c nhë ®èi víi ngµy trong dßng 9. Gi¸ trÞ ®îc chän, mét sè gi÷a 0 vµ 6, ®îc so
s¸nh trªn dßng 13 víi c¸c gi¸ trÞ liÖt kª chñ nhËt vµ thø bÈy, vµ hµnh ®éng ®i theo.
Ta kh«ng thÓ ®¸nh tõ " Sunday " khi ®îc nh¾c tíi ®èi víi 1 ngµy; ch¬ng tr×nh sÏ kh«ng biÕt
dÞch nh thÕ nµo ký tù "Sunday" ra mét gi¸ trÞ ®· liÖt kª.

III BiÓu thøc vµ c©u lÖnh


Mét ch¬ng tr×nh lµ mét tËp c¸c lÖnh xö lý nèi tiÕp nhau.

III.1 C©u lÖnh:


Trong C++ mét c©u lÖnh ®iÒu khiÓn chuçi xö lý, íc lîng mét biÓu thøc, hoÆc kh«ng
cã g× ( c©u lÖnh rçng ). TÊt c¶ c¸c c©u lÖnh kÕt thóc víi mét dÊu chÊm phÈy, thËm chÝ
c©u lÖnh "null". Mét trong c¸c c©u lÖnh th«ng dông lµ lÖnh g¸n :
X=a+b;

Trang 19
Tù häc C++ trong 21 ngµy.
Kh«ng gièng nh trong ®¹i sè, c©u lÖnh nµy kh«ng cã nghÜa lµ x b»ng a+b. Mµ ®äc lµ " G¸n
gi¸ trÞ cña phÐp céng a vµ b cho x" hoÆc " G¸n cho x, a+b ".
To¸n tö g¸n sÏ g¸n bÊt cø c¸i g× bªn ph¶i dÊu b»ng cho bÊt cø c¸i g× bªn tr¸i dÊu b»ng.
Chó ý : C©u lÖnh null lµ mét c©u lÖnh kh«ng lµm c¸i g×.

III.1.1 Kho¶ng tr¾ng


Kho¶ng tr¾ng ( tabs, spaces, vµ c¸c dßng míi) thêng ®îc bá qua trong c©u lÖnh. C©u
lÖnh g¸n ë trªn sÏ ®îc viÕt nh sau:
X=a+b;
HoÆc nh lµ :
X =a
+ b ;
Kho¶ng tr¾ng cã thÓ ®îc dïng ®Ó cho ch¬ng tr×nh dÔ ®äc,dÔ söa h¬n, hoÆc nã cã thÓ ®îc
dïng ®Ó t¹o ra m· kinh khñng vµ kh«ng thÓ ®äc ra ®îc. Trong trêng hîp nµy,nh tÊt c¶ mäi
thø, C++ cung cÊp kh¶ n¨ng.
C¸c ký tù kho¶ng tr¾ng ( tab, space, newline )kh«ng thÓ nh×n thÊy ®îc. NÕu c¸c ký tù
nµy ®îc in ra, b¹n chØ nh×n thÊy kho¶ng tr¾ng trªn giÊy.

III.1.2 C¸c lÖnh khèi vµ lÖnh phøc.


BÊt cø n¬i nµo b¹n cã thÓ ®a vµo mét c©u lÖnh ®¬n, b¹n cã thÓ ®a vµo mét c©u lÖnh
phøc, còng cã thÓ ®îc gäi lµ mét khèi. Mét khèi b¾t ®Çu víi 1 dÊu ngoÆc më ({) vµ kÕt thóc
víi 1 dÊu ngoÆc ®ãng (}). MÆc dï vËy mäi c©u lÖnh trong khèi ph¶i kÕt thóc víi mét dÊu
chÊm phÈy, khèi tù nã kh«ng kÕt thóc víi mét dÊu chÊm phÈy. VÝ dô :
{
temp = a;
a = b;
b = temp;
}
Khèi m· nµy ho¹t ®éng nh mét lÖnh vµ sù trao ®æi c¸c gi¸ trÞ trong c¸c biÕn a vµ b

III.2 BiÓu thøc


Mét biÓu thøc tr¶ vÒ mét gi¸ trÞ. Do ®ã, 3+2 ; tr¶ vÒ gi¸ trÞ 5 vµ v× vËy lµ mét biÓu
thøc. TÊt c¶ c¸c biÓu thøc lµ c¸c lÖnh.
3.2 // returns the value 3.2
PI // float const that returns the value 3.14
SecondsPerMinute // int const that returns 60

Trang 20
Tù häc C++ trong 21 ngµy.
Gi¶ sö r»ng PI lµ mét h»ng sè b»ng 3.14 vµ SecondsPerMinute lµ mét h»ng sè b»ng 60, tÊt
c¶ 3 c©u lÖnh nµy lµ c¸c biÓu thøc.
BiÓu thøc phøc t¹p
x = a + b;
kh«ng chØ céng a vµ b vµ g¸n kÕt qu¶ cho x, nhng tr¶ vÒ gi¸ trÞ cña viÖc g¸n (gi¸ trÞ cña x).
V× vËy, lÖnh nµy còng lµ mét biÓu thøc. V× lµ mét biÓu thøc, nã cã thÓ bªn ph¶i cña to¸n tö
g¸n:
y = x = a + b;
Dßng nµy ®îc x¸c ®Þnh trong lÖnh sau : Céng a víi b.
G¸n kÕt qu¶ cña biÓu thøc a+b cho x.
G¸n kÕt qu¶ cña biÓu thøc 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;
12: return 0;
13: }
Output: a: 0 b: 0 x: 0 y: 35
a: 9 b: 7 x: 16 y: 16

III.3 C¸c to¸n tö.


Lµ biÓu tîng mµ lµm cho tr×nh biªn dÞch ho¹t ®éng. C¸c to¸n tö ho¹t ®éng trªn c¸c to¸n h¹ng,
vµ trong C++ tÊt c¶ c¸c tö lµ c¸c biÓu thøc. Trong C++ cã mét vµi lo¹i to¸n tö kh¸c nhau. Hai
lo¹i to¸n tö lµ :
- C¸c to¸n tö g¸n.
- C¸c to¸n tö to¸n häc.

Trang 21
Tù häc C++ trong 21 ngµy.
III.3.1 To¸n tö g¸n.
To¸n tö g¸n (=). VÝ dô :
X=a+b;
C¸c h»ng sè ®Òu lµ r- gi¸ trÞ. Chóng kh«ng thÓ lµ 1_ gi¸ trÞ. V× vËy, cã thÓ viÕt.
X = 35 ; // OK
Nhng kh«ng thÓ viÕt:
35 = x ; // error, not an 1 value !

III.3.2 To¸n tö to¸n häc.


Cã 5 to¸n tö to¸n häc: céng (+), trõ (-), nh©n (*), 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;
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 thùc hiÖn phÐp trõ. NÕu lÊy sè nhá h¬n trõ ®i mét sè lín h¬n, sÏ cã kÕt qu¶ lµ sè
©m. NÕu lµ sè kh«ng dÊu th× sÏ x¶y ra trµn nh vÝ dô trªn.

III.3.3 PhÐp chia sè nguyªn vµ phÐp chia lÊy sè d.


PhÐp chia sè nguyªn cã kh¸c mét chót so víi phÐp chia th«ng thêng. Khi chia 21 cho 4, kÕt
qu¶ lµ mét sè thùc (mét sè thËp ph©n). C¸c sè nguyªn kh«ng cã phÇn thËp ph©n, vµ v× vËy
"remainder" (sè d) ®îc c¾t ®i. Tr¶ lêi lµ 5. §Ó lÊy ®îc sè d, ®a 21 modulus 4 (21%4) vµ kÕt
qu¶ lµ 1.

Trang 22
Tù häc C++ trong 21 ngµy.
- PhÐp chia divison (/) lµ phÐp chi lÊy phÇn nguyªn.
- PhÐp chia modulus (%) lµ phÐp chia lÊy phÇn d.
Chó ý : NhiÒu ngêi lËp tr×nh C++ cha cã kinh nghiÖm t×nh cê ®a mét dÊu chÊm phÈy sau
c¸c lÖnh if.
If ( SomeValue <10) ;
SomeValue = 10 ;
Ta ph¶i viÕt l¹i theo c¸ch sau:
if (SomeValue < 10) // test
; // do nothing
SomeValue = 10; // assign

III.3.4 To¸n tö g¸n vµ to¸n tö to¸n häc phøc.


HiÕm khi muèn céng mét gi¸ trÞ víi mét biÕn sè vµ sau ®ã ®Ó g¸n kÕt qu¶ trë l¹i biÕn. NÕu
cã mét biÕn myAge vµ b¹n muèn t¨ng gi¸ trÞ thªm hai, cã thÓ viÕt:
int myAge = 5;
int temp;
temp = myAge + 2; // add 5 + 2 and put it in temp
myAge = temp; // put it back in myAge
Ph¬ng ph¸p nµy, mÆc dï, rÊt khã chÞu vµ g©y l·ng phÝ. Trong C++, cã thÓ ®a vµo biÕn t-
¬ng tù trªn c¶ hai chiÒu cña to¸n tö g¸n, vµ v× vËy phÇn tríc trë nªn tèt h¬n nhiÒu :s
MyAge = myAge + 2 ;
Trong ®¹i sè biÓu thøc thøc nµy lµ v« nghÜa, nhng trong C++ ®îc ®äc lµ "céng 2 vµo gi¸ trÞ
cña myAge vµ g¸n kÕt qu¶ vµo myAge ".
Mét c¸ch viÕt ®¬n gi¶n h¬n lµ :
MyAge += 2 ;
To¸n tö (+=) céng r-gi¸ trÞ vµo 1-gi¸ trÞ vµ sau ®ã g¸n trë l¹i kÕt qu¶ vµo trong 1-gi¸ trÞ. To¸n
tö lµ "céng-b»ng". C©u lÖnh ®äc lµ "myAge céng-b»ng 2". NÕu myAge cã gi¸ trÞ 4 ®Ó b¾t
®Çu, sau c©u lÖnh sÏ lµ 6.
Cã c¸c to¸n tö "tù -g¸n" trõ (-=), chia (/=), nh©n (*=), vµ modulus (%=).

III.3.5 C¸c phÐp t¨ng vµ gi¶m


Th«ng thêng gi¸ trÞ ®Ó céng (hoÆc trõ) vµ sau ®ã g¸n l¹i vµo biÕn lµ 1.Trong C++, viÖc
t¨ng gi¸ trÞ lµ 1 ®îc gäi lµ lîng t¨ng, vµ gi¶m 1 ®îc gäi lîng gi¶m. Cã c¸c to¸n tö ®Æc biÖt
thùc hiÖn nh÷ng t¸c ®éng nµy.
To¸n tö t¨ng (++) t¨ng gi¸ trÞ cña biÕn lªn 1, vµ to¸n tö gi¶m (--) gi¶m ®i 1. V× vËy,nÕu cã 1
biÕn, c, vµ muèn t¨ng nã, ta sÏ sö dông lÖnh nµy:

Trang 23
Tù häc C++ trong 21 ngµy.
c++ ;
LÖnh nµy t¬ng ®¬ng víi lÖnh sau:
c = c +1 ;
C©u lÖnh nµy c÷ng t¬ng ®¬ng:
c += 1 ;

III.3.6 TiÒn tè vµ hËu tè.


C¶ hai to¸n tö (++) vµ to¸n tö (--) ®i ®Õn 2 lo¹i: tiÒn tè vµ hËu tè.
- TiÒn tè ®îc viÕt tríc tªn biÕn (++myAge)
- HËu tè ®îc viÕt sau tªn biÕn (myAge++).
VÒ ng÷ nghÜa häc th×: t¨ng gi¸ trÞ lªn tríc khi thùc hiÖn lÖnh. Cßn víi hËu tè th× : thùc hiÖn
lÖnh sau ®ã míi t¨ng gi¸ trÞ.
VÝ dô: nÕu x lµ sè nguyªn cã gi¸ trÞ lµ 5, nÕu viÕt:
int a = ++x ;
Cã nghÜa lµ t¨ng x (lµm nã thµnh 6) vµ sau ®ã lÊy gi¸ trÞ ®ã g¸n cho a. V× vËy a = 6 vµ x =
6.
NÕu sau ®ã ta tiÕp tôc viÕt:
int b = x++ ;
Cã nghÜa lµ lÊy gi¸ trÞ cña x (6) vµ g¸n cho b, sau ®ã t¨ng gi¸ trÞ cña x. V× vËy, b©y 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";

Trang 24
Tù häc C++ trong 21 ngµy.
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
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 QuyÒn u tiªn.


Trong c©u lÖnh phøc t¹p : x = 5 + 3 * 8;
Th× phÐp nh©n sÏ ®îc thùc hiÖn tríc phÐp céng.
Mçi to¸n tö ®Òu cã 1 gi¸ trÞ u tiªn. Khi 2 to¸n tö to¸n häc cã cïng quyÒn u tiªn, chòng sÏ thùc
hiÖn theo trËt tù " tõ tr¸i - qua - ph¶i". V× vËy
X=5+3+8*9+6*4;
PhÐp nh©n sÏ thùc hiÖn tõ tr¸i qua ph¶i. V× vËy, 8 * 9 = 72, vµ 6*4 =24. B©y giê c©u lÖnh
sÏ lµ:
X = 5 + 3 + 72 + 24;
B©y giê phÐp céng thùc hiÖn tõ tr¸i qua ph¶i: 5 + 3 =8 ; 8+72 =80 ; 80+24 = 104.
H·y cÈn thËn víi ®iÒu nµy. Mét sè to¸n tö, nh lµ to¸n tö g¸n thùc hiÖn theo trËt tù tõ " ph¶i -
qua - tr¸i ". VÝ dô :
TotalSeconds = NumMinutesToThink + NumMinutesToType * 60

Trang 25
Tù häc C++ trong 21 ngµy.
Trong biÓu thøc nµy, ta muèn nh©n NumMinutesToType víi 60 vµ sau ®ã céng nã víi
NumMinutesToThink. Ta muèn céng hai biÕn ta ®îc tæng sè phót, vµ sau ®ã nh©n nã víi 60
®Ó ®îc tæng sè gi©y.
Trong trêng hîp nµy, ta ph¶i sö dông c¸c dÊu ngoÆc ®Ó thay ®æi trËt tù u tiªn. C¸c sè h¹ng
trong dÊu ngoÆc ®îc x¸c ®Þnh ë trËt tù u tiªn cao h¬n nh÷ng to¸n tö to¸n häc. V× vËy ta ph¶i
viÕt :
TotalSeconds = ( NumMinutesToThink + NumMinutesToType ) * 60

III.3.8 To¸n tö quan hÖ


Dïng ®Ó x¸c ®Þnh hoÆc 2 sè b»ng nhau, hoÆc 1 sè lín h¬n hoÆc nhá h¬n 1 sè kh¸c. C©u
lÖnh quan hÖ x¸c ®Þnh hoÆc 1 (TRUE) hoÆc 0 (FALSE).
- To¸n tö b»ng "equals" :
MyAge == yourAge ; // gi¸ trÞ myAge t¬ng tù cña yourAge ?
BiÓu thøc x¸c ®Þnh 0, hoÆc FALSE khi 2 biÕn kh«ng b»ng nhau.
- To¸n tö lín h¬n.
MyAge > yourAge ; // gi¸ trÞ myAge lín h¬n yourAge ?
Trong C++ cã 6 to¸n tö quan hÖ :
B»ng : ==
Nhá h¬n: <
Lín h¬n: >
Nhá h¬n hoÆc b»ng: <=
Lín h¬n hoÆc b»ng : >=
Kh¸c 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

Trang 26
Tù häc C++ trong 21 ngµy.
or Equals 50 <= 50; true

III.4 C©u lÖnh IF.


C©u lÖnh if cho phÐp b¹n kiÓm tra mét ®iÒu kiÖn, vµ rÏ nh¸nh tíi phÇn kh¸c cña ®o¹n m·,
phô thuéc vµo kÕt qu¶.
C©u lÖnh if ®¬n gi¶n nhÊt lµ:
If (biÓu thøc )
Statement ;
BiÓu thøc trong dÊu ngoÆc cã thÓ lµ bÊt cø biÓu thøc nµo, nhng nã thêng chøa mét biÓu
thøc quan hÖ. NÕu biÓu thøc cã gi¸ trÞ 0, nã coi lµ sai, vµ lÖnh ®îc bá qua. NÕu nã cã gi¸ trÞ
kh«ng ph¶i lµ 0, nã coi lµ ®óng, vµ lÖnh ®îc xö lý. Chó ý vÝ dô sau:
if (bigNumber > smallNumber)
bigNumber = smallNumber;
NÕu lÖnh trong c©u lÖnh if gåm nhiÒu lÖnh th× d¹ng lÖnh 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: {

Trang 27
Tù häc C++ trong 21 ngµy.
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:
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";

Trang 28
Tù häc C++ trong 21 ngµy.
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.
 C¸c c¸ch ®Æt dÊu ngoÆc.
- §Æt dÊu ngoÆc ngay sau ®iÒu kiÖn vµ c¨n th¼ng hµng víi lÖnh if ë hµng díi ®Ó
®ãng khèi lÖnh.
If (biÓu thøc) {
C©u lÖnh ;
}
- §Æt dÊu ngoÆc bªn díi lÖnh if.
if (biÓu thøc)
{
c©u lÖnh ;
}
- §Æt dÊu ngoÆc thôt vµo cïng víi c©u lÖnh.
if (biÓu thøc)
{
c©u lÖnh ;
}
 Else
Thêng ch¬ng tr×nh cña b¹n sÏ muèn rÏ nh¸nh nÕu ®iÒu kiÖn ®óng, vµ nÕu ®iÒu kiÖn sai.
NÕu chØ sö dông lÖnh if kh«ng th× ch¬ng tr×nh sÏ dµi vµ ta sö dông tõ kho¸ "else" nh sau:
If (biÓu thøc)
C©u lÖnh ;
Else
C©u lÖnh ;
Listing 4.5. Demonstrating the else keyword.
1: // Listing 4.5 - demonstrates if statement
2: // with else clause

Trang 29
Tù häc C++ trong 21 ngµy.
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";
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!
 C¸c kiÓu có ph¸p lÖnh if.
- D¹ng 1:
If (biÓu thøc)
C©u lÖnh ;
Next statement ;
NÕu biÓu thøc x¸c ®Þnh lµ ®óng, "c©u lÖnh " ®îc xö lý vµ ch¬ng tr×nh tiÕp tôc víi
"next statement". NÕu biÓu thøc sai, c©u lÖnh ®îc bá qua vµ ch¬ng tr×nh nh¶y tíi "next
statement". Nhí r»ng c©u lÖnh cã thÓ lµ mét c©u lÖnh ®¬n kÕt thóc víi 1 dÊu chÊm
phÈy hoÆc 1 dÊu ngoÆc ®ãng khèi.
- D¹ng 2.
if (expression)
statement1;
else
statement2;
next statement;

Trang 30
Tù häc C++ trong 21 ngµy.
NÕu biÓu thøc ®óng th× "statement1" ®îc xö lý; nÕu sai "statement2" ®îc xö lý, sau
®Êy, ch¬ng tr×nh tiÕp tôc víi "next statement". VÝ dô:
if (SomeValue < 10)
cout << "SomeValue is less than 10");
else
cout << "SomeValue is not less than 10!");
cout << "Done." << endl;
 C¸c lÖnh if phøc t¹p.
if (expression1)
{
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

Trang 31
Tù häc C++ trong 21 ngµy.
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)
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 To¸n tö l«gÝc.


Table 4.2. The Logical Operators.

Trang 32
Tù häc C++ trong 21 ngµy.
Operator Symbol Example
AND && expression1 && expression2
OR || expression1 || expression2
NOT ! !expression

III.5.1 PhÐp l«gÝc AND


PhÐp AND ®óng (=1) khi c¶ hai biÓu thøc ®Òu ®óng. Sai khi 1 trong 2 biÓu thøc sai.
If ( ( x == 5 ) && (y == 5) )
PhÐp AND cã biÓu tîng lµ &&.

III.5.2 PhÐp l«gÝc OR


§óng khi 1 trong 2 hoÆc c¶ 2 biÓu thøc ®óng. Sai khi c¶ 2 biÓu thøc ®Òu sai.
if ( (x == 5) || (y == 5) )
PhÐp OR cã biÓu tîng lµ .

III.5.3 PhÐp l«gÝc NOT.


Lµ phÐp phñ ®Þnh.
if ( !(x == 5) )
kÕt qu¶ cña if lµ ®óng nÕu x kh¸c 5. PhÐp nµy cã thÓ viÕt c¸ch kh¸c nh sau :
if ( x != 5 )

III.5.4 QuyÒn u tiªn trong to¸n tö l«gÝc.


VÝ dô:
if ( x > 5 && y > 5 || z > 5)
NÕu viÕt c¸ch nµy sÏ lµm cho c©u lÖnh kh«ng râ nghÜa. Do ®ã ta cã thÓ sö dông c¸c dÊu
ngoÆc.
if ( (x > 5) && (y > 5 || z > 5) )
Chó ý trong khi viÕt ch¬ng tr×nh cÇn tr×nh bµy sao cho dÔ ®äc vµ dÔ hiÓu.

III.5.5 Mét sè c¸ch viÕt t¾t.


VÝ dô 1:
if (x) // if x is true (nonzero)
x = 0;
C©u lÖnh cã nghÜa : nÕu x cã gi¸ trÞ kh¸c 0, ®Æt nã lµ 0. Ta cã thÓ viÕt c¸ch kh¸c râ rµng
h¬n:
if (x != 0) // if x is nonzero
x = 0;
VÝ dô 2:
Hai c©u lÖnh sau lµ t¬ng ®¬ng :

Trang 33
Tù häc C++ trong 21 ngµy.
if (!x) // if x is false (zero)
if (x == 0) // if x is zero

III.6 To¸n tö phô thuéc.


To¸n tö phô thuéc ( ?: ) lµ c¸c to¸n tö bËc ba chØ cã ë C++ ; §ã lµ to¸n tö víi 3 sè h¹ng.
- To¸n tö phô thuéc thùc hiÖn víi 3 biÓu thøc vµ tr¶ vÒ mét gi¸ trÞ :
( biÓu thøc 1) ? ( biÓu thøc 2) : (biÓu thøc 3)
C©u lÖnh cã nghÜa : NÕu biÓu thøc-1 lµ ®óng, tr¶ vÒ gi¸ trÞ ë biÓu thøc-2 ; nÕu sai tr¶
vÒ gi¸ trÞ ë biÓu thøc-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;

Trang 34
Tù häc C++ trong 21 ngµy.
25: cout << "\n";
26: return 0;
27: }
Output: Enter two numbers.
First: 5

Second: 8

z: 8
z: 8

IV C¸c hµm.
Hµm lµ g× ?
Hµm lµ mét ch¬ng tr×nh con mµ cã thÓ lµm viÖc trªn d÷ liÖu vµ tr¶ vÒ mét gi¸ trÞ. Trong
ch¬ng tr×nh C++ cã tèi thiÓu mét hµm, main(). Khi ch¬ng tr×nh b¾t ®Çu, main() ®îc tù
®éng gäi. main() cã thÓ gäi c¸c hµm kh¸c.
Mçi hµm cã tªn cña nã vµ khi tªn ®îc gÆp, viÖc xö lý ch¬ng tr×nh rÏ nh¸nh vµo trong
th©n hµm. Khi hµm tr¶ vÒ, viÖc xö lý trë l¹i trªn dßng tiÕp theo cña hµm gäi.
C¸c hµm cã hai c¸ch t¹o ra:
- Do ngêi sö dông ®Þnh nghÜa.
- Cã s½n trong tr×nh biªn dÞch.

IV.1 Khai b¸o vµ ®Þnh nghÜa hµm.


Sö dông c¸c hµm trong ch¬ng tr×nh,®Çu tiªn ph¶i khai b¸o hµm vµ sau ®ã ®Þnh nghÜa hµm
®ã. Khai b¸o lµ chØ ra tªn, kiÓu tr¶ vÒ, c¸c tham sè cña hµm. §Þnh nghÜa lµ b¶o tr×nh biªn
dÞch biÕt hµm lµm viÖc nh thÕ nµo. Kh«ng cã hµm nµo ®îc gäi tõ hµm kh¸c mµ kh«ng khai
b¸o. Khai b¸o lµ thñ tôc ®Çu tiªn.
 Khai b¸o hµm.
Cã 3 c¸ch khai b¸o mét hµm:
- ViÕt nguyªn mÉu vµo trong mét file, sau ®ã sö dông mét chØ dÉn #include ®Ó gép nã
vµo trong ch¬ng tr×nh cña b¹n.
- ViÕt nguyªn mÉu vµo trong file mµ hµm cña b¹n ®îc sö dông.
- §Þnh nghÜa hµm tríc khi nã ®îc gäi bëi bÊt k× hµm. Khi lµm ®iÒu nµy, viÖc ®Þnh
nghÜa ho¹t ®éng nh chÝnh sù khai b¸o cña nã.
C¸ch thø nhÊt, lµ ý tëng tåi vµ khã cho viÖc söa vµ thay ®æi.

Trang 35
Tù häc C++ trong 21 ngµy.
C¸ch thø hai, gi¶ sö r»ng hµm A() cÇn ®Ó cã thÓ gäi hµm B(), nhng hµm B() còng cÇn ®Ó
cã thÓ gäi hµm A() trong mét sè trêng hîp.
Cã thÓ ®Þnh nghÜa hµm A() tríc khi ®Þnh nghÜa hµm B() vµ còng ®Ó hµm B() tríc khi
®Þnh nghÜa hµm A(), v× vËy tèi thiÓu 1 trong sè chóng ph¶i ®îc khai b¸o trong bÊt cø trêng
hîp nµo.
C¸ch thø ba, c¸c nguyªn mÉu lµ mét kü thuËt gì rèi ®Çy søc m¹nh vµ tèt. NÕu nguyªn mÉu
cña b¹n khai b¸o r»ng hµm gåm mét tËp c¸c tham sè riªng biÖt, hoÆc r»ng nã tr¶ vÒ mét kiÓu
gi¸ trÞ cô thÓ, vµ sau ®ã hµm kh«ng s¾p xÕp nguyªn mÉu, tr×nh biªn dÞch cã thÓ ra hiÖu
b»ng cê lçi cña b¹n thay v× ®îi nã hiÖn lªn khi ch¹y ch¬ng tr×nh .

IV.1.1 C¸c nguyªn mÉu hµm.


NhiÒu hµm cã s½n, b¹n cã thÓ sö dông chóng trong ch¬ng tr×nh cña b¹n b»ng c¸ch sö
dông # include . §èi víi c¸c hµm cña chÝnh b¹n viÕt, b¹n ph¶i gép nguyªn mÉu.
Nguyªn mÉu hµm lµ mét c©u lÖnh , nghÜa lµ nã kÕt thóc víi dÊu chÊm phÈy (;). Nã kiÓu
tr¶ vÒ cña hµm, tªn, vµ danh s¸ch tham sè.
Danh s¸ch tham sè lµ mét danh s¸ch cña tÊt c¶ c¸c tham sè vµ kiÓu cña chóng, ph©n c¸ch bëi
dÊu phÈy (commas).
Nguyªn mÉu hµm vµ sù ®Þnh nghÜa hµm ph¶i gièng nhau chÝnh x¸c vÒ kiÓu tr¶ vÒ, tªn,
danh s¸ch tham sè. NÕu chóng kh«ng gièng nhau , b¹n sÏ nhËn ®îc mét lçi "compile-time".
Chó ý: nguyªn mÉu hµm kh«ng cÇn gåm tªn cña tham sè, mµ chØ lµ kiÓu cña chóng. Mét
nguyªn mÉu tr«ng gièng nh :
Long Area (int , int ) ;
Nguyªn mÉu nµy khai b¸o mét hµm tªn lµ Area() tr¶ vÒ mét long vµ cã hai tham sè, c¶ hai lµ
sè nguyªn. MÆc dï ®©y lµ theo qui ®Þnh, nã kh«ng ph¶i lµ ý tëng tèt. Tªn tham sè thªm vµo
lµm cho nguyªn mÉu râ rµng h¬n. Hµm t¬ng tù víi c¸c tham sè ®îc dÆt tªn cã thÓ lµ :
Long Area (int length, int width) ;
Chó ý r»ng: tÊt c¶ c¸c hµm cã mét kiÓu tr¶ vÒ. NÕu kh«ng ®Þnh râ, kiÓu tr¶ vÒ mÆc ®Þnh
lµ int . Ch¬ng tr×nh cña b¹n sÏ hiÓu dÔ dµng h¬n, mÆc dï, nÕu khai b¸o râ rµng kiÓu tr¶ vÒ
cña mäi hµm, 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>

Trang 36
Tù häc C++ trong 21 ngµy.
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: }
Output: How wide is your yard? 100

How long is your yard? 200

Your yard is 20000 square feet

IV.1.2 §Þnh nghÜa hµm .


§Þnh nghÜa hµm bao gåm ®Çu hµm vµ th©n hµm. §Çu hµm chÝnh x¸c gièng nh nguyªn
mÉu hµm, ngo¹i trõ c¸c tham sè ph¶i ®îc ®Æt tªn, vµ kh«ng cã dÊu chÊm phÈy kÕt thóc.
Th©n hµm lµ mét tËp c¸c lÖnh bªn trong c¸c dÊu ngoÆc.

Trang 37
Tù häc C++ trong 21 ngµy.
 Hµm:
Có ph¸p nguyªn mÉu hµm:
Return_type function_name ( [type [parameterName] ] .....) ;
Có ph¸p ®Þnh nghÜa hµm:
Return_type function_name ( [type [parameterName] ] .....) ;
{
c©u lÖnh ;
}
Nguyªn mÉu hµm chØ ra : kiÓu tr¶ vÒ, tªn, danh s¸ch tham sè. Hµm kh«ng cÇn cã c¸c tham
sè, vµ nguyªn mÉu kh«ng cÇn danh s¸ch c¸c tªn cña chóng, chØ cã c¸c kiÓu cña chóng. Mét
nguyªn mÉu lu«n kÕt thóc víi dÊu chÊm phÈy (;).
§Þnh nghÜa hµm ph¶i phï hîp kiÓu tr¶ vÒ vµ danh s¸ch tham sè víi nguyªn mÉu cña nã. Nã
ph¶i cung cÊp tªn cho c¸c tham sè, vµ th©n ®Þnh nghÜa hµm ph¶i ®îc bao quanh b»ng c¸c
dÊu ngoÆc. TÊt c¶ c¸c lÖnh bªn trong th©n hµm ph¶i ®îc kÕt thóc víi dÊu chÊm phÈy (;),
nhng hµm tù nã kh«ng kÕt thóc víi mét dÊu chÊm phÈy mµ nã kÕt thóc víi mét dÊu ®ãng
ngoÆc. NÕu hµm tr¶ vÒ mét gi¸ trÞ, nã kÕt thóc víi mét c©u lÖnh return, mÆc dï c¸c lÖnh
return cã thÓ xuÊt hiÖn hîp ph¸p ë bÊt cø n¬i nµo trong th©n hµm. Mäi hµm cã 1 kiÓu tr¶
vÒ. NÕu kh«ng râ rµng, kiÓu tr¶ vÒ sÏ lµ int. NÕu mét hµm kh«ng tr¶ vÒ mét gi¸ trÞ, kiÓu
tr¶ vÒ cña nã sÏ lµ void.

Function Prototype Examples

long FindArea(long length, long width); // returns long, has two parameters
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)

Trang 38
Tù häc C++ trong 21 ngµy.
cout << "Hello.\n";
if (whichMsg == 1)
cout << "Goodbye.\n";
if (whichMsg > 1)
cout << "I'm confused.\n";
}

IV.1.3 Xö lý hµm.
Khi b¹n gäi mét hµm, viÖc xö lý b¾t ®Çu víi c©u lÖnh ®Çu tiªn sau dÊu ngoÆc më ({).
Nh¸nh cã thÓ ®îc xö lý b»ng c¸ch sö dông lÖnh if. C¸c hµm còng cã thÓ gäi c¸c hµm kh¸c
thËm chÝ gäi chÝnh chóng.

IV.2 BiÕn khu vùc.


BiÕn khu vùc chØ tån t¹i trong khu vùc bªn trong hµm cña nã. Khi hµm tr¶ vÒ, c¸c biÕn
khu vùc lµ biÕn kh«ng cã hiÖu lùc n÷a.
BiÕn khu vùc ®îc ®Þnh nghÜa nh bÊt cø biÕn kh¸c. C¸c tham sè ®Æt bªn trong hµm
còng coi lµ biÕn khu vùc vµ cã thÓ ®îc sö dông chÝnh x¸c bëi v× nÕu chóng ®· ®îc ®Þnh
nghÜa bªn trong th©n hµm.
Listing 5.2. The use of local variables and parameters.
1: #include <iostream.h>
2:
3: float Convert(float);
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:

Trang 39
Tù häc C++ trong 21 ngµy.
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ô kh¸c:
1: #include <iostream.h>
2:
3: float Convert(float);
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: }
15:
16: float Convert(float Fer)
17: {
18: float Cel;
19: Cel = ((Fer - 32) * 5) / 9;
20: return Cel;

Trang 40
Tù häc C++ trong 21 ngµy.
21: }
HiÖn nay, c¸c biÕn ®îc khai b¸o bªn trong ®Çu cña mét vßng for (for int i = 0; i<SomeValue ;
i++ )

IV.3 BiÕn toµn côc.


C¸c biÕn ®îc ®Þnh nghÜa bªn ngoµi cña bÊt cø hµm cã ph¹m vi lín vµ v× vËy cã s½n ë
bÊt cø hµm trong ch¬ng tr×nh, kÓ c¶ main() .
BiÕn khu vùc víi tªn t¬ng tù nh c¸c biÕn toµn côc kh«ng lµm thay ®æi biÕn toµn côc.
NÕu mét hµm cã 1 biÕn víi tªn gièng biÕn toµn côc, tªn ®îc xem lµ biÕn khu vùc--kh«ng lµ
biÕn toµn côc-- khi ®îc dïng trong hµm.
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";
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: }

Trang 41
Tù häc C++ trong 21 ngµy.

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ô biÕn khu vùc.
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:
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:

Trang 42
Tù häc C++ trong 21 ngµy.
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

Back in main, x is: 5


Ch¬ng tr×nh b¾t ®Çu víi sù khëi t¹o 1 biÕn khu vùc, x, trªn dßng 10, trong main(). In ra
trªn dßng 11 x¸c ®Þnh r»ng x ®· ®îc khëi t¹o víi gi¸ trÞ 5. MyFunc() ®îc gäi, vµ 1 biÕn khu
vùc, còng ®îc ®Æt tªn x, ®îc khëi t¹o víi gi¸ trÞ 8 trªn dßng 22. Gi¸ trÞ ®îc in ra trªn dßng 23.
Mét khèi ®îc b¾t ®Çu trªn dßng 25, vµ biÕn x tõ hµm ®îc in l¹i trªn dßng 26. Mét biÕn
míi còng ®îc ®Æt tªn x, nhng khu vùc ®Ó khèi ®îc t¹o ra trªn dßng 28 vµ ®îc khëi t¹o víi gi¸
trÞ 9.
Gi¸ trÞ cña biÕn x míi nhÊt ®îc in ra trªn dßng 30. Khèi kÕt thóc trªn dßng 31, vµ biÕn
®îc t¹o ra trªn dßng 28 -"out of scope".
Khi x ®îc in ra trªn dßng 33, x ®· ®îc ®Þnh nghÜa trªn dßng 28; gi¸ trÞ cña nã vÉn lµ 8.

Trang 43
Tù häc C++ trong 21 ngµy.
IV.3.1 C©u lÖnh hµm.
Hçu nh kh«ng cã giíi h¹n vÒ sè kiÓu c©u lÖnh mµ cã thÓ ë bªn trong th©n hµm. MÆc dï vËy
b¹n kh«ng thÓ ®Þnh nghÜa mét hµm kh¸c tõ bªn trong mét hµm, b¹n cã thÓ gäi 1 hµm. C¸c
hµm cã thÓ thËm chÝ gäi chÝnh chóng.
MÆc dï kh«ng cã giíi h¹n vÒ kÝch thíc cña 1 hµm trong C++, nhng xu híng x©y dùng
hµm cã kÝch thíc nhá. NhiÒu nhµ lËp tr×nh khuyªn lµm cho hµm võa ®ñ trªn mét mµn h×nh
®¬n v× vËy b¹n cã thÓ nh×n toµn bé hµm cïng mét lóc. §©y lµ mét qui luËt lËt trang, thêng
ng¾t qu·ng bëi c¸c nhµ lËp tr×nh giái, nhng mét hµm cµng nhá th× cµng dÔ hiÓu vµ söa
ch÷a.
Mçi hµm nªn thùc hiÖn mét c«ng viÖc ®¬n lÎ vµ dÔ hiÓu.

IV.3.2 §èi sè cña hµm.


C¸c ®èi sè hµm cã lµ lµ 1 ®èi sè hµm, bao gåm c¸c h»ng sè, biÓu thøc l«gÝc vµ to¸n häc,
vµ c¸c hµm kh¸c mµ tr¶ vÒ gi¸ trÞ .
BÊt cø biÓu thøc C++ cã thÓ lµ 1 ®èi sè hµm, bao gåm c¸c h»ng sè, biÓu thøc l«gÝc vµ
to¸n häc, vµ c¸c hµm kh¸c mµ tr¶ vÒ gi¸ trÞ .

IV.3.3 Sö dông c¸c hµm nh lµ c¸c tham sè ®Ó thùc hiÖn c¸c chøc n¨ng.
MÆc dï ®ã lµ qui luËt ®èi víi mét hµm ®Ó thùc hiÖn nh 1 tham sè cña hµm thø hai mµ tr¶
vÒ 1 gi¸ trÞ,nã cã thÓ lµm cho m· ch¬ng tr×nh khã ®äc vµ r¾c rèi.
VÝ dô, cã c¸c hµm : double(), triple(), square(), vµ cube(); mçi hµm tr¶ vÒ 1 gi¸ trÞ. Cã thÓ
viÕt.
Answer = (double(triple(square(cube(myValue)))));
C©u lÖnh nµy dïng 1 biÕn, myValue, vµ coi nã nh 1 ®èi sè ®èi víi hµm cube(), gi¸ trÞ tr¶ vÒ
®îc coi lµ ®èi sè cña hµm square(), gi¸ trÞ tr¶ vÒ cña nã coi lµ ®èi sè cña hµm triple(), vµ gi¸
trÞ tr¶ vÒ ®a tíi hµm double(). Gi¸ trÞ ®· tr¶ vÒ cña hµm double(), triple(), square(), cube()
®îc ®a tíi Answer.
Khã cã thÓ ch¾c ch¾n ®o¹n m· nµo thùc hiÖn (lµ gi¸ trÞ tríc triple hay sau lµ square ?).
Mét thay ®æi kÕ tiÕp lµ ®Ó g¸n mçi bíc tíi biÕn trung gian cña 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

Trang 44
Tù häc C++ trong 21 ngµy.
IV.3.4 Tham sè lµ c¸c biÕn khu vùc.
§èi sè ®a vµo trong hµm lµ khu vùc cho hµm. Sù thay ®æi lµm cho c¸c ®èi sè kh«ng ¶nh h-
ëng tíi gi¸ trÞ trong gäi hµm. §iÒu nµy ®îc biÕt nh truyÒn gi¸ trÞ, nghÜa lµ mét b¶n sao khu
vùc cña mçi ®èi sè lµm trong hµm. Nh÷ng b¶n sao khu vùc nµy ®îc coi nh lµ bÊt cø biÕn khu
vùc kh¸c.
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()
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:

Trang 45
Tù häc C++ trong 21 ngµy.
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Ò.


C¸c hµm tr¶ vÒ gi¸ trÞ hoÆc tr¶ vÒ d¹ng void. Void lµ 1 tÝn hiÖu b¸o cho tr×nh biªn dÞch sÏ
kh«ng cã gi¸ trÞ tr¶ vÒ.
§Ó tr¶ vÒ mét gi¸ trÞ tõ 1 hµm, viÕt tõ kho¸ return theo sau lµ gi¸ trÞ muèn tr¶ vÒ. Gi¸ trÞ cã
thÓ tù nã lµ 1 biÓu thøc mµ tr¶ vÒ mét gi¸ trÞ. VÝ dô:
return 5;
return (x > 5);
return (MyFunction());
§©y lµ tÊt c¶ nh÷ng lÖnh return theo qui ®Þnh, gi¶ sö r»ng hµm MyFunction() tù nã tr¶ vÒ
mét gi¸ trÞ. GÝ trÞ trong c©u lÖnh thø hai, return (x>5), sÏ lµ zero nÕu x kh«ng lín h¬n 5,
hoÆc nã sÏ lµ 1. C¸i ®îc tr¶ vÒ lµ gi¸ trÞ cña biÓu thøc ,0 (false) hay 1(true), kh«ng ph¶i gi¸
trÞ cña x.
Khi tõ kho¸ return ®îc b¾t gÆp, biÓu thøc sau return ®îc tr¶ vÒ nh gi¸ trÞ cña hµm. Sù thùc
hiÖn ch¬ng tr×nh tr¶ vÒ ngay lËp tøc khi gäi hµm, vµ bÊt cø c©u lÖnh sau return kh«ng ®îc
sö lý.
§ã lµ ®óng qui ®Þnh ®Ó cã h¬n mét c©u lÖnh return trong 1 hµm ®¬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;

Trang 46
Tù häc C++ trong 21 ngµy.
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";
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

Trang 47
Tù häc C++ trong 21 ngµy.
IV.3.6 Tham sè mÆc ®Þnh.
§èi víi mäi tham sè khai b¸o vµ ®Þnh nghÜa trong nguyªn mÉu hµm, hµm ®ang gäi ph¶i ®a
vµo mét gi¸ trÞ. Gi¸ trÞ ®îc ®a vµo ph¶i lµ kiÓu ®· ®îc khai b¸o. V× vËy, nÕu cã 1 hµm ®·
khai b¸o nh sau.
Long myFunction (int);
Hµm ph¶i nhËn mét biÕn sè nguyªn. NÕu ®Þnh nghÜa hµm kh«ng gièng hoÆc nÕu kh«ng
®a vµo mét sè nguyªn th× sÏ nhËn ®îc mét lçi biªn dÞch.
Mét sù ngo¹i trõ ®èi víi qui luËt nµy lµ nÕu nguyªn mÉu hµm khai b¸o 1 gi¸ trÞ mÆc ®Þnh
®èi víi tham sè. Gi¸ trÞ mÆc ®Þnh lµ 1 gi¸ trÞ ®Ó sö dông nÕu dïng d¹ng "none". Khai b¸o
tríc cã thÓ ®îc viÕt nh sau:
Long myFunction (int x = 50) ;
Nguyªn mÉu nãi r»ng, "myFunction ()" tr¶ vÒ mét gi¸ trÞ long vµ nhËn 1 tham sè sè nguyªn.
NÕu mét ®èi sè kh«ng ®îc ®a vµo, sö dông gi¸ trÞ mÆc ®Þnh 50. Bëi v× tªn tham sè kh«ng
cÇn trong nguyªn mÉu hµm, nguyªn mÉu nµy cã thÓ ®îc viÕt nh sau:
Long myFunction (int = 50);
§Þnh nghÜa hµm kh«ng thay ®æi bëi khai b¸o 1 tham sè mÆc ®Þnh. §Çu ®Ò ®Þnh nghÜa
hµm ®èi víi hµm nµy sÏ lµ :
long myFunction (int x)
NÕu hµm gäi kh«ng cã 1 tham sè, tr×nh biªn dÞch sÏ ®iÒn x víi gi¸ trÞ mÆc ®Þnh 50. Tªn cña
tham sè mÆc ®Þnh trong nguyªn mÉu kh«ng gièng nh tªn trong ®Çu ®Ò hµm; gi¸ trÞ mÆc
®Þnh ®îc g¸n ë cïng vÞ trÝ, kh«ng cã tªn.
BÊt cø hoÆc tÊt c¶ c¸c tham sè cña hµm cã thÓ ®îc g¸n gi¸ trÞ mÆc ®Þnh. Mét sù r¾c rèi
lµ : NÕu bÊt cø tham sè nµo kh«ng cã gi¸ trÞ mÆc ®Þnh, kh«ng tham sè cã tríc nµo cã thÓ cã
1 gi¸ trÞ mÆc ®Þnh.
NÕu nguyªn mÉu hµm tr«ng gièng nh:
long myFunction (int Param1, int Param2, int Param3);
Cã thÓ g¸n 1 gi¸ trÞ mÆc ®Þnh chØ cho Param2, nÕu g¸n 1 gi¸ trÞ mÆc ®Þnh cho Param3.
Cã thÓ g¸n 1 gi¸ trÞ mÆc ®Þnh chØ cho Param1 nÕu g¸n c¸c gi¸ trÞ mÆc ®Þ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>

Trang 48
Tù häc C++ trong 21 ngµy.
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;
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 C¸c hµm xÕp chång.


C++ cho phÐp t¹o ra h¬n 1hµm cïng tªn. §iÒu nµy ®îc gäi lµ xÕp chång hµm. C¸c hµm ph¶i
kh¸c nhau trong danh s¸ch tham sè, víi kiÓu tham sè kh¸c nhau, mét sè tham sè kh¸c nhau
hoÆc c¶ hai. VÝ dô:

Trang 49
Tù häc C++ trong 21 ngµy.
int myFunction (int, int);
int myFunction (long, long);
int myFunction (long);
KiÓu tr¶ vÒ cã thÓ gièng nhau hoÆc kh¸c nhau trªn c¸c hµm xÕp chång. Chó ý: hai hµm cã
cïng tªn vµ dang s¸ch tham sè, nhng kh¸c nhau kiÓu tr¶ vÒ, t¹o ra mét lçi biªn dÞch.
Chó ý: Hµm "Overloading" còng ®îc gäi lµ hµm "polymorphism": Hµm nhiÒu d¹ng.
Gi¶ sö viÕt 1 hµm kiÓu double víi bÊt cø ®Çu vµo nµo. B¹n muèn ®a vµo trong 1 kiÓu int, 1
kiÓu long, 1 kiÓu float, hoÆc 1 kiÓu double. Kh«ng cã xÕp chång hµm, b¹n ph¶i t¹o ra 4 hµm
víi c¸c tªn :
int DoubleInt(int);
long DoubleLong(long);
float DoubleFloat(float);
double DoubleDouble(double);
Víi hµm xÕp chång, cã thÓ khai b¸o nh sau:
int Double(int);
long Double(long);
float Double(float);
double Double(double);
§©y lµ c¸ch dÔ ®äc vµ dÔ sö dông.Kh«ng ph¶i lo l¾ng vÒ hµm nµo ®Ó gäi; chØ cÇn ®a
vµo 1 biÕn, vµ hµm bªn ph¶i ®îc gäi 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;

Trang 50
Tù häc C++ trong 21 ngµy.
14: long myLong = 65000;
15: float myFloat = 6.5F;
16: double myDouble = 6.5e20;
17:
18: int doubledInt;
19: long doubledLong;
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: {

Trang 51
Tù häc C++ trong 21 ngµy.
49: cout << "In Double(long)\n";
50: return 2 * original;
51: }
52:
53: float Double(float original)
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 C¸c hµm "InLine".


Khi ®Þnh nghÜa 1 hµm, th«ng thêng tr×nh biªn dÞch t¹o ra 1 tËp c¸c lÖnh trong bé nhí. Khi
gäi 1 hµm, viÖc xö lý cña ch¬ng tr×nh nh¶y tíi c¸c lÖnh nµy, vµ khi tr¶ vÒ hµm, viÖc thùc
hiÖn nh¶y trë vÒ dßng tiÕp theo trong hµm gäi. NÕu gäi hµm 10 lÇn, ch¬ng tr×nh nh¶y tíi
tËp lÖnh t¬ng tù mçi lÇn. NghÜa lµ chØ cã sao chÐp hµm 1 lÇn, kh«ng ph¶i 10 lÇn.
Cã 1 sè chøc n¨ng mµo ®Çu trong viÖc nh¶y vµo vµ nh¶y ra khái hµm. §èi víi hµm nhá chØ 1
dßng hoÆc 2 dßng m· lÖnh vµ 1 sè kh¶ n¨ng cã thÓ cã lîi nÕu ch¬ng tr×nh cã thÓ tr¸nh ®îc

Trang 52
Tù häc C++ trong 21 ngµy.
viÖc nh¶y nµy chØ ®Ó xö lý 1 hoÆc 2 lÖnh. Khi nãi vÒ hiÖu qu¶ , c¸c nhµ lËp tr×nh nãi
r»ng: Ch¬ng tr×nh ch¹y nhay h¬n nÕu hµm gäi cã thÓ ®îc tr¸nh.
NÕu 1 hµm ®îc khai b¸o víi tõ kho¸ "inline", tr×nh biªn dÞch kh«ng t¹o ra mét hµm
thùc : nã sao chÐp m· tõ hµm inline trùc tiÕp tõ hµm gäi. Kh«ng cã bíc nh¶y; nã chØ nh lµ
nÕu b¹n ®· viÕt c¸c lÖnh cña hµm bªn ph¶i sang hµm gäi.
Chó ý r»ng: Trong hµm inline cã thÓ ®a ra mét gi¸ trÞ lín. NÕu hµm ®îc gäi 10 lÇn, m·
inline ®îc copy sang hµm gäi mçi lÇn trong 10 lÇn ®ã. ViÖc c¶i tiÕn gi¶m nhá tèc ®é cã thÓ
®¹t ®îc b»ng c¸ch t¨ng kh¶ n¨ng xö lý ch¬ng tr×nh . C¸c tr×nh biªn dÞch ngµy nay thùc hiÖn
c«ng viÖc rÊt lín, vµ hÇu nh kh«ng cã lîi lín tõ viÖc khai b¸o mét hµm 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 53
Tù häc C++ trong 21 ngµy.
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.
Mét hµm cã thÓ gäi chÝnh nã. §iÒu nµy ®îc gäi lµ ®Ö qui, vµ ®Ö qui cã thÓ lµ trùc tiÕp
hoÆc kh«ng trùc tiÕp. Lµ trùc tiÕp khi 1 hµm tù gäi chÝnh nã; lµ kh«ng trùc tiÕp khi 1 hµm
gäi mét hµm kh¸c mµ sau ®ã gäi hµm ®Çu tiªn.
Hµm ®Ö qui cÇn mét ®iÒu kiÖn dõng, nÕu kh«ng nã sÏ kh«ng bao giê kÕt thóc. Trong chuçi
Fibonacci , ®iÒu kiÖn dõng lµ n<3.
ThuËt to¸n sö dông cho chuçi :
1. Hái user vÒ vÞ trÝ trong chuçi.
2. Gäi hµm fib() víi vÞ trÝ ®ã. NhËn gi¸ trÞ user ®a vµo.
3. Hµm fib() x¸c ®Þnh ®èi sè (n). NÕu n<3, nã tr¶ vÒ 1; ngîc l¹i fib() tù gäi nã (®Ö
qui) ë n-2, tù gäi l¹i ë n-1 vµ tr¶ vÒ tæng sè.
NÕu gäi fib(1), nã tr¶ vÒ 1. NÕu gäi fib(2) , nã tr¶ vÒ 1, gäi fib(3), nã tr¶ vÒ tæng cña
fib(2) vµ fib(1). V× fib(2) tr¶ vÒ 1 vµ fib(1) tr¶ vÒ 1, fib(3) sÏ tr¶ vÒ 2.
NÕu gäi fib(4), nã tr¶ vÒ tæng cña fib(3) vµ fib(2). Chóng ta ®· thiÕt lËp fib(3) tr¶ vÒ 2 vµ
fib(2) tr¶ vÒ 1, v× vËy fib(4) sÏ lµ tæng cña nh÷ng sè nµy vµ tr¶ vÒ 3, lµ sè thø 4 trong chuçi.
Thùc hiÖn c¸c bíc nµy nÕu gäi fib(5), nã tr¶ vÒ 5.
Ph¬ng ph¸p nµy hÇu nh kh«ng cã hiÖu qu¶ ®Ó gi¶i quyÕt bµi to¸n nµy ( víi fib(20), hµm
fib() ®îc gäi 13529 lÇn) , nhng nã vÉn thùc hiÖn. CÈn thËn: nÕu víi n qu¸ lín, nã sÏ hÕt bé
nhí. Mäi hµm fib() ®îc gäi, bé nhí ®îc thiÕt lËp riªng ra. Khi nã tr¶ vÒ bé nhí ®îc gi¶i phãng.
Víi ®Ö qui, bé nhí tiÕp tôc ®Ó riªng ra tríc khi nã ®îc gi¶i phãng, vµ ph¬ng ph¸p nµy cã thÓ
chiÕm bé nhí rÊt nhanh.
Listing 5.10. Demonstrates recursion using the Fibonacci series.

Trang 54
Tù häc C++ trong 21 ngµy.
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:
30: if (n < 3 )
31: {
32: cout << "Return 1!\n";
33: return (1);
34: }
35: else

Trang 55
Tù häc C++ trong 21 ngµy.
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 kh«ng thêng sö dông trong lËp tr×nh C++, nhng nã cã thÓ lµ c«ng cô ®Çy søc m¹nh
®èi víi nhu cÇu nµo ®ã.
Chó ý: ®Ö qui lµ 1 phÇn rÊt khÐo lÐo cña lËp tr×nh n©ng cao.

IV.5 Stack vµ hµm.


§©y lµ nh÷ng c¸i x¶y ra khi 1 ch¬ng tr×nh ch¹y trªn 1 PC díi m«i trêng DOS, rÏ nh¸nh tíi hµm:
1. §Þa chØ trong con trá lÖnh ®îc t¨ng lªn tíi lÖnh tiÕp theo qua viÖc gäi hµm. §Þa chØ
®ã sau ®ã ®îc thay thÕ trªn stack, vµ nã sÏ tr¶ vÒ ®Þa chØ khi hµm tr¶ vÒ.
2. Ng¨n ®îc t¹o ra trªn stack ®èi víi kiÓu tr¶ vÒ ®· ®îc khai b¸o. Trªn hÖ thèng víi sè
nguyªn 2-byte, nÕu kiÓu tr¶ vÒ ®îc khai b¸o lµ int, 2-byte kh¸c ®îc thªm vµo stack,
nhng kh«ng gi¸ trÞ ®îc thay thÕ trong c¸c byte nµy.
3. §Þa chØ cña hµm ®îc gäi, ®îc gi÷ trong khu vùc ®Æc biÖt cña bé nhí, gi¶ sö r»ng ®-
îc n¹p vµo trong con trá lÖnh, v× vËy lÖnh sau ®ã ®îc xö lý sÏ lµ bªn trong hµm ®îc
gäi.
4. §Ønh hiÖn t¹i cña stack ®îc gi÷ trong con trá ®Æc biÖt ®îc gäi lµ khung stack. Mäi
thø ®îc thªm vµo stack tõ b©y giê tíi khi hµm tr¶ vÒ sÏ ®îc xem xÐt tíi.
5. TÊt c¶ c¸c ®èi sè víi hµm ®îc thay thÕ trªn stack.

Trang 56
Tù häc C++ trong 21 ngµy.
6. LÖnh b©y giê trong con trá lÖnh ®îc xö lý, v× thÕ xö lý lÖnh ®Çu tiªn cña hµm.
7. C¸c biÕn khu vùc ®îc ®Èy vµo trong stack nh chóng ®· ®îc ®Þnh nghÜa .
Khi hµm ®îc tr¶ vÒ , gi¸ trÞ tr¶ vÒ ®îc thay thÕ trong khu vùc cña stack trë l¹i bíc 2.Stack sau
®ã ®îc ®Èy tÊt c¶ lªn khung con trá.

V C¸c líp c¬ b¶n.

V.1 T¹o ra c¸c kiÓu míi.

V.1.1 T¹i sao ph¶i t¹o mét kiÓu míi.


Ch¬ng tr×nh thêng ®îc viÕt ®Ó gi¶i nh÷ng bµi to¸n cña thÕ giíi thùc, nh lµ lu gi÷ c¸c
b¶n ghi cña nh©n viªn, m« pháng c«ng viÖc cña mét hÖ thèng ®èt nãng. MÆc dï nã cã kh¶
n¨ng gi¶i c¸c bµi to¸n phøc t¹p b»ng c¸ch sö dông c¸c ch¬ng tr×nh ®îc viÕt chØ víi sè nguyªn
vµ ký tù, nã sÏ dÔ dµng thùc hiÖn c¸c bµi to¸n lín vµ phøc t¹p h¬n nÕu cã thÓ t¹o ®¹i diÖn
cña c¸c ®èi tîng mµ sÏ nãi ®Õn. Nãi c¸ch kh¸c, m« pháng c«ng viÖc mét hÖ thèng nung nãng
dÔ dµng h¬n nÕu cã thÓ t¹o ra c¸c biÕn mµ ®¹i diÖn lµ c¸c buång, c¸c c¶m biÕn nhiÖt, bé
æn nhiÖt, vµ nåi h¬i.

V.1.2 Líp vµ c¸c bé phËn.


Thùc hiÖn mét kiÓu míi b»ng c¸ch khai b¸o mét líp (class).Mét líp chØ lµ mét tËp c¸c
biÕn-- thêng lµ c¸c kiÓu kh¸c nhau-- kÕt hîp víi 1 tËp c¸c hµm cã liªn quan.
Mét líp cho phÐp gãi gän nh÷ng phÇn kh¸c nhau vµ nh÷ng hµm kh¸c nhau vµo trong
mét tËp hîp, mµ ®îc gäi lµ mét ®èi tîng (objects).
Mét líp cã thÓ bao gåm bÊt cø kiÓu biÕn nµo còng nh c¸c kiÓu líp kh¸c. C¸c biÕn trong
líp ®îc coi nh lµ c¸c biÕn bé phËn hay c¸c bé phËn d÷ liÖu.
Chó ý: Member variables còng ®îc biÕt nh data members, lµ c¸c biÕn trong líp.
Member functions còng ®îc biÕt nh lµ methods lµ c¸c hµm trong líp. Member functions
còng nh c¸c biÕn thµnh viªn lµ c¸c phÇn cña líp. Chóng x¸c ®Þnh ®èi tîng (objects) cña líp cã
thÓ lµm ®îc g×.

V.1.2.1 Khai b¸o mét líp (class).


§Ó khai b¸o 1 líp, sö dông tõ kho¸ class theo sau lµ dÊu më ngoÆc ({), vµ sau ®ã lµ
danh s¸ch c¸c thµnh viªn d÷ liÖu vµ c¸c hÖ thèng cña líp. KÕt thóc khai b¸o lµ dÊu ®ãng
ngoÆc (}) vµ dÊu chÊm phÈy. VÝ dô khai b¸o 1 líp ®îc gäi lµ Cat :
class Cat
{
unsigned int itsAge;

Trang 57
Tù häc C++ trong 21 ngµy.
unsigned int itsWeight;
Meow();
};
Khai b¸o líp nµy kh«ng ®Þnh vÞ trÝ bé nhí cho Cat. Nã chØ cho tr×nh biªn dÞch biÕt
Cat lµ g×, d÷ liÖu g× nã cã ( itsAge vµ itsWeight), vµ nã cã thÓ lµm ®îc g× ( Meow() ). Nã
còng chØ cho tr×nh biªn dÞch biÕt mét líp Cat lín bao nhiªu, bao nhiªu "room" tr×nh biªn
dÞch ph¶i thiÕt lËp cho Cat mµ b¹n t¹o ra. Trong vÝ dô nµy , nÕu mét sè nguyªn lµ hai byte,
mét Cat chØ lµ 4-byte : itsAge lµ 2 byte, itsWeight lµ 2 byte kh¸c. Meow() kh«ng chiÕm
"room" nµo, v× kh«ng cã kh«ng gian lu tr÷ dµnh cho hµm thµnh viªn(methods).

V.1.2.2 §Þnh nghÜa ®èi tîng (Object).


§Þnh nghÜa mét ®èi tîng cña líp míi chØ nh lµ ®Þnh nghÜa mét biÕn sè nguyªn:
unsigned int GrossWeight; // define an unsigned integer
Cat Frisky; // define a Cat
§o¹n m· nµy ®Þnh nghÜa 1 biÕn gäi lµ Gross Weight lµ sè nguyªn kh«ng dÊu. Nã còng
®Þnh nghÜa Frisky, lµ ®èi tîng cña líp Cat.
Chó ý: Mét ®èi tîng lµ 1 trêng hîp riªng biÖt cña mét líp.
§Ó truy nhËp vµo c¸c bé phËn trong líp, ngêi ta thêng dïng dÊu (.). Trong vÝ dô trªn,
®Ó g¸n 50 vµo biÕn thµnh viªn Weight cña Frisky, ph¶i viÕt:
Frisky.Weight = 50;
T¬ng tù, ®Ó gäi hµm Meow(), nªn viÕt :
Frisky.Meow() ;

V.1.2.3 G¸n cho ®èi tîng, kh«ng g¸n cho líp.


Trong C++, kh«ng g¸n gi¸ trÞ cho c¸c kiÓu; mµ g¸n gi¸ trÞ cho biÕn. VÝ dô, b¹n kh«ng bao
giê ®îc viÕt :
Int = 5 ;
Tr×nh biªn dÞch sÏ ®a ra mét lçi, v× kh«ng thÓ g¸n 5 cho mét sè nguyªn. B¹n ph¶i viÕt nh sau:
Int x ;
X=5;
T¬ng tù, kh«ng thÓ viÕt :
Cat.age = 5 ;
Tr×nh biªn dÞch sÏ ®a ra mét lçi, v× kh«ng thÓ g¸n 5 cho phÇn tªn cña mét líp Cat. B¹n ph¶i
®Þnh nghÜa mét ®èi tîng Cat vµ g¸n 5 cho ®èi tîng ®ã. VÝ dô:
Cat Frisky; // just like int x;
Frisky.age = 5; // just like x = 5;

Trang 58
Tù häc C++ trong 21 ngµy.
V.1.3 Private vµ Public.
C¸c tõ kho¸ kh¸c dïng ®Ó khai b¸o líp. Cã hai lo¹i thêng dïng lµ : public vµ private.
TÊt c¶ c¸c phÇn (thµnh viªn) cña mét líp-- d÷ liÖu vµ ph¬ng ph¸p (methods)-- lµ private theo
mÆc ®Þnh. C¸c thµnh viªn private cã thÓ ®îc truy nhËp chØ bªn trong method cña chÝnh líp
®ã. C¸c thµnh viªn private cã thÓ ®îc truy nhËp th«ng qua bÊt cø ®èi tîng nµo cña líp. Sù
kh¸c nhau nµy lµ c¶ quan träng vµ khã hiÓu. §Ó hiÓu râ rµng h¬n, quan s¸t vÝ dô sau:
class Cat
{
unsigned int itsAge;
unsigned int itsWeight;
Meow();
};
Trong vÝ dô nµy , itsAge, itsWeight, vµ Meow() tÊt c¶ lµ private, v× tÊt c¶ thµnh viªn cña 1
líp lµ private theo mÆc ®Þnh.
MÆc dï vËy, nÕu b¹n viÕt:
Cat Boots;
Boots.itsAge=5; // error! can't access private data!
Tr×nh biªn dÞch sÏ b¸o 1 lçi .
C¸ch sö dông Cat v× vËy b¹n cã thÓ truy nhËp vµo ®îc c¸c thµnh viªn data lµ:
class Cat
{
public:
unsigned int itsAge;
unsigned int itsWeight;
Meow();
};
B©y giê itsAge , itsWeight, vµ Meow() tÊt c¶ lµ public. Boots.itsAge = 5 biªn dÞch kh«ng gÆp
lçi nµo.
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:

Trang 59
Tù häc C++ trong 21 ngµy.
6: class Cat // declare the class object
7: {
8: public: // members which follow are public
9: int itsAge;
10: int itsWeight;
11: };
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.
Mét qui luËt chung cña thiÕt kÕ lµ nªn gi÷ l¹i d÷ liÖu thµnh phÇn cña mét private líp. V×
vËy, b¹n ph¶i t¹o ra c¸c hµm public ®îc biÕt nh lµ bé truy nhËp hÖ thèng ®Ó thiÕt lËp vµ
nhËn c¸c biÕn private thµnh viªn. Nh÷ng bé truy nhËp hÖ thèng lµ c¸c hµm thµnh viªn mµ c¸c
phÇn cña ch¬ng tr×nh gäi ®Ó nhËn ®îc vµ thiÕt lËp c¸c biÕn private thµnh viªn.
Chó ý: Mét public accessor method lµ 1 hµm thµnh viªn cña líp ®îc dïng hoÆc ®Ó ®äc gi¸
trÞ cña biÕn thµnh viªn private cña líp hoÆc ®Ó thiÕt lËp gi¸ trÞ cña nã.
C¸c hµm truy nhËp cho phÐp ph©n lo¹i chi tiÕt bao nhiªu d÷ liÖu ®· lu tr÷ ®îc sö dông. §iÒu
nµy cho phÐp thay ®æi d÷ liÖu ®îc lu gi÷, kh«ng ph¶i viÕt l¹i hµm mµ sö dông d÷ liÖu.
NÕu mét hµm cÇn truy nhËp trùc tiÕp vµo itsAge cña Cat, hµm ®ã sÏ cÇn ph¶i viÕt l¹i nÕu
b¹n lµ t¸c gi¶ cña líp Cat, quyÕt ®Þnh thay ®æi d÷ liÖu ®îc lu tr÷. B»ng c¸ch gäi hµm
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: {

Trang 60
Tù häc C++ trong 21 ngµy.
7: public:
8: // public accessors
9: unsigned int GetAge();
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: };
§Ó thiÕt lËp tuæi cña Frisky, ta cã thÓ ®a gi¸ trÞ vµo hµm SetAge() nh sau:
Cat Frisky;
Frisky.SetAge(5); // set Frisky's age using the public accessor

V.1.4 Tõ kho¸ Class.


Có ph¸p nh sau:
Class class_name
{
// tõ khãa ®iÒu khiÓn truy nhËp
// c¸c biÕn líp vµ c¸c hµm ®îc khai b¸o ë ®©y.
};
Tõ kho¸ Class dïng ®Ó khai b¸o c¸c kiÓu míi. Mét líp lµ mét tËp hîp cña líp d÷ liÖu
thµnh viªn, mµ lµ c¸c biÕn cña c¸c kiÓu kh¸c nhau, bao gåm c¸c líp kh¸c nhau. C¸c líp còng cã
c¸c hµm líp-- c¸c methods-- lµ c¸c hµm ®îc ®Ó xö lý d÷ liÖu trong líp vµ ®Ó thùc hiÖn c¸c
dÞch vô kh¸c cho líp. ViÖc ®Þnh nghÜa c¸c ®èi tîng trong líp thùc hiÖn t¬ng tù nh ®Þnh
nghÜa biÕn bÊt k×. Cã thÓ vµo c¸c thµnh viªn cña líp vµ c¸c hµm b»ng c¸ch sö dông dÊu
chÊm (.). B¹n cã thÓ sö dông c¸c tõ kho¸ ®iÒu khiÓn truy nhËp ®Ó khai b¸o c¸c phÇn cña líp
nh lµ public hay private. MÆc ®Þnh ®èi víi ®iÒu khiÓn truy nhËp lµ private. Mçi tõ kho¸

Trang 61
Tù häc C++ trong 21 ngµy.
thay ®æi ®iÒu khiÓn truy nhËp tõ ®iÓm ®ã ®Õn hÕt líp hoÆc ®Õn tõ khãa ®iÒu khiÓn
truy nhËp tiÕp 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 62
Tù häc C++ trong 21 ngµy.
V.1.4.1 C¸c hµm bæ sung trong líp.
Hµm bæ sung ®îc gäi lµ ®Þnh nghÜa hµm.
Mét ®Þnh nghÜa hµm thµnh viªn b¾t ®Çu víi tªn cña líp, sau ®ã lµ 2 dÊu 2 chÊm (::), tªn cña
hµm, vµ c¸c tham sè cña 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 63
Tù häc C++ trong 21 ngµy.
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 C¸c hµm x©y dùng vµ xãa mÆc ®Þnh.


NÕu b¹n kh«ng khai b¸o mét hµm x©y dùng hoÆc 1 hµm xo¸, tr×nh biªn dÞch thùc hiÖn
cho b¹n. Hµm x©y dùng vµ xo¸ mÆc ®Þnh kh«ng cã ®èi sè vµ kh«ng lµm g×.
§Ó khai b¸o mét ®èi tîng kh«ng ®a vµo c¸c tham sè, nh lµ
Cat Rags ; // Rags kh«ng nhËn tham sè
B¹n ph¶i cã mét hµm x©y dùng trong líp.
Cat () ;

Trang 64
Tù häc C++ trong 21 ngµy.
Khi ®Þnh nghÜa mét ®èi tîng cña 1 líp, c¸c hµm x©y dùng ®îc gäi. NÕu hµm x©y dùng
Cat() cã 2 tham sè, ph¶i ®Þnh nghÜa mét ®èi tîng Cat b»ng c¸ch viÕt
Cat Frisky (5,7);
NÕu cã 1 tham sè th× viÕt:
Cat Frisky (3);
Khi hµm x©y dùng kh«ng cã tham sè th× bá dÊu ngoÆc vµ viÕt:
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
25: {
26: }

Trang 65
Tù häc C++ trong 21 ngµy.
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);
59: Frisky.Meow();
60: cout << "Frisky is a cat who is " ;
61: cout << Frisky.GetAge() << " years old.\n";

Trang 66
Tù häc C++ trong 21 ngµy.
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ó ý :
Kh«ng nªn ®a tham sè cho c¸c hµm xo¸ ( destructors ). C¸c hµm x©y dùng (instructors ) vµ
hµm xo¸ kh«ng nªn tr¶ vÒ gi¸ trÞ . Sö dông hµm x©y dùng ®Ó khëi t¹o cho ®èi tîng .

V.1.5.1 C¸c hµm thµnh viªn Const.


NÕu khai b¸o mét hµm trong líp lµ const, b¹n ph¶i hy väng hµm sÏ kh«ng lµm thay ®æi gi¸ trÞ
cña bÊt cø thµnh viªn nµo cña líp. §Ó khai b¸o mét hµm kh«ng ®æi trong líp, ®Æt tõ kho¸
const sau dÊu ngoÆc ®¬n nhng tríc dÊu chÊm phÈy. VÝ dô khi b¸o hµm kh«ng ®æi
SomeFunction() kh«ng cã ®èi sè vµ tr¶ vÒ d¹ng void:
Void someFunction() const ;
VÝ dô
Void SetAge (int anAge) ;
Int GetAge () ;
SetAge() kh«ng thÓ lµ const v× nã thay ®æi biÕn thµnh viªn itsAge. GetAge() cã thÓ lµ const
v× nã kh«ng thay ®æi ë tÊt c¶ líp. GetAge() tr¶ vÒ gi¸ trÞ hiÖn t¹i cña biÕn thµnh viªn itsAge.
V× vËy, khai b¸o hµm nµy nªn viÕt:
Void SetAge (int anAge) ;
Int GetAge () const ;

V.2 §Æt khai b¸o líp vµ hµm trong líp ë ®©u.


Mçi hµm mµ b¹n khai b¸o cho líp, ph¶i cã mét ®Þnh nghÜa . Sù ®Þnh nghÜa còng ®îc
gäi lµ sù bæ xung hµm. Gièng nh c¸c hµm kh¸c, ®Þnh nghÜa cña mét hµm trong líp cã mét
®Çu ®Ò vµ 1 th©n hµm.

Trang 67
Tù häc C++ trong 21 ngµy.
Sù ®Þnh nghÜa ph¶i ë trong 1 file mµ tr×nh biªn dÞch cã thÓ t×m thÊy. HÇu hÕt c¸c
tr×nh biªn dÞch C++ muèn c¸c file kÕt thóc víi .C hoÆc .CCP. Trong quyÓn s¸ch nµy viÕt
lµ .CCP.
B¹n tù do ®Æt khai b¸o trong file nµy, nhng ®ã lµ kh«ng tèt cho lËp tr×nh thùc tÕ. Quy íc mµ
hÇu hÕt c¸c lËp tr×nh viªn chÊp nhËn ®Æt khai b¸o vµo trong c¸i ®îc gäi lµ ®Çu file, thêng
víi tªn kÕt thóc lµ .H hoÆc .HP, .HPP . Trong quyÓn s¸ch nµy ®Çu file víi .HPP.
VÝ dô, ®Æt khai b¸o cña líp Cat vµo trong 1 file cã tªn CAT.HPP, vµ ®Æt khai b¸o cña hµm
trong líp vµo trong 1 file ®îc gäi lµ CAT.CPP. Sau ®ã g¾n ®Çu ®Ò file víi file .CPP b»ng
c¸ch ®Æt m· lÖnh sau ®Çu file CAT.CPP:
#include Cat.hpp
§iÒu nµy b¸o cho tr×nh biªn dÞch ®äc CAT.HPP bªn trong file. ViÖc ®äc file ®Çu ®Ò b¶o
cho chóng mäi thø chóng cÇn ®Ó biÕt; chóng cã thÓ bá qua c¸c file bæ xung.

V.2.1.1 Bæ xung Inline.


Khai b¸o víi hµm GetWeight() :
inline int Cat::GetWeight()
{
return itsWeight; // return the Weight data member
}
B¹n còng cã thÓ ®Æt ®Þnh nghÜa cña hµm vµo trong khai b¸o cña líp, mµ tù ®éng thùc hiÖn
hµm inline ®ã. VÝ dô :
class Cat
{
public:
int GetWeight() { return itsWeight; } // inline
void SetWeight(int aWeight);
};
VÝ dô:
class Cat
{
public:
int GetWeight()
{
return itsWeight;
} // inline

Trang 68
Tù häc C++ trong 21 ngµy.
void SetWeight(int aWeight);
};
VÝ dô khai b¸o líp 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:
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.

Trang 69
Tù häc C++ trong 21 ngµy.
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ô nµy, trªn dßng 4 cã #include "cat.hpp" , nã b¶o cho tiÒn xö lý ®äc file cat.hpp
vµo trong file nµy. Kü thuËt nµy cho phÐp b¹n ®Æt khai b¸o vµo trong mét file bæ xung kh¸c.
§©y lµ kü thuËt rÊt th«ng dông trong lËp tr×nh C++. §iÓn h×nh, khai b¸o líp ë trong file .HPP
vµ sau ®ã ®îc #include vµo trong file ®îc liªn kÕt .CPP.

V.2.2 C¸c líp víi c¸c líp kh¸c nh lµ d÷ liÖu thµnh viªn.
Ngêi ta kh«ng thêng x©y dùng mét líp phøc t¹p b»ng viÖc khai b¸o c¸c líp ®¬n gi¶n h¬n vµ
gép chóng vµo trong khai b¸o cña líp phøc t¹p.
Quan s¸t vÝ dô thø 2. Mét h×nh chò nhËt lµ kÕt hîp cña c¸c ®êng th¼ng. Mét ®êng th¼ng cã
2 ®iÓm. Mét ®iÓm ®îc ®Þnh nghÜa b»ng 1 to¹ ®é x,y . VÝ dô sau chØ ra mét khai b¸o
hoµn chØnh cña mét líp h×nh ch÷ nhËt, xuÊt hiÖn trong RECTANGLE.HPP. V× mét h×nh
ch÷ nhËtdc ®Þnh nghÜa lµ 4 ®êng th¼ng liªn kÕt víi nhau ë 4 ®iÓm, mçi ®iÓm coi lµ mét
to¹ ®é trªn ®å thÞ, ®Çu tiªn khai b¸o mét líp Point, ®Ó gi÷ c¸c to¹ ®é x,y cña mçi ®iÓm.
Listing 6.8. Declaring a complete class.
1: // Begin Rect.hpp
2: #include <iostream.h>
3: class Point // holds x,y coordinates
4: {

Trang 70
Tù häc C++ trong 21 ngµy.
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; }
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; }

Trang 71
Tù häc C++ trong 21 ngµy.
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;
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);

Trang 72
Tù häc C++ trong 21 ngµy.
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: ";
42: cout << MyRectangle.GetUpperLeft().GetX();
43: return 0;
44: }
Output: Area: 3000
Upper Left X Coordinate: 20

V.3 CÊu tróc (structures).


Mét tõ khãa rÊt gÇn víi tõ kho¸ class lµ struct , ®îc dïng ®Ó khai b¸o mét cÊu tróc. Trong C+
+, mét cÊu tróc chÝnh x¸c ®óng nh mét líp, ngo¹i trõ c¸c thµnh viªn cña nã mÆc ®Þnh lµ
public. B¹n cã thÓ khai b¸o 1 cÊu tróc chÝnh x¸c nh khai b¸o 1 líp.
Xem l¹i vÝ dô trªn listing 6.8 :

Trang 73
Tù häc C++ trong 21 ngµy.
- Dßng 3, lµ : class Point to struct Point .
- Dßng 17, lµ : class Rectangle to struct Rectangle .
Khi ch¹y ch¬ng tr×nh th× kÕt qu¶ kh«ng thay ®æi.
Chó ý:
§Æt khai b¸o líp vµo trong file HPP vµ c¸c hµm thµnh viªn trong file CPP. Cã thÓ sö dông
const bÊt cø khi nµo.

VI C¸c lo¹i vßng lÆp.

VI.1 Nguån gèc vßng lÆp go to.


C¸c vßng lÆp bao gåm mét nh·n, mét sè c©u lÖnh vµ mét bíc nh¶y.
Trong C++, mét nh·n chØ lµ mét tªn theo sau lµ dÊu (:). Mét bíc nh¶y ®îc thùc hiÖn b»ng
c¸ch viÕt goto vµo sau tªn nh·n.
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: {
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

Trang 74
Tù häc C++ trong 21 ngµy.
counter: 4
counter: 5
Complete. Counter: 5.

VI.1.1 T¹i sao tr¸nh dïng lÆp goto.


ViÖc sö dông lÖnh goto sÏ g©y ra sù lén xén vµ khã kh¨n, kh«ng thÓ ®äc ch¬ng tr×nh mét
c¸ch dÔ dµng ®îc . Do nh÷ng ®iÒu nµy mµ ngêi ta Ýt khi sö dông lÖnh goto.
§Ó thay thÕ cho viÖc sö dông lÖnh goto, ngêi ta ®a ra c¸c lÖnh: for, while, vµ do ... while.
Chó ý kh«ng nªn dïng goto. V× nã g©y ra nh÷ng phøc t¹p.

VI.1.2 C©u lÖnh goto.


§Ó sö dông lÖnh goto, ta viÕt sau goto lµ tªn nh·n. §iÒu nµy t¹o ra bíc nh¶y v« ®iÒu kiÖn tíi
nh·n. VÝ dô:
if (value > 10)
goto end ;
if (value < 10)
goto end;
cout << "value is Â10!";
end: cout << "done";

VI.2 Vßng lÆp While.


Vßng lÆp While sÏ lÆp l¹i khi nµo ®iÒu kiÖn b¾t ®Çu vÉn cßn ®óng.
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";

Trang 75
Tù häc C++ trong 21 ngµy.
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 C©u lÖnh While.


Có ph¸p:
While (®iÒu kiÖn )
C©u lÖnh ;
®iÒu kiÖn lµ bÊt cø biÓu thøc nµo, c©u lÖnh cã thÓ lµ 1 c©u lÖnh hoÆc mét khèi c¸c lÖnh.
Khi ®iÒu kiÖn lµ ®óng (TRUE), , c©u lÖnh ®îc xö lý, vµ sau ®ã ®iÒu kiÖn ®îc kiÓm tra
l¹i. Qu¸ tr×nh sÏ tiÕp tôc ®Õn khi ®iÒu kiÖn kiÓm tra lµ FALSE, khi ®ã vßng lÆp kÕt thóc
vµ xö lý dßng ®Çu tiªn sau c©u lÖnh .
VÝ dô:
// count to 10
int x = 0;
while (x < 10)
cout << "X: " << x++;

VI.2.2 C©u lÖnh While phøc t¹p h¬n.


§iÒu kiÖn kiÓm tra trong vßng lÆp while cã thÓ phøc t¹p, nã cã thÓ sö dông to¸n tö l«gÝc:
&& (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()

Trang 76
Tù häc C++ trong 21 ngµy.
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:
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.


LÖnh continue nh¶y trë l¹i ®Çu cña vßng lÆp. LÖnh break lËp tøc kÕt thóc vßng lÆp while
vµ ch¬ng tr×nh xö lý tiÕp sau dÊu ®ãng ngoÆc.

Trang 77
Tù häc C++ trong 21 ngµy.
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;
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?

Trang 78
Tù häc C++ trong 21 ngµy.
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
Enter a target number: 6
skipping on 4
skipping on 8

Small: 10 Large: 8

VI.2.3.1 LÖnh Continue.


Lµm cho vßng lÆp while hoÆc for trë l¹i ®Çu vßng lÆp. VÝ dô:
if (value > 10)
goto end;
if (value < 10)
goto end;
cout << "value is 10!";
end:
cout << "done";

Trang 79
Tù häc C++ trong 21 ngµy.
VI.2.3.2 C©u lÖnh Break.
Lµm cho vßng lÆp while hoÆc for lËp tøc kÕt thóc. VÝ dô:
while (condition)
{
if (condition2)
break;
// statements;
}

VI.2.4 Vßng lÆp While(1).


§©y lµ vßng lÆp While kh«ng bao giê kÕt thóc (lÆp v« h¹n). V× 1 lu«n lµ ®óng vµ
lÆp kh«ng bao giê kÕt thóc trõ khi gÆp lÖnh 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;
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

Trang 80
Tù häc C++ trong 21 ngµy.
VI.3 Vßng lÆp do ... While.

VI.3.1 Do ... While.


Vßng lÆp nµy xö lý khèi lÆp tríc khi kiÓm tra ®iÒu kiÖn cña nã vµ ch¾c ch¾n r»ng khèi
lÆp lu«n ®îc thùc hiÖn víi thêi gian tèi thiÓu.

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;
18: }

Output: How many hellos? 2


Hello
Hello
Counter is: 0
C¸c lÖnh continue vµ break lµm viÖc trong vßng lÆp do ...while cã t¸c dông nh trong vßng
lÆp while. Sù kh¸c nhau gi÷a while vµ do...while ®ã lµ khi nµo kiÓm tra ®iÒu kiÖn .

VI.3.2 Có ph¸p vßng lÆp do ... while.


Có ph¸p:
Do
C©u lÖnh

Trang 81
Tù häc C++ trong 21 ngµy.
While (®iÒu kiÖn) ;
C©u lÖnh ®îc thùc hiÖn sau ®ã ®iÒu kiÖn ®îc x¸c ®Þnh. NÕu ®iÒu kiÖn lµ TRUE, vßng
lÆp ®îc lÆp l¹i, ngîc l¹i nÕu lµ FALSE, vßng lÆp kÕt thóc.
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' );

VI.4 Vßng lÆp For.


Khi lËp tr×nh víi vßng lÆp while, ta lu«n thêng t×m cho m×nh ®iÒu kiÖn thiÕt lËp ban ®Çu,
kiÓm tra xem ®iÒu kiÖn cã ®óng kh«ng, vµ t¨ng lªn hoÆc c¸ch kh¸c thay ®æi biÕn mçi lÇn
lÆp l¹i.
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: {

Trang 82
Tù häc C++ trong 21 ngµy.
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Ò vßng lÆp 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: {
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ó ph¸p vßng lÆp FOR.


Có ph¸p c©u lÖnh for :
For ( Khëi t¹o; KiÓm tra; ho¹t ®éng)
C©u lÖnh ;
VÝ dô:
// print Hello ten times
for (int i = 0; i<10; i++)

Trang 83
Tù häc C++ trong 21 ngµy.
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 Vßng lÆp For cÊp cao.


C©u lÖnh for cã ®Çy søc m¹nh vµ sù linh ho¹t.
Mét vßng lÆp for lµm viÖc theo c¸c bíc sau:
1. Thùc hiÖn phÐp to¸n khëi t¹o.
2. X¸c ®Þnh ®iÒu kiÖn .
3. NÕu ®iÒu kiÖn TRUE, thùc hiªn lÖnh ho¹t ®éng vµ lÆp.
Sau mçi lÇn, vßng lÆp lÆp l¹i c¸c bíc 2 vµ 3. ViÖc khëi t¹o nhiÒu biÕn vµ t¨ng chóng nªn, vµ
thùc hiÖn nhiÒu h¬n mét lÖnh . Khëi t¹o vµ ho¹t ®éng cã thÓ thay thÕ b»ng nhiÒu c©u lÖnh
C++, mçi c©u lÖnh ®îc ng¨n c¸ch bëi 1 dÊu phÈy.
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Ò c©u lÖnh Null trong vßng lÆp FOR:

Trang 84
Tù häc C++ trong 21 ngµy.
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:
16: cout << "\nCounter: " << counter << ".\n";
17: return 0;
18: }

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


Counter: 5.
Trong thùc tÕ, sö dông break vµ continue ®Ó t¹o ra mét vßng for kh«ng cã 3 c©u lÖnh .
VÝ dô c©u lÖnh For rçng:
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

Trang 85
Tù häc C++ trong 21 ngµy.
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


Hello!
Hello!
Hello!
Vßng lÆp for(; ;) lµ lÆp v« h¹n gièng nh vßng lÆp while(1) .

VI.5 Vßng lÆp lång.


C¸c vßng lÆp cã thÓ ®îc lång vµo bªn trong th©n cña mét vßng lÆp kh¸c. Vßng lÆp bªn
trong ®îc thùc hiÖn ®Çy ®ñ ®èi víi mçi lÇn thùc hiÖn vßng lÆp ngoµi.
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;

Trang 86
Tù häc C++ trong 21 ngµy.
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


How many columns? 12
What character? x
xxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxx

VI.6 Sö dông vßng lÆp víi chuçi sè.


Nh ë trªn ®· tr×nh bµy vÒ chuçi Fibonacci. Chuçi Fibonacci cã d¹ng:
1, 1, 2, 3,5 , 8, 13, 21, 34, .....
Dïng vßng lÆp ta cã thÓ thùc hiÖn 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;

Trang 87
Tù häc C++ trong 21 ngµy.
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: {
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

Trang 88
Tù häc C++ trong 21 ngµy.

6765 is the 20th Fibonacci number.

Which position? 100

3314859971 is the 100th Fibonacci number.

VI.7 C©u lÖnh Switch.


C©u lÖnh switch cã d¹ng:
switch (expression)
{
case valueOne: statement;
break;
case valueTwo: statement;
break;
....
case valueN: statement;
break;
default: statement;
}
expression lµ bÊt cø biÓu thøc nµo, statements cã thÓ lµ mét lÖnh hoÆc 1 khèi lÖnh. Switch
x¸c ®Þnh expression vµ so s¸nh kÕt qu¶ víi mçi 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)

Trang 89
Tù häc C++ trong 21 ngµy.
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;
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ô kh¸c.
switch (choice)
{
case 0:
cout << "Zero!" << endl;
break
case 1:
cout << "One!" << endl;
break;
case 2:
cout << "Two!" << endl;
default:

Trang 90
Tù häc C++ trong 21 ngµy.
cout << "Default!" << endl;
}
Example 2

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

VI.7.1.1 Sö dông lÖnh switch víi 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: {

Trang 91
Tù häc C++ trong 21 ngµy.
17:
18: BOOL exit = FALSE;
19: for (;;)
20: {
21: USHORT choice = menu();
22: switch(choice)
23: {
24: case (1):
25: DoTaskOne();
26: break;
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: {

Trang 92
Tù häc C++ trong 21 ngµy.
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 << ": ";
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

Trang 93
Tù häc C++ trong 21 ngµy.
Task One!
**** Menu ****
(1) Choice one.
(2) Choice two.
(3) Choice three.
(4) Redisplay menu.
(5) Quit.

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

:5

VII ¤n tËp 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:

Trang 94
Tù häc C++ trong 21 ngµy.
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;
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);

Trang 95
Tù häc C++ trong 21 ngµy.
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;
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);

Trang 96
Tù häc C++ trong 21 ngµy.
86: DoDrawRect(theRect);
87: break;
88: case Quit:
89: fQuit = TRUE;
90: cout << "\nExiting...\n\n";
91: break;
92: default:
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++)

Trang 97
Tù häc C++ trong 21 ngµy.
121: {
122: for (USHORT j = 0; j< width; j++)
123: cout << "*";
124: cout << "\n";
125: }
126: }
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

Trang 98
Tù häc C++ trong 21 ngµy.
(5) Quit
2
Area: 150

*** Menu ***


(1) Draw Rectangle
(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

Trang 99
Tù häc C++ trong 21 ngµy.
(3) Perimeter
(4) Resize
(5) Quit
2
Area: 80

*** 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 biÕn gi÷ mét ®Þa chØ bé nhí.

VIII.1.1 Lu ®Þa chØ vµo trong con trá.


Mçi biÕn ®Òu cã mét ®Þa chØ. ThËm chÝ kh«ng cÇn biÕt ®Þa chØ cô thÓ cña mét
biÕn ®· biÕt, b¹n cã thÓ ®Þa chØ ®ã vµo mét con trá.
VÝ dô, gi¶ sö, howOld lµ mét sè nguyªn. §Ó khai b¸o 1 con trá gäi lµ pAge ®Ó lu ®Þa chØ
cña nã, ta viÕt:

Trang 100
Tù häc C++ trong 21 ngµy.
Int *pAge = 0;
Khai b¸o nµy pAge lµ mét con trá int . pAge ®îc khai b¸o ®Ó lu ®Þa chØ cña mét sè nguyªn.
Chó ý r»ng pAge lµ mét biÕn gièng nh bÊt kú biÕn nµo. Khi khai b¸o mét biÕn con trá nh
pAge, nã ®îc thiÕt lËp ®Ó lu ®Þa chØ. pAge chØ cã kh¸c ë kiÓu biÕn.
Trong vÝ dô nµy, pAge ®îc khëi t¹o lµ zero. Mét con trá mµ gi¸ trÞ cña nã lµ 0 th× ®îc gäi lµ
con trá rçng (null). TÊt c¶ c¸c con trá, khi chóng ®îc t¹o ra, nªn ®îc khëi t¹o cho mét c¸i g×
®ã.NÕu b¹n kh«ng biÕt g¸n g× cho con trá ,th× g¸n 0. Mét con trá mµ kh«ng ®îc khëi t¹o , ®îc
gäi lµ con trá tù do (wild pointer). Con trá tù do lµ rÊt nguy hiÓm.
NÕu b¹n khëi t¹o con trá lµ 0, b¹n ph¶i g¸n mét c¸ch cô thÓ cña 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
Dßng ®Çu tiªn t¹o ra mét biÕn --howOld vµ khëi t¹o gi¸ trÞ lµ 50. Dßng thø hai khai b¸o 1 con
trá kiÓu unsigned short int vµ khëi t¹o lµ zero. PAge lµ mét con trá bëi v× dÊu hoa thÞ (*) sau
kiÓu biÕn vµ tríc tªn biÕn.
Dßng thø 3 g¸n ®Þa chØ cña howOld cho con trá pAge. Cã thÓ nãi r»ng ®Þa chØ howOld
®ang ®îc g¸n bëi ®Þa chØ cña to¸n tö (&). NÕu ®Þa chØ cña to¸n tö kh«ng ®îc sö dông, gi¸
trÞ cña howOld sÏ ®îc g¸n. §iÒu ®ã cã thÓ hoÆc kh«ng thÓ cã ®îc mét ®Þa chØ ®óng.
Theo quan ®iÓm nµy, pAge cã gi¸ trÞ ®Þa chØ cña howOld. HowOld lÇn lît cã gi¸ trÞ 50. Cã
thÓ thùc hiÖn ®iÒu nµy víi mét bíc nh:
unsigned short int howOld = 50; // make a variable
unsigned short int * pAge = &howOld; // make pointer to howOld
pAge lµ con trá chøa ®Þa chØ cña biÕn howOld. Sö dông pAge, b¹n cã thÓ x¸c ®Þnh gi¸ trÞ
cña biÕn howOld, trong trêng hîp nµy lµ 50. Truy cËp howOld b»ng c¸ch sö dông con trá
pAge ®îc gäi lµ gi¸n tiÕp, bëi v× kh«ng trùc tiÕp truy cËp howOld b»ng pAge. Ngµy nay, ta
sÏ xem c¸ch sö dông gi¸n tiÕp ®Ó truy nhËp vµo gi¸ trÞ cña biÕn.
Gi¸n tiÕp nghÜa lµ truy nhËp gi¸ trÞ ë ®Þa chØ ®îc gi÷ bëi con trá. Con trá cung cÊp mét
c¸ch kh«ng trùc tiÕp ®Ó nhËn ®îc gi¸ trÞ lu ë ®Þa chØ ®ã.

VIII.1.2 Tªn con trá vµ to¸n tö gi¸n tiÕp.


Tªn con trá thêng b¾t ®Çu víi ch÷ p, nh lµ : pAge hoÆc pNumber.
To¸n tö gi¸n tiÕp (*) còng ®îc gäi lµ to¸n tö "dereference". Khi mét con trá ®îc
"dereferenced", gi¸ trÞ ë ®Þa chØ ®îc lu tr÷ bëi con trá ®îc truy nhËp.

Trang 101
Tù häc C++ trong 21 ngµy.
C¸c biÕn th«ng thêng cung cÊp truy nhËp trùc tiÕp tíi gi¸ trÞ cña chóng. NÕu t¹o ra mét biÕn
míi cña kiÓu unsigned short int ®îc gäi lµ yourAge, vµ muèn g¸n gi¸ trÞ trong howOld cho
biÕn míi ®ã, ta viÕt:
Unsigned short int yourAge ;
YourAge = howOld ;
Mét con trá cung cÊp truy nhËp gi¸n tiÕp tíi gi¸ trÞ cña biÕn mµ ®Þa chØ nã lu tr÷. §Ó g¸n
gi¸ trÞ trong howOld cho biÕn míi yourAge b»ng c¸ch sö dông con trá pAge, ta viÕt:
Unsigned short int yourAge ;
YourAge = *pAge ;
(*) ®»ng tríc biÕn pAge cã nghÜa " gi¸ trÞ lu ë ". LÖnh g¸n nµy "®a gi¸ trÞ lu ë ®Þa chØ
trong pAge vµ g¸n nã cho yourAge"
khi con trá ®îc "dereferenced", to¸n tö gi¸n tiÕp chØ ra gi¸ trÞ ë vïng bé nhí ®îc lu trong con
trá ®îc truy nhËp, h¬n lµ ®Þa chØ cña chÝnh nã.
*pAge = 5 ; // g¸n 5 cho gi¸ trÞ ë pAge.

VIII.1.2.1 Con trá, ®Þa chØ vµ biÕn.


Ta ph¶i ph©n biÖt ®îc gi÷a con trá vµ ®Þa chØ mµ con trá lu, vµ gi¸ trÞ ë ®Þa chØ lu
bëi con trá. §©y lµ nguån gèc cña nh÷ng phiÒn phøc vÒ con trá.
Quan s¸t ®o¹n m· lÖnh sau:
int theVariable = 5;
int * pPointer = &theVariable ;
theVariable ®îc khai b¸o lµ mét biÕn sè nguyªn ®îc khëi t¹o víi gi¸ trÞ 5. pPointer ®îc khai
b¸o lµ mét con trá cho mét sè nguyªn; nã ®îc khëi t¹o víi ®Þa chØ cña theVariable. Gi¸ trÞ ë
®Þa chØ mµ pPointer lu gi÷ lµ 5.

VIII.1.3 Thao t¸c d÷ liÖu sö dông con trá.


Mçi lÇn con trá ®îc g¸n ®Þa chØ cña mét biÕn, b¹n cã thÓ sö dông con trá ®ã ®Ó truy
nhËp vµo d÷ liÖu trong biÕn ®ã. VÝ dô 8.2 gi¶i thÝch ®Þa chØ cña biÕn khu vùc ®îc g¸n
cho con trá nh thÕ nµo vµ con trá thao t¸c gi¸ trÞ trong biÕn ®ã nh thÕ nµo.
1: // Listing 8.2 Using pointers
2:
3: #include <iostream.h>
4:
5: typedef unsigned short int USHORT;
6: int main()
7: {

Trang 102
Tù häc C++ trong 21 ngµy.
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

*pAge = 7
*pAge: 7
myAge: 7

myAge = 9

Trang 103
Tù häc C++ trong 21 ngµy.
myAge: 9
*pAge: 9
Chó ý : *pointer: chØ ra gi¸ trÞ cña ®Þa chØ mµ con trá lu gi÷

VIII.1.3.1 KiÓm tra ®Þa chØ .


Con trá cho phÐp b¹n thao t¸c ®Þa chØ kh«ng cÇn biÕt gi¸ trÞ thùc cña chóng.
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";
23: cout << "*pAge:\t" << *pAge << "\n";
24:
25: cout << "&pAge:\t" << &pAge << "\n";
26: return 0;
27: }
Output: myAge: 5 yourAge: 10

Trang 104
Tù häc C++ trong 21 ngµy.
&myAge: 0x355C &yourAge: 0x355E
pAge: 0x355C
*pAge: 5
myAge: 5 yourAge: 10
&myAge: 0x355C &yourAge: 0x355E
pAge: 0x355E
*pAge: 10
&pAge: 0x355A
Trong dßng 8, myAge vµ yourAge ®îc khai b¸o lµ c¸c biÕn kiÓu sè nguyªn kh«ng dÊu short.
Trong dßng 9, pAge ®îc khai b¸o lµ 1 con trá cho sè nguyªn kh«ng dÊu short, vµ ®îc khëi t¹o
víi ®Þa chØ cña biÕn myAge .
Dßng 11 vµ 12 in gi¸ trÞ vµ ®Þa chØ cña myAge vµ yourAge .Dßng 14 in néi dung cña pAge,
mµ lµ ®Þa chØ cña myAge . Dßng 15 in kÕt qu¶ cña "dereferencing" pAge, mµ in gi¸ trÞ ë
pAge-- gi¸ trÞ trong myAge, hoÆc 5.
§©y lµ b¶n chÊt cña con trá. Dßng 14 chØ ra pAge lu ®îc cña myAge, vµ dßng 15 chØ ra c¸ch
nhËn gi¸ trÞ ®îc lu trong myAge b»ng c¸ch "dereferencing" con trá pAge.
Dßng 17, pAge ®îc g¸n l¹i tíi ®iÓm ®îc cña yourAge. Gi¸ trÞ vµ ®Þa chØ l¹i ®îc in ra. §Çu ra
®a ra pAge b©y giê cã ®Þa chØ cña biÕn yourAge vµ ®¹t ®îc gi¸ trÞ trong yourAge .
Dßng 25 in ra ®Þa chØ cña chÝnh pAge. Nh bÊt cø biÕn nµo, nã cã 1 ®Þa chØ vµ ®Þa chØ
®ã cã thÓ ®îc lu trong 1 con trá.
Sö dông (*) ®Ó truy nhËp d÷ liÖu lu gi÷ t¹i ®Þa chØ tron con trá . Khëi t¹o con trá hoÆc
®Þa chØ cô thÓ hoÆc gi¸ trÞ null.

VIII.2Con trá.
§Ó khai b¸o mét con trá, viÕt kiÓu biÕn ®»ng sau to¸n tö con trá (*) vµ tªn cña con trá. VÝ
dô:
unsigned short int *pPointer = 0 ;
§Ó g¸n hoÆc khëi t¹o con trá, sö dông to¸n tö ®Þa chØ (&). VÝ dô:
unsigned short int theVariable = 5;
unsigned short int * pPointer = & theVariable;

VIII.3NEW
B¹n cã thÓ ®Þnh râ vÞ trÝ bé nhí trªn bé nhí trèng (free store) trong C++ b»ng c¸ch sö
dông tõ kho¸ new . New theo sau kiÓu cña ®èi tîng mµ b¹n muèn ®Þnh râ vÞ trÝ v× vËy

Trang 105
Tù häc C++ trong 21 ngµy.
tr×nh biªn dÞch biÕt ®îc cÇn bao nhiªu bé nhí. V× vËy, new unsigned short int ®Þnh râ 2 byte
nhí vµ new long ®Þnh râ 4 byte nhí.
Gi¸ trÞ tr¶ vÒ tõ new lµ mét ®Þa chØ bé nhí. Nã ph¶i ®îc g¸n vµo mét con trá. §Ó t¹o ra mét
unsigned short trªn bé nhí rçng, ta ph¶i viÕt:
unsigned short int * pPointer;
pPointer = new unsigned short int;
B¹n cã thÓ khëi t¹o con trá nh sau:
unsigned short int * pPointer = new unsigned short int;
Trong mçi trêng hîp trªn, pPointer coi nh mét con trá sè nguyªn kh«ng dÊu . Ta cã thÓ viÕt:
*pPointer = 72 ;
LÖnh nµy cã nghÜa, "g¸n gi¸ trÞ 72 cho vïng trªn bé nhí rçng tíi c¸c ®iÓm pPointer ".

VIII.4Delete.
Khi b¹n kÕt thóc víi khu vùc cña bé nhí, b¹n ph¶i gäi "delete" thuéc con trá. Delete tr¶ vÒ vïng
nhí cho bé nhí tù do. Vïng nhí x¸c ®Þnh víi new kh«ng tù ®éng gi¶i phãng ®îc.
§Ó kh«i phôc l¹i bé nhí ®Ó bé nhí rçng, ta sö dông 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>
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";

Trang 106
Tù häc C++ trong 21 ngµy.
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.5T¹o ®èi tîng trªn Free Store.


NÕu b¹n ®· khai b¸o mét ®èi tîng kiÓu Cat, b¹n cã thÓ khai b¸o mét con trá trong líp Cat, có
ph¸p nh sau:
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();

Trang 107
Tù häc C++ trong 21 ngµy.
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;
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...

Trang 108
Tù häc C++ trong 21 ngµy.
Destructor called.

VIII.6Truy nhËp c¸c thµnh phÇn d÷ liÖu.


§Ó truy nhËp c¸c thµnh phÇn, ta dïng to¸n tö chÊm (.):
(*pRags).GetAge() ;
NÕu dïng c¸ch viÕt nµy th× sÏ rÊt phøc t¹p, trong C++ dïng c¸ch viÕt t¾t lµ to¸n 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; }
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

Trang 109
Tù häc C++ trong 21 ngµy.
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:
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: }

Trang 110
Tù häc C++ trong 21 ngµy.
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 .


Mçi hµm thµnh viªn trong líp ®Òu cã mét tham sè Èn : con trá this . Con trá this dµnh
cho ®èi tîng riªng. V× vËy, trong mçi lÇn gäi GetAge() hay SetAge(), con trá this ®èi víi ®èi
tîng ®îc bao gåm mét tham sè Èn.
Listing 8.8. Using the this pointer.
1: // Listing 8.8
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:

Trang 111
Tù häc C++ trong 21 ngµy.
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);
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.
C¸c hµm SetLength() vµ GetLength() sö dông con trá this ®Ó truy nhËp c¸c biÕn thµnh viªn
cña ®èi tuîng Rectangle. C¸c hµm GetWidth vµ SetWidth kh«ng sö dông.

VIII.7Con trá h»ng (const Pointer).


Sö dông tõ kho¸ const cho con trá tríc kiÓu cña nã. C¸c vÝ dô sau ®©y lµ hîp ph¸p:
const int * pOne;

Trang 112
Tù häc C++ trong 21 ngµy.
int * const pTwo;
const int * const pThree;
pOne lµ mét con trá víi mét h»ng sè nguyªn. Gi¸ trÞ ®îc lu tr÷ kh«ng thay ®æi ®îc .
pTwo lµ con trá h»ng víi mét sè nguyªn. Sè nguyªn cã thÓ ®îc thay ®æi, nhng pTwo còng
kh«ng thÓ trá tíi bÊt cø c¸i g×.
pThree lµ con trá h»ng ®èi víi mét h»ng sè nguyªn. Gi¸ trÞ ®îc lu kh«ng thÓ ®îc thay ®æi, vµ
pThree kh«ng thÓ thay ®æi ®Ó trá tíi bÊt 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>
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)

Trang 113
Tù häc C++ trong 21 ngµy.
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";
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

Trang 114
Tù häc C++ trong 21 ngµy.
VIII.8Tãm l¹i.
Con trá cung cÊp mét c¸ch ®Çy søc m¹nh ®Ó truy nhËp d÷ liÖu gi¸n tiÕp. Mçi biÕn cã mét
®Þa chØ, mµ cã thÓ ®¹t ®îc b»ng c¸ch sö dông to¸n tö ®Þa chØ cña (&) . §Þa chØ cã thÓ ®-
îc lu trong mét con trá.
Con trá ®îc khai b¸o b»ng c¸ch viÕt kiÓu cña ®èi tîng mµ chóng trá tíi, sau ®ã lµ to¸n tö
gi¸n tiÕp (*) vµ tªn cña con trá. Con trá nªn ®îc khëi t¹o ®Ó trá tíi mét ®èi tîng hoÆc rçng
(null : 0 ).
B¹n cã thÓ truy nhËp gi¸ trÞ ë ®Þa chØ ®îc lu trong mét con trá b»ng c¸ch sö dông to¸n tö gi¸n
tiÕp (*). B¹n cã thÓ khai b¸o con trá const, mµ kh«ng thÓ ®îc g¸n l¹i ®Ó trá tíi ®èi tîng kh¸c,
vµ c¸c con trá tíi c¸c ®èi tîng h»ng (const), mµ kh«ng thÓ ®îc dïng ®Ó thay ®æi c¸c ®èi tîng
mµ chóng trá tíi.
§Ó t¹o c¸c ®èi tîng míi trªn bé nhí free, b¹n sö dông tõ kho¸ new vµ g¸n ®Þa chØ ®ã trë l¹i cho
con trá. B¹n gi¶i phãng bé nhí b»ng c¸ch gäi tõ kho¸ delete ë con trá. Delete gi¶i phãng bé nhí,
nhng nã kh«ng ph¸ huû con trá. V× vËy, b¹n ph¶i g¸n l¹i con trá sau khi bé nhí ®· ®îc gi¶i
phãng.

IX Tham kh¶o ( References).

IX.1 Reference lµ g× ?
Reference lµ mét bÝ danh; khi b¹n t¹o mét reference, b¹n khëi t¹o nã víi tªn cña mét ®èi t-
îng kh¸c, target. Tõ ®ã, reference ho¹t ®éng nh mét tªn ®îc chän cho target, vµ bÊt cø c¸i g×
lµm cho reference thùc chÊt lµ lµm cho target.
Ta cã thÓ t¹o ra mét reference b»ng c¸ch viÕt kiÓu cña ®èi tîng target, theo sau to¸n tö
reference (&), sau ®ã lµ tªn cña reference. Reference cã thÓ sö dông bÊt cø tªn biÕn hîp ph¸p
nµo, nhng trong s¸ch nµy chóng ta sö dông tiÒn tè víi tªn "r". V× vËy, nÕu b¹n cã mét biÕn sè
nguyªn tªn someInt, b¹n cã thÓ thùc hiÖn mét reference cho biÕn ®ã b»ng c¸ch viÕt nh sau:
int &rSomeRef = SomeInt ;
LÖnh nµy ®äc lµ : " rSomeRef lµ mét reference cho mét sè nguyªn mµ ®îc khëi t¹o ®Ó
®a cho someInt."
Chó ý:
To¸n tö reference (&) t¬ng tù biÓu tîng nh ®îc dïng ®èi víi ®Þa chØ cña to¸n tö . §©y kh«ng
lµ c¸c to¸n tö gièng nhau.

Listing 9.1. Creating and using references.

Trang 115
Tù häc C++ trong 21 ngµy.

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;
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
NÕu khai b¸o mét Reference, nhng nÕu kh«ng khëi t¹o nã th× sÏ gÆp ph¶i lçi biªn dÞch.
Reference ph¶i ®îc khëi t¹o.

IX.1.1 Sö sông to¸n tö ®Þa chØ & ë References.


NÕu b¹n ®ßi hái ®Þa chØ ®èi víi mét Reference, nã tr¶ vÒ ®Þa chØ cña target cña nã. §ã lµ
®iÒu tù nhiªn cña nã. Chóng lµ c¸c bÝ danh cho target.
Listing 9.2. Taking the address of a reference.

1: //Listing 9.2
2: // Demonstrating the use of References

Trang 116
Tù häc C++ trong 21 ngµy.
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;
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;

Trang 117
Tù häc C++ trong 21 ngµy.
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;
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ö dông references ®Ó t¹o ra mét bÝ danh cho 1 ®èi tîng. Nªn khëi t¹o tÊt c¶ c¸c reference.
Kh«ng nªn cè g¾ng g¸n l¹i mét reference.

Trang 118
Tù häc C++ trong 21 ngµy.
IX.1.2 Reference.
BÊt cø ®èi tîng nµo còng cã thÓ ®îc xÐt ®Õn, bao gåm c¸c ®èi tîng ®îc ngêi sö dông ®Þnh
nghÜa. Chó ý r»ng b¹n t¹o ra mét reference cho mét ®èi tîng, nhng kh«ng ph¶i cho 1 líp. B¹n
kh«ng ®îc viÕt :
Int & rIntRef = int ; // sai
B¹n ph¶i khëi t¹o rIntRef cho mét sè nguyªn cô thÓ , nh lµ:
int howBig = 200;
int & rIntRef = howBig;
Trong c¸ch t¬ng tù, b¹n kh«ng nªn khëi t¹o 1 reference cho mét CAT:
CAT & rCatRef = CAT ; // sai
B¹n ph¶i khëi t¹o rCatRef cho mét ®èi tîng CAT cô thÓ :
CAT frisky ;
CAT & rCatRef = frisky ;
Chóng ta cã thÓ truy nhËp vµo d÷ liÖu thµnh viªn b»ng c¸ch dïng to¸n tö chÊm (.).
Listing 9.4. References to objects.
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: {

Trang 119
Tù häc C++ trong 21 ngµy.
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: }
Output: Frisky is: 5 years old.
And Frisky weighs 8 pounds.

IX.1.2.1 Có ph¸p References.


Khai b¸o mét reference b»ng c¸ch viÕt kiÓu, sau ®ã lµ to¸n tö &, sau ®ã lµ tªn reference.
Reference ph¶i ®îc khëi t¹o ë cïng thêi ®iÓm t¹o ra.
VÝ dô:
int hisAge;
int &rAge = hisAge;
VÝ dô:
CAT boots;
CAT &rCatRef = boots;

IX.1.2.2 Hµm swap() lµm viÖc víi 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);

Trang 120
Tù häc C++ trong 21 ngµ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:
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>

Trang 121
Tù häc C++ trong 21 ngµy.
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: {
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:

Trang 122
Tù häc C++ trong 21 ngµy.
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:
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;

Trang 123
Tù häc C++ trong 21 ngµy.
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 M¶ng

M¶ng lµ mét tËp c¸c vÞ trÝ lu tr÷ d÷ liÖu, mçi vÞ trÝ lu tr÷ ®îc gäi lµ mét
thµnh phÇn cña m¶ng.
Khai b¸o m¶ng: KiÓu m¶ng tªn m¶ng chØ sè m¶ng: lµ sè phÇn tö trong
m¶ng, bao quanh lµ dÊu ngoÆc vu«ng [ ].
VÝ dô :
Long longarray[25] ; // m¶ng nµy cã 25 phÇn tö
C¸c phÇn tö cña m¶ng tÝnh 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:
Trang 124
Tù häc C++ trong 21 ngµy.
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

X.1 Khëi t¹o m¶ng


Cã thÓ khëi t¹o m¶ng khi khai b¸o. VÝ dô:
Int intArray[5] = {10, 15, 20, 25, 35} ;
NÕu quªn kÝch thíc cña m¶ng, mét m¶ng sÏ cã kÝch thíc b»ng ®óng sè phÇn tö
khëi t¹o. VÝ dô:
Int intArray[ ] = { 5, 12, 15, 18, 20 };
Hµm dïng ®Ó lÊy kÝch thíc cña m¶ng :
Const USHORT IntArraylength ;
IntArraylength = sizeof(IntArray)/sizeof(IntArray[0]) ;
LÊy kÝch thíc toµn m¶ng chia cho kÝch thíc mét phÇn tö.
Chó ý: Kh«ng ®îc khëi t¹o c¸c phÇn tö lín h¬n ®· khai b¸o cho m¶ng. Tuy nhiªn
cã thÓ khëi t¹o 2 phÇn tö trong 5 phÇn tö cña c¶ m¶ng:
Int IntArray[5] = {2, 6};
NÕu kh«ng khëi t¹o cho c¸c phÇn tö cña m¶ng th× c¸c phÇn tö sÏ ®îc g¾n mÆc
®Þ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:

Trang 125
Tù häc C++ trong 21 ngµy.
11: cout << "The value at Tuesday is: " << ArrayWeek[Tue];
12: return 0;
13: }
Output: The value at Tuesday is: 30
M¶ng c¸c ®èi tîng.
BÊt cø ®èi tîng nµo , mÆc dï ®· cã s½n hoÆc ®· ®îc ®Þnh nghÜa, còng cã
thÓ ®îc lu trong mét m¶ng.
ViÖc truy nhËp d÷ liÖu thµnh phÇn trong mét m¶ng ®èi tîng, tr¶i qua 2 bíc:
- X¸c ®Þnh sè phÇn tö cña m¶ng nhê chØ sè trong to¸n tö [ ]
- Thªm to¸n tö (.) ®Ó truy nhËp biÕn thµnh viªn 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: }

Trang 126
Tù häc C++ trong 21 ngµy.
Output: cat #1: 1
cat #2: 3
cat #3: 5
cat #4: 7
cat #5: 9

X.2 M¶ng nhiÒu chiÒu.


M¶ng nhiÒu chiÒu lµ cã tö hai chiÒu trë lªn. Mçi chiÒu ®îc x¸c ®Þnh b»ng mét
dÊu ngoÆc vu«ng:
Int Mang [5] [3] ;
Khëi t¹o:
Thø tù x¸c ®Þnh lµ: 3 phÇn tö ®Çu tiªn thuéc Mang[0], 3 phÇn tö tiÕp theo lµ
thuéc Mang[1] , vµ tiÕp tôc ...
Ta cã thÓ viÕt :
Int Mang[5][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } ;
§Ó râ dµng, nªn viÕt nh sau:
Int Mang[5][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}, {13, 14, 15} } ;

X.2.1 M¶ng 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;

Trang 127
Tù häc C++ trong 21 ngµy.
23: CAT * pCat;
24: for (i = 0; i < 500; i++)
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

M¶ng khai b¸o cã tªn Family, nã gi÷ 500 con trá ®èi tîng CAT.

X.2.2 Khai b¸o M¶ng trªn Free Store.


Cã thÓ ®a toµn bé m¶ng lªn Free Store, thùc hiÖn b»ng c¸ch gäi tõ kho¸ new vµ
sö dông to¸n tö chØ sè. KÕt qu¶ lµ mét con trá trá tíi mét vïng trªn free store mµ
chøa m¶ng . VÝdô:
Cat *Family = new Cat[500];
Khai b¸o Family lµ mét con trá trá tíi phÇn tö ®Çu tiªn trong m¶ng 500 Cat. Nãi
c¸ch kh¸c Family chØ tíi -- hoÆc cã ®Þa chØ cña -- Family[0].
¦u ®iÓm cña viÖc sö dông Family theo c¸ch nµy lµ b¹n cã thÓ sö dông con trá sè
häc ®Ó truy cËp tíi mçi thµnh viªn cña 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 s¸nh con trá trá tíi m¶ng vµ m¶ng con trá.

VÝ dô : Cã 3 khai b¸o.

Trang 128
Tù häc C++ trong 21 ngµy.
1: Cat Fone[500] ;

2: Cat *Ftwo[500] ;

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

FOne lµ mét m¶ng 500 Cat.

Ftwo lµ mét m¶ng 500 con trá trá tíi c¸c Cat.
Fthree lµ mét con trá trá tíi mét m¶ng 500 Cat.
Trong khai b¸o thø ba, Fthree lµ mét biÕn cña Fone.

X.3 Tªn con trá vµ m¶ng


Trong C++, tªn m¶ng lµ mét con trá h»ng trá tíi phÇn tö ®Çu tiªn cña m¶ng. V×
vËy, trong khai b¸o:
Cat Family[50] ;
Family lµ mét con trá trá tíi ®Þa chØ &Family[0]: §Þa chØ cña phÇn tö ®Çu
tiªn cña m¶ng Family.
Ta cã thÓ viÕt : Family + 4 ®Ó truy nhËp ®Õn d÷ liÖu cña Family[4].

X.4 M¶ng ký tù (CHAR).


Trong C++, mét chuçi (String) lµ mét m¶ng c¸c ký tù, kÕt thóc lµ mét ký tù null.
Ta cã thÓ khai b¸o vµ khëi t¹o mét m¶ng ký tù nh c¸c m¶ng th«ng thêng nh sau:
Char Greeting[ ] = { 'H', 'e', 'l', 'l', 'o', ' ' W', 'o', 'r', 'l', 'd', '\0' };
'\0' lµ ký tù null, trong nhiÒu hµm C++ chÊp nhËn nh lµ dÊu kÕt thóc chuçi. §Ó
gi¶m sù phøc t¹p vµ cã thÓ g©y ra lçi, C++ cho phÐp viÕt nh sau:
char Greeting[ ] = "Hello World" ; // Víi c¸ch nµy kh«ng cÇn cã ký tù null ('\0')
Chuçi Hello World chiÕm 12 byte. Hello chiÕm 5 byte, space 1 byte, World 5
byte vµ null chiÕm 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: {

Trang 129
Tù häc C++ trong 21 ngµy.
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¶ n¨ng lçi víi ch¬ng tr×nh nµy:


- Thø 1: NÕu user ®a vµo h¬n 79 ký tù (mét ký tù lµ cña null), cin viÕt vµo vît
qu¸ ®iÓm kÕt thóc cña m¶ng buffer .
- Thø 2: NÕu user nhËp vµo 1 space, cin cho r»ng ®ã lµ kÕt thóc chuçi, vµ
dõng viÖc ghi vµo buffer.
§Ó gi¶i quyÕt ®iÒu nµy, ph¶i gäi mét ph¬ng thøc ®Æc biÖt víi cin:
get().cin.get() cã 3 tham sè:
- §iÒn ®Çy buffer
- Sè ký tù tèi ®a nhËn vµo.
- §Þnh ra ranh giíi kÕt thóc nhËp vµo.
Ranh giíi mÆc ®Þ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: ";
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 Hµm Strcpy( ) vµ Strncpy( ).


C++ thõa hëng tõ C mét sè hµm , trong ®ã cã hai hµm nµy.

Trang 130
Tù häc C++ trong 21 ngµy.
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
Hµm Strcpy( ) cã hai tham sè lµ chuçi ®Ých vµ sau ®ã lµ chuçi nguån, nÕu
chuçi nguån lín h¬n chuçi ®Ých, Strcpy( ) sÏ ghi ®Ì lªn phÇn cuèi cña buffer.
§Ó chèng l¹i ®iÒu nµy, sö dông hµm Strncpy( ). Hµm nµy sÏ copy n ký tù, nã sÏ
copy tíi ký tù null ®Çu tiªn hoÆc tíi sè ký tù tèi ®a ®îc chØ râ trong chuçi
®Ý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;
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:

Trang 131
Tù häc C++ trong 21 ngµy.
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
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: {

Trang 132
Tù häc C++ trong 21 ngµy.
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:
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!)

Trang 133
Tù häc C++ trong 21 ngµy.
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: {
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;

Trang 134
Tù häc C++ trong 21 ngµy.
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õ dßng 7-- 31 khai b¸o líp mét string ®¬n gi¶n. C¸c dßng 11--13 cã 3 hµm
constructor : constructor mÆc ®Þnh, constructor copy, constructor lÊy ký tù kÕt
thóc chuçi null.

Trang 135

Você também pode gostar