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 2: 3: int main() 4: { 5: 6:
cout << "Hello World!\n"; 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·
Trang 3
Tù häc C++ trong 21 ngµy. 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. -
Include lµ mét lÖnh tiÒn xö lý. DÊu ngoÆc ®¬n 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
4:
int main()
Trang 4
Tù häc C++ trong 21 ngµy. 5:
{
6:
cout << "Hello there.\n";
7:
cout << "Here is 5: " << 5 << "\n";
8:
cout << "The manipulator endl writes a new line to the screen." << Âendl;
9:
cout << "Here is a very big number:\t" << 70000 << endl;
10:
cout << "Here is the sum of 8 and 5:\t" << 8+5 << endl;
11:
cout << "Here's a fraction:\t\t" << (float) 5/8 << endl;
12:
cout << "And a very very big number:\t" << (double) 7000 * 7000 << Âendl;
13:
cout << "Don't forget to replace Jesse Liberty with your name...\n";
14:
cout << "Jesse Liberty is a C++ programmer!\n";
15:
return 0;
16: } Hello there. Here is 5: 5 The manipulator endl writes a new line to the screen. Here is a very big number:
70000
Here is the sum of 8 and 5:
13
Here's a fraction:
0.625
And a very very big number:
4.9e+07
Don't forget to replace Jesse Liberty with your name... Jesse Liberty is a C++ programmer! Chó ý : 3 gi¸ trÞ ®îc ®a ra 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.
Trang 5
Tù häc C++ trong 21 ngµy.
?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. 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 2: 3: int main() 4: { 5: /* this is a comment 6: and it extends until the closing 7: star-slash comment mark */
Trang 6
Tù häc C++ trong 21 ngµy. 8: cout << "Hello World!\n"; 9: // this comment ends at the end of the line 10: cout << "That comment ended!\n"; 11: 12: // double slash comments can be alone on a line 13: /* as can slash-star comments */ 14:
return 0;
15: } Hello World! That comment ended! •
Chó 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" ************************************************************/
Trang 7
Tù häc C++ trong 21 ngµy. 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. 1:
#include
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" ).
Trang 8
Tù häc C++ trong 21 ngµy. 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: 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 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";
Trang 9
Tù häc C++ trong 21 ngµy. 12:
int a, b, c;
13:
cout << "Enter two numbers: ";
14:
cin >> a;
15:
cin >> b;
16:
cout << "\nCalling Add()\n";
17:
c=Add(a,b);
18:
cout << "\nBack in main().\n";
19:
cout << "c was set to " << c;
20:
cout << "\nExiting...\n\n";
21:
return 0;
22: } I'm in main()! Enter two numbers: 3 5 Calling Add() In Add(), received 3 and 5 Back in main(). c was set to 8 Exiting...
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Þ.
Trang 10
Tù häc C++ trong 21 ngµy. 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.
- 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 2: 3: int main() 4: { 5:
cout << "The size of an int is:\t\t"
<< sizeof(int)
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"
9:
cout << "The size of a float is:\t\t" << sizeof(float) << " bytes.\n";
<< sizeof(char) << " 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:
<< " bytes.\n";
2 bytes.
Trang 11
Tù häc C++ trong 21 ngµy. 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.
Type Unsigned short int Short int Unsigned long int Long int Int (16 bit) Int (32 bit) Unsigned int (16 bit) Unsigned int (32 bit) Char Float Double
Size 2 bytes 2 bytes 4 bytes 4 bytes 2 bytes 4 bytes 2 bytes 2 bytes 1 byte 4 bytes 8 bytes
Values 0 to 65,535 -32,768 to 32,767 0 to 4,294,967,295 -2,147,483,648 to 2,147,483,647 -32,768 to 32,767 -2,147,483,648 to 2,147,483,647 0 to 65,535 0 to 4,294,967,295 256 character values 1.2e-38 to 3.4e38 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
Trang 12
Tù häc C++ trong 21 ngµy. 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
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. Trang 13
Tù häc C++ trong 21 ngµy. 1: // Demonstration of variables 2: #include 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: 11:
// of multiplying Width by Length unsigned short int Area = Width * Length;
12: 13:
cout << "Width:" << Width << "\n";
14:
cout << "Length: " << Length << endl;
15:
cout << "Area: " << Area << endl;
16:
return 0;
17: } Output: Width:5 Length: 10 Area: 50
II.1.6 Typedef Ta cã thÓ 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
Trang 14
Tù häc C++ trong 21 ngµy. 3: #include 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.
Listing 3.4.A demonstration of putting too large a value in an unsigned integer. 1: #include 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
Trang 15
Tù häc C++ trong 21 ngµy. small number:0 small number:1
Listing 3.5. A demonstration of adding too large a number to a signed integer. 1: #include 2: int main() 3: { 4:
short int smallNumber;
5:
smallNumber = 32767;
6:
cout << "small number:" << smallNumber << endl;
7:
smallNumber++;
8:
cout << "small number:" << smallNumber << endl;
9:
smallNumber++;
10: cout << "small number:" << smallNumber << endl; 11:
return 0;
12: } Output: small number:32767 small number:-32768 small number:-32767
II.1.8 Characters 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 2: int main() 3: { 4: for (int i = 32; i<128; i++) 5:
cout << (char) i;
6:
return 0;
7: } Output: !"#$%G'()*+,./0123456789:;<>?@ABCDEFGHIJKLMNOP
Trang 16
Tù häc C++ trong 21 ngµy. _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 New line Tab Backspace Double quote Single quote Question mark Backslash
\n \t \b \" \' \? \\
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 :
Trang 17
Tù häc C++ trong 21 ngµy. 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 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.
Trang 18
Tù häc C++ trong 21 ngµy. 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 2: int main() 3: { 4:
enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday,
Â_Saturday }; 5: 6:
Days DayOff;
7:
int x;
8: 9:
cout << "What day would you like off (0-6)? ";
10:
cin >> x;
Trang 19
Tù häc C++ trong 21 ngµy. 11:
DayOff = Days(x);
12: 13:
if (DayOff == Sunday || DayOff == Saturday)
14: 15:
cout << "\nYou're already off on weekends!\n"; 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; 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.
Trang 20
Tù häc C++ trong 21 ngµy. 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 21
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 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 22
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 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
Trang 23
Tù häc C++ trong 21 ngµy. 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. -
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éngb»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 (%=).
Trang 24
Tù häc C++ trong 21 ngµy. 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: 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 5: int main() 6: { 7:
int myAge = 39;
// initialize two integers
Trang 25
Tù häc C++ trong 21 ngµy. 8:
int yourAge = 39;
9:
cout << "I am: " << myAge << " years old.\n";
10:
cout << "You are: " << yourAge << " years old\n";
11:
myAge++;
// postfix increment
12:
++yourAge;
// prefix increment
13:
cout << "One year passes...\n";
14:
cout << "I am: " << myAge << " years old.\n";
15:
cout << "You are: " << yourAge << " years old\n";
16:
cout << "Another year passes\n";
17:
cout << "I am: " << myAge++ << " years old.\n";
18:
cout << "You are: " << ++yourAge << " years old\n";
19:
cout << "Let's print it again.\n";
20:
cout << "I am: " << myAge << " years old.\n";
21:
cout << "You are: " << yourAge << " years old\n";
22:
return 0;
23: } Output: I am
39 years old
You are 39 years old One year passes I am
40 years old
You are 40 years old 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µ:
Trang 26
Tù häc C++ trong 21 ngµy. 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 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 Equals Not Equals
Operator Sample
Evaluates
==
100 == 50;
false
50 == 50;
true
100 != 50;
true
50 != 50;
false
!=
Trang 27
Tù häc C++ trong 21 ngµy. Greater Than Greater Than or Equals Less Than Less Than or Equals
> >= < <=
100 > 50;
true
50 > 50;
false
100 >= 50;
true
50 >= 50;
true
100 < 50;
false
50 < 50;
false
100 <= 50;
False
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"; }
Trang 28
Tù häc C++ trong 21 ngµy. 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 4: int main() 5: { 6:
int RedSoxScore, YankeesScore;
7:
cout << "Enter the score for the Red Sox: ";
8:
cin >> RedSoxScore;
9: 10:
cout << "\nEnter the score for the Yankees: ";
11:
cin >> YankeesScore;
12: 13:
cout << "\n";
14: 15:
if (RedSoxScore > YankeesScore)
16:
cout << "Go Sox!\n";
17: 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)
Trang 29
Tù häc C++ trong 21 ngµy. 34:
cout << "Knew it! Go Yanks!";
35: 36:
if (YankeesScore == RedSoxScore)
37:
cout << "Wow, it really was a tie!";
38:
}
39: 40:
cout << "\nThanks for telling me.\n";
41:
return 0;
42: } Output: Enter the score for the Red Sox: 10 Enter the score for the Yankees: 10 A tie? Naah, can't be Give me the real score for the Yanks: 8 Knew it! Go Sox! Thanks for telling me. 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
Trang 30
Tù häc C++ trong 21 ngµy. 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 3: #include 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: 13:
cout << "\nThanks!\n"; 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 ;
Trang 31
Tù häc C++ trong 21 ngµy. 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; 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ô :
Trang 32
Tù häc C++ trong 21 ngµy. Listing 4.6. A complex, nested if statement. 1: // Listing 4.5 - a complex nested 2: // if statement 3: #include 4: int main() 5: { 6:
// Ask for two numbers
7:
// Assign the numbers to bigNumber and littleNumber
8:
// If bigNumber is bigger than littleNumber,
9:
// see if they are evenly divisible
10:
// If they are, see if they are the same number
11: 12:
int firstNumber, secondNumber;
13:
cout << "Enter two numbers.\nFirst: ";
14:
cin >> firstNumber;
15:
cout << "\nSecond: ";
16:
cin >> secondNumber;
17:
cout << "\n\n";
18: 19:
if (firstNumber >= secondNumber)
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: }
Trang 33
Tù häc C++ trong 21 ngµy. 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. Operator
Symbo l
AND
&&
OR
||
NOT
!
Example expression1 expression1 !expression
&& ||
expression2 expression2
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)
Trang 34
Tù häc C++ trong 21 ngµy. 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 : if (!x) if (x == 0)
// if x is false (zero) // 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 4: int main() 5: { 6:
int x, y, z;
7:
cout << "Enter two numbers.\n";
8:
cout << "First: ";
Trang 35
Tù häc C++ trong 21 ngµy. 9:
cin >> x;
10:
cout << "\nSecond: ";
11:
cin >> y;
12:
cout << "\n";
13: 14:
if (x > y)
15:
z = x;
16:
else
17:
z = y;
18: 19:
cout << "z: " << z;
20:
cout << "\n";
21: 22:
z = (x > y) ? x : y;
23: 24:
cout << "z: " << z;
25:
cout << "\n";
26:
return 0;
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.
Trang 36
Tù häc C++ trong 21 ngµy. 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. 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 .
Trang 37
Tù häc C++ trong 21 ngµy. 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 5: USHORT FindArea(USHORT length, USHORT width); 6: 7: int main() 8: { 9:
USHORT lengthOfYard;
10: USHORT widthOfYard;
Trang 38
//function prototype
Tù häc C++ trong 21 ngµy. 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. 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] ] .....) ; {
Trang 39
Tù häc C++ trong 21 ngµy. 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) cout << "Hello.\n"; if (whichMsg == 1) cout << "Goodbye.\n"; if (whichMsg > 1)
Trang 40
Tù häc C++ trong 21 ngµy. 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
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: 17: float Convert(float TempFer) 18: { 19:
float TempCel;
20:
TempCel = ((TempFer - 32) * 5) / 9;
21:
return TempCel;
Trang 41
Tù häc C++ trong 21 ngµy. 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
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;
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++ )
Trang 42
Tù häc C++ trong 21 ngµy. 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 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: } Output: x from main: 5 y from main: 7
Trang 43
Tù häc C++ trong 21 ngµy. 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 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: 22:
int x = 8;
23:
cout << "\nIn myFunc, local x: " << x << endl;
24: 25: 26:
{ cout << "\nIn block in myFunc, x is: " << x;
Trang 44
Tù häc C++ trong 21 ngµy. 27: 28:
int x = 9;
29: 30: 31:
cout << "\nVery local x: " << x; }
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.
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.
Trang 45
Tù häc C++ trong 21 ngµy. 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 46
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
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: 15:
return 0; }
16: 17:
void swap (int x, int y)
18:
{
19:
int temp;
20: 21:
cout << "Swap. Before swap, x: " << x << " y: " << y << "\n";
22: 23:
temp = x;
24:
x = y;
25:
y = temp;
26: 27:
cout << "Swap. After swap, x: " << x << " y: " << y << "\n";
28: 29: }
Trang 47
Tù häc C++ trong 21 ngµy. 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
5: 6:
int Doubler(int AmountToDouble);
7: 8:
int main()
9:
{
10: 11:
int result = 0;
Trang 48
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: 34: 35:
else return -1; 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 49
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
Trang 50
Tù häc C++ trong 21 ngµy. 3: 4: #include 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
Trang 51
Tù häc C++ trong 21 ngµy. 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ô: 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 5: 6: int Double(int); 7: long Double(long); 8: float Double(float);
Trang 52
Tù häc C++ trong 21 ngµy. 9: double Double(double); 10: 11: int main() 12: { 13:
int
myInt = 6500;
14:
long
myLong = 65000;
15:
float
myFloat = 6.5F;
16:
double myDouble = 6.5e20;
17: 18:
int
doubledInt;
19:
long
doubledLong;
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";
Trang 53
Tù häc C++ trong 21 ngµy. 44: return 2 * original; 45: } 46: 47: long Double(long original) 48: { 49: cout << "In Double(long)\n"; 50: return 2 * original; 51: } 52: 53: float Double(float original) 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
Trang 54
Tù häc C++ trong 21 ngµy. 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 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 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:
Trang 55
Tù häc C++ trong 21 ngµy. 18: target = Double(target); 19: cout << "Target: " << target << endl; 20: 21: 22: target = Double(target); 23: cout << "Target: " << target << endl; 24:
return 0;
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.
Trang 56
Tù häc C++ trong 21 ngµy. 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. 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
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: 23:
cout << answer << " is the " << n << "th Fibonacci number\n"; return 0;
Trang 57
Tù häc C++ trong 21 ngµy. 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
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.
Trang 58
Tù häc C++ trong 21 ngµy. 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, 2byte 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. 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Ö
Trang 59
Tù häc C++ trong 21 ngµy. 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.1Khai 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; 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).
Trang 60
Tù häc C++ trong 21 ngµy. 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; Cat Frisky;
// define an unsigned integer // 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.3G¸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; Frisky.age = 5;
// just like int x; // just like x = 5;
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
Trang 61
Tù häc C++ trong 21 ngµy. 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 // for cout 5: 6: class Cat
// declare the class object
Trang 62
Tù häc C++ trong 21 ngµy. 7: { 8: public: 9:
int itsAge;
10:
int itsWeight;
// members which follow are public
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
Trang 63
Tù häc C++ trong 21 ngµy. 6: { 7: public: 8: 9:
// public accessors 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
Trang 64
Tù häc C++ trong 21 ngµy. 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¸ 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; int bought; OldFaithful.SetYear(84) ;
// make an instance of car // a local variable of type int // assign 84 to the year
Trang 65
Tù häc C++ trong 21 ngµy. bought = OldFaithful.GetYear(); OldFaithful.Start();
// set bought to 84
// call the start method
V.1.4.1C¸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
// for cout
5: 6: class Cat
// begin declaration of the class
7: { 8:
public:
// begin public section
9:
int GetAge();
10:
void SetAge (int age); // accessor function
11:
void Meow();
12: private: 13:
int itsAge;
// accessor function // general function // begin private section // 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
Trang 66
Tù häc C++ trong 21 ngµy. 29:
// value passed in by parameter age
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.
Trang 67
Tù häc C++ trong 21 ngµy. Cat () ; 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
// for cout
5: 6: class Cat
// begin declaration of the class
7: { 8: public:
// begin public section
9:
Cat(int initialAge);
10:
~Cat();
11:
int GetAge();
12:
void SetAge(int age);
13:
void Meow();
14: private: 15:
// constructor
// destructor // accessor function // accessor function
// begin private section
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: {
Trang 68
Tù häc C++ trong 21 ngµy. 26: } 27: 28: // GetAge, Public accessor function 29: // returns value of itsAge member 30: int Cat::GetAge() 31: { 32:
return itsAge;
33: } 34: 35: // Definition of SetAge, public 36: // accessor function 37: 38: void Cat::SetAge(int age) 39: { 40:
// set member variable its age to
41:
// value passed in by parameter age
42:
itsAge = age;
43: } 44: 45: // definition of Meow method 46: // returns: void 47: // parameters: None 48: // action: Prints "meow" to screen 49: void Cat::Meow() 50: { 51:
cout << "Meow.\n";
52: } 53: 54: // create a cat, set its age, have it 55 // meow, tell us its age, then meow again. 56: int main() 57: { 58: Cat Frisky(5); 59: Frisky.Meow(); 60: cout << "Frisky is a cat who is " ;
Trang 69
Tù häc C++ trong 21 ngµy. 61: cout << Frisky.GetAge() << " years old.\n"; 62: Frisky.Meow(); 63: Frisky.SetAge(7); 64: cout << "Now Frisky is " ; 65: cout << Frisky.GetAge() << " years old.\n"; 66;
return 0;
67: } Output: Meow. Frisky is a cat who is 5 years old. Meow. Now Frisky is 7 years old. Chó ý : 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.1C¸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 ;
Trang 70
Tù häc C++ trong 21 ngµy. 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. 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.1Bæ 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
Trang 71
Tù häc C++ trong 21 ngµy. { public: int GetWeight() { return itsWeight; }
// inline
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 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;} 9: void Meow() { cout << "Meow.\n";}
// inline! // 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
Trang 72
Tù häc C++ trong 21 ngµy. 13: { 14: } 15: 16: // Create a cat, set its age, have it 17: // meow, tell us its age, then meow again. 18: int main() 19: { 20:
Cat Frisky(5);
21:
Frisky.Meow();
22:
cout << "Frisky is a cat who is " ;
23:
cout << Frisky.GetAge() << " years old.\n";
24:
Frisky.Meow();
25:
Frisky.SetAge(7);
26:
cout << "Now Frisky is " ;
27:
cout << Frisky.GetAge() << " years old.\n";
28:
return 0;
29: } Output: Meow. Frisky is a cat who is 5 years old. Meow. Now Frisky is 7 years old. Trong vÝ dô 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
Trang 73
Tù häc C++ trong 21 ngµy. 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 3: class Point
// holds x,y coordinates
4: { 5:
// no constructor, use default
6:
public:
7:
void SetX(int x) { itsX = x; }
8:
void SetY(int y) { itsY = y; }
9:
int GetX()const { return itsX;}
10:
int GetY()const { return itsY;}
11:
private:
12:
int itsX;
13:
int itsY;
14: }; // end of Point class declaration 15: 16: 17: class Rectangle 18: { 19:
public:
20:
Rectangle (int top, int left, int bottom, int right);
21:
~Rectangle () {}
22: 23:
int GetTop() const { return itsTop; }
24:
int GetLeft() const { return itsLeft; }
25:
int GetBottom() const { return itsBottom; }
26:
int GetRight() const { return itsRight; }
27: 28:
Point GetUpperLeft() const { return itsUpperLeft; }
29:
Point GetLowerLeft() const { return itsLowerLeft; }
30:
Point GetUpperRight() const { return itsUpperRight; }
31:
Point GetLowerRight() const { return itsLowerRight; }
32:
Trang 74
Tù häc C++ trong 21 ngµy. 33:
void SetUpperLeft(Point Location) {itsUpperLeft = Location;}
34:
void SetLowerLeft(Point Location) {itsLowerLeft = Location;}
35:
void SetUpperRight(Point Location) {itsUpperRight = Location;}
36:
void SetLowerRight(Point Location) {itsLowerRight = Location;}
37: 38:
void SetTop(int top) { itsTop = top; }
39:
void SetLeft (int left) { itsLeft = left; }
40:
void SetBottom (int bottom) { itsBottom = bottom; }
41:
void SetRight (int right) { itsRight = right; }
42: 43:
int GetArea() const;
44: 45:
private:
46:
Point itsUpperLeft;
47:
Point itsUpperRight;
48:
Point itsLowerLeft;
49:
Point itsLowerRight;
50:
int
itsTop;
51:
int
itsLeft;
52:
int
itsBottom;
53:
int
itsRight;
54: }; 55: // end Rect.hpp
Listing 6.9. RECT.CPP. 1: // Begin rect.cpp 2: #include "rect.hpp" 3: Rectangle::Rectangle(int top, int left, int bottom, int right) 4: { 5:
itsTop = top;
6:
itsLeft = left;
7:
itsBottom = bottom;
8:
itsRight = right;
9: 10:
itsUpperLeft.SetX(left);
11:
itsUpperLeft.SetY(top);
Trang 75
Tù häc C++ trong 21 ngµy. 12: 13:
itsUpperRight.SetX(right);
14:
itsUpperRight.SetY(top);
15: 16:
itsLowerLeft.SetX(left);
17:
itsLowerLeft.SetY(bottom);
18: 19:
itsLowerRight.SetX(right);
20:
itsLowerRight.SetY(bottom);
21: } 22: 23: 24: // compute area of the rectangle by finding corners, 25: // establish width and height and then multiply 26: int Rectangle::GetArea() const 27: { 28:
int Width = itsRight-itsLeft;
29:
int Height = itsTop - itsBottom;
30:
return (Width * Height);
31: } 32: 33: int main() 34: { 35:
//initialize a local Rectangle variable
36:
Rectangle MyRectangle (100, 20, 50, 80 );
37: 38:
int Area = MyRectangle.GetArea();
39: 40:
cout << "Area: " << Area << "\n";
41:
cout << "Upper Left X Coordinate: ";
42:
cout << MyRectangle.GetUpperLeft().GetX();
43:
return 0;
44: } Output: Area: 3000 Upper Left X Coordinate: 20
Trang 76
Tù häc C++ trong 21 ngµy. 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 :
- 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 5: 6: int main() 7: { 8:
int counter = 0;
9: loop: counter ++;
// initialize counter // top of the loop
10:
cout << "counter: " << counter << "\n";
11:
if (counter < 5)
12:
goto loop;
// test the value // jump to the top
13:
Trang 77
Tù häc C++ trong 21 ngµy. 14:
cout << "Complete. Counter: " << counter << ".\n";
15:
return 0;
16: } Output: counter: 1 counter: 2 counter: 3 counter: 4 counter: 5 Complete. Counter: 5.
VI.1.1 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 5:
Trang 78
Tù häc C++ trong 21 ngµy. 6: int main() 7: { 8:
int counter = 0;
// initialize the condition
9: 10:
while(counter < 5)
11:
{
// test condition still true
12:
counter++;
13:
cout << "counter: " << counter << "\n";
14:
// body of the loop
}
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++;
Trang 79
Tù häc C++ trong 21 ngµy. 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 5: 6: int main() 7: { 8:
unsigned short small;
9:
unsigned long large;
10:
const unsigned short MAXSMALL=65535;
11: 12:
cout << "Enter a small number: ";
13:
cin >> small;
14:
cout << "Enter a large number: ";
15:
cin >> large;
16: 17:
cout << "small: " << small << "...";
18: 19:
// for each iteration, test three conditions
20:
while (small < large && large > 0 && small < MAXSMALL)
21: 22:
{
23:
if (small % 5000 == 0) // write a dot every 5k lines
24:
cout << ".";
25: 26:
small++;
27: 28: 29:
large-=2; }
30: 31:
cout << "\nSmall: " << small << " Large: " << large << endl;
Trang 80
Tù häc C++ trong 21 ngµy. 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. VÝ dô:
Listing 7.4. break and continue. 1: // Listing 7.4 2: // Demonstrates break and continue 3: 4: #include 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:
Trang 81
Tù häc C++ trong 21 ngµy. 25:
// set up 3 stop conditions for the loop
26:
while (small < large && large > 0 && small < 65535)
27: 28:
{
29: 30:
small++;
31: 32:
if (small % skip == 0) // skip the decrement?
33:
{
34:
cout << "skipping on " << small << endl;
35:
continue;
36:
}
37: 38:
if (large == target)
39:
{
// exact match for the target?
40:
cout << "Target reached!";
41:
break;
42:
}
43: 44: 45:
large-=2; }
// 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ô:
Trang 82
Tù häc C++ trong 21 ngµy. if (value > 10) goto end; if (value < 10) goto end; cout << "value is 10!"; end: cout << "done"; 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 5: 6: int main() 7: { 8:
int counter = 0;
9: 10:
while (1)
11:
{
12:
counter ++;
13:
if (counter > 10)
14: 15:
break; }
Trang 83
Tù häc C++ trong 21 ngµy. 16:
cout << "Counter: " << counter << "\n";
17:
return 0;
18: Output: Counter: 11
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
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
Trang 84
Tù häc C++ trong 21 ngµy. 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 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
Trang 85
Tù häc C++ trong 21 ngµy. 5: 6: int main() 7: { 8:
int counter = 0;
9: 10:
while(counter < 5)
11:
{
12:
counter++;
13:
cout << "Looping! ";
14:
}
15: 16:
cout << "\nCounter: " << counter << ".\n";
17:
return 0;
18: } Output: Looping! Looping! Looping! Looping! Looping! Counter: 5. VÝ dô vÒ vßng lÆp for:
Listing 7.9. Demonstrating the for loop. 1:
// Listing 7.9
2:
// Looping with for
3: 4:
#include
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.
Trang 86
Tù häc C++ trong 21 ngµy. 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++) 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 6: 7: int main() 8: {
Trang 87
Tù häc C++ trong 21 ngµy. 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: 1: // Listing 7.11 2: // For loops with null statements 3: 4: #include 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
Trang 88
Tù häc C++ trong 21 ngµy. 3: 4:
#include
5: 6:
int main()
7:
{
8:
int counter=0;
9:
int max;
// initialization
10:
cout << "How many hellos?";
11:
cin >> max;
12:
for (;;)
13:
{
// a for loop that doesn't end
14:
if (counter < max)
15:
{
// test
16:
cout << "Hello!\n";
17:
counter++;
18:
}
19:
else
20:
// increment
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
Trang 89
Tù häc C++ trong 21 ngµy. 3: 4: #include 5: 6: int main() 7: { 8:
int rows, columns;
9:
char theChar;
10:
cout << "How many rows? ";
11:
cin >> rows;
12:
cout << "How many columns? ";
13:
cin >> columns;
14:
cout << "What character? ";
15:
cin >> theChar;
16:
for (int i = 0; i
17:
{
18:
for (int j = 0; 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
Trang 90
Tù häc C++ trong 21 ngµy. 2: // Demonstrates solving the nth 3: // Fibonacci number using iteration 4: 5: #include 6: 7: typedef unsigned long int ULONG; 8: 9: ULONG fib(ULONG position); 10: int main() 11: { 12:
ULONG answer, position;
13:
cout << "Which position? ";
14:
cin >> position;
15:
cout << "\n";
16: 17:
answer = fib(position);
18:
cout << answer << " is the ";
19:
cout << position << "th Fibonacci number.\n";
20:
return 0;
21: } 22: 23: ULONG fib(ULONG n) 24: { 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:
Trang 91
Tù häc C++ trong 21 ngµy. 37:
return answer;
38: } Output: Which position? 4 3 is the 4th Fibonacci number. Which position? 5 5 is the 5th Fibonacci number. Which position? 20 6765 is the 20th Fibonacci number. Which position? 100 3314859971 is the 100th Fibonacci number.
VI.7 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. Trang 92
Tù häc C++ trong 21 ngµy. 1: //Listing 7.16 2: // Demonstrates switch statement 3: 4: #include 5: 6: int main() 7: { 8: unsigned short int number; 9: cout << "Enter a number between 1 and 5: "; 10: cin >> number; 11: switch (number) 12: { 13:
case 0: cout << "Too small, sorry!";
14:
break;
15:
case 5: cout << "Good job!\n"; // fall through
16:
case 4: cout << "Nice Pick!\n"; // fall through
17:
case 3: cout << "Excellent!\n"; // fall through
18:
case 2: cout << "Masterful!\n"; // fall through
19:
case 1: cout << "Incredible!\n";
20:
break;
21:
default: cout << "Too large!\n";
22:
break;
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.
Trang 93
Tù häc C++ trong 21 ngµy. switch (choice) { case 0: cout << "Zero!" << endl; break case 1: cout << "One!" << endl; break; case 2: cout << "Two!" << endl; default: cout << "Default!" << endl; }
Example 2 switch (choice) { choice 0: choice 1: choice 2: cout << "Less than 3!"; break; 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 5:
Trang 94
Tù häc C++ trong 21 ngµy. 6: // types & defines 7: enum BOOL { FALSE, TRUE }; 8: typedef unsigned short int USHORT; 9: 10: // prototypes 11: USHORT menu(); 12: void DoTaskOne(); 13: void DoTaskMany(USHORT); 14: 15: int main() 16: { 17: 18:
BOOL exit = FALSE;
19:
for (;;)
20:
{
21:
USHORT choice = menu();
22:
switch(choice)
23:
{
24:
case (1):
25:
DoTaskOne();
26:
break;
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: 40:
default: cout << "Please select again!\n";
Trang 95
Tù häc C++ trong 21 ngµy. 41:
break;
42:
}
// end switch
43: 44:
if (exit)
45:
break;
46:
}
// end forever
47:
return 0;
48: }
// end main()
49: 50: USHORT menu() 51: { 52:
USHORT choice;
53: 54:
cout << " **** Menu ****\n\n";
55:
cout << "(1) Choice one.\n";
56:
cout << "(2) Choice two.\n";
57:
cout << "(3) Choice three.\n";
58:
cout << "(4) Redisplay menu.\n";
59:
cout << "(5) Quit.\n\n";
60:
cout << ": ";
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: 73: 74: 75:
if (which == 2) cout << "Task Two!\n"; else cout << "Task Three!\n";
Trang 96
Tù häc C++ trong 21 ngµy. 76: } Output: **** Menu **** (1) Choice one. (2) Choice two. (3) Choice three. (4) Redisplay menu. (5) Quit. :1 Task One! **** Menu **** (1) Choice one. (2) Choice two. (3) Choice three. (4) Redisplay menu. (5) Quit. :3 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 2: 3: typedef unsigned short int USHORT; 4: typedef unsigned long int ULONG;
Trang 97
Tù häc C++ trong 21 ngµy. 5: enum BOOL { FALSE, TRUE}; 6: enum CHOICE { DrawRect = 1, GetArea, 7:
GetPerim, ChangeDimensions, Quit};
8: // Rectangle class declaration 9: class Rectangle 10: { 11: public: 12:
// constructors
13:
Rectangle(USHORT width, USHORT height);
14:
~Rectangle();
15: 16:
// accessors
17:
USHORT GetHeight() const { return itsHeight; }
18:
USHORT GetWidth() const { return itsWidth; }
19:
ULONG GetArea() const { return itsHeight * itsWidth; }
20:
ULONG GetPerim() const { return 2*itsHeight + 2*itsWidth; }
21:
void SetSize(USHORT newWidth, USHORT newHeight);
22: 23:
// Misc. methods
24:
void DrawShape() const;
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)
Trang 98
Tù häc C++ trong 21 ngµy. 40: { 41: itsWidth = width; 42: itsHeight = height; 43: } 44: 45: Rectangle::~Rectangle() {} 46: 47: USHORT DoMenu(); 48: void DoDrawRect(Rectangle); 49: void DoGetArea(Rectangle); 50: void DoGetPerim(Rectangle); 51: 52: void main () 53: { 54: // initialize a rectangle to 10,20 55: Rectangle theRect(30,5); 56: 57: USHORT choice = DrawRect; 58: USHORT fQuit = FALSE; 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: 74:
case GetArea: DoGetArea(theRect);
Trang 99
Tù häc C++ trong 21 ngµy. 75: 76:
break; case GetPerim:
77:
DoGetPerim(theRect);
78:
break;
79:
case ChangeDimensions:
80:
USHORT newLength, newWidth;
81:
cout << "\nNew width: ";
82:
cin >> newWidth;
83:
cout << "New height: ";
84:
cin >> newLength;
85:
theRect.SetSize(newWidth, newLength);
86:
DoDrawRect(theRect);
87:
break;
88:
case Quit:
89:
fQuit = TRUE;
90:
cout << "\nExiting...\n\n";
91:
break;
92:
default:
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";
Trang 100
Tù häc C++ trong 21 ngµy. 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
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
Trang 101
Tù häc C++ trong 21 ngµy. ****************************** ****************************** ****************************** ****************************** ****************************** *** Menu *** (1) Draw Rectangle (2) Area (3) Perimeter (4) Resize (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 **********
Trang 102
Tù häc C++ trong 21 ngµy. ********** ********** ********** ********** ********** ********** ********** *** Menu *** (1) Draw Rectangle (2) Area (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...
Trang 103
Tù häc C++ trong 21 ngµy.
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: 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; unsigned short int * pAge = 0; pAge = &howOld;
// make a variable // make a pointer
// 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:
Trang 104
Tù häc C++ trong 21 ngµy. 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. 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:
Trang 105
Tù häc C++ trong 21 ngµy. 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
4: 5:
typedef unsigned short int USHORT;
6:
int main()
7:
{
8:
USHORT myAge;
// a variable
9:
USHORT * pAge = 0; // a pointer
10:
myAge = 5;
11:
cout << "myAge: " << myAge << "\n";
12: 13:
pAge = &myAge;
// assign address of myAge to pAge
14: 15:
cout << "*pAge: " << *pAge << "\n\n";
16: 17:
cout << "*pAge = 7\n";
18: 19:
*pAge = 7;
// sets myAge to 7
20: 21:
cout << "*pAge: " << *pAge << "\n";
22:
cout << "myAge: " << myAge << "\n\n";
23: 24: 25:
cout << "myAge = 9\n";
Trang 106
Tù häc C++ trong 21 ngµy. 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 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
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";
Trang 107
Tù häc C++ trong 21 ngµy. 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: &myAge:
0x355C
pAge:
0x355C
*pAge:
5
myAge:
5
&myAge:
5
yourAge: 10 &yourAge: 0x355E
yourAge: 10 0x355C
pAge:
0x355E
*pAge:
10
&pAge:
0x355A
&yourAge: 0x355E
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.
Trang 108
Tù häc C++ trong 21 ngµy. 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 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 ".
Trang 109
Tù häc C++ trong 21 ngµy. 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
5:
int main()
6:
{
7:
int localVariable = 5;
8:
int * pLocal= &localVariable;
9:
int * pHeap = new int;
10:
if (pHeap == NULL)
11:
{
12:
cout << "Error! No memory for pHeap!!";
13:
return 0;
14:
}
15:
*pHeap = 7;
16:
cout << "localVariable: " << localVariable << "\n";
17:
cout << "*pLocal: " << *pLocal << "\n";
18:
cout << "*pHeap: " << *pHeap << "\n";
19:
delete pHeap;
20:
pHeap = new int;
21:
if (pHeap == NULL)
22:
{
23:
cout << "Error! No memory for pHeap!!";
24:
return 0;
25:
}
26:
*pHeap = 9;
27:
cout << "*pHeap: " << *pHeap << "\n";
Trang 110
Tù häc C++ trong 21 ngµy. 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
5: 6:
class SimpleCat
7:
{
8:
public:
9:
SimpleCat();
10: 11
~SimpleCat(); private:
12 13
int itsAge; };
14 15
SimpleCat::SimpleCat()
16
{
17
cout << "Constructor called.\n";
18
itsAge = 1;
19
}
20
Trang 111
Tù häc C++ trong 21 ngµy. 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... 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
Trang 112
Tù häc C++ trong 21 ngµy. 3: 4:
#include
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: 15:
int itsAge; };
16: 17:
int main()
18:
{
19:
SimpleCat * Frisky = new SimpleCat;
20:
cout << "Frisky is " << Frisky->GetAge() << " years old\n";
21:
Frisky->SetAge(5);
22:
cout << "Frisky is " << Frisky->GetAge() << " years old\n";
23:
delete Frisky;
24:
return 0;
25: } Output: Frisky is 2 years old Frisky is 5 years old
Listing 8.7. Pointers as member data. 1: // Listing 8.7 2: // Pointers as data members 3: 4: #include 5: 6: class SimpleCat 7: { 8: public:
Trang 113
Tù häc C++ trong 21 ngµy. 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:
}
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: }
Trang 114
Tù häc C++ trong 21 ngµy. 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
5: 6:
class Rectangle
7:
{
8:
public:
9:
Rectangle();
10:
~Rectangle();
11:
void SetLength(int length) { this->itsLength = length; }
12:
int GetLength() const { return this->itsLength; }
13: 14:
void SetWidth(int width) { itsWidth = width; }
15:
int GetWidth() const { return itsWidth; }
16: 17:
private:
18:
int itsLength;
19:
int itsWidth;
20:
};
21: 22:
Rectangle::Rectangle()
23:
{
24:
itsWidth = 5;
25:
itsLength = 10;
26:
}
27:
Rectangle::~Rectangle()
Trang 115
Tù häc C++ trong 21 ngµy. 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; 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
Trang 116
Tù häc C++ trong 21 ngµy. 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
5: 6:
class Rectangle
7:
{
8:
public:
9:
Rectangle();
10:
~Rectangle();
11:
void SetLength(int length) { itsLength = length; }
12:
int GetLength() const { return itsLength; }
13: 14:
void SetWidth(int width) { itsWidth = width; }
15:
int GetWidth() const { return itsWidth; }
16: 17:
private:
18:
int itsLength;
19:
int itsWidth;
20:
};
21: 22:
Rectangle::Rectangle():
23:
itsWidth(5),
24:
itsLength(10)
25:
{}
26: 27:
Rectangle::~Rectangle()
28:
{}
29: 30:
int main()
31:
{
32:
Rectangle* pRect = new Rectangle;
Trang 117
Tù häc C++ trong 21 ngµy. 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
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.
Trang 118
Tù häc C++ trong 21 ngµy. §Ó 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. 1: //Listing 9.1 2: // Demonstrating the use of References 3: 4: #include 5: 6: int main() 7: { 8:
int intOne;
Trang 119
Tù häc C++ trong 21 ngµy. 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 3: 4: #include 5: 6: int main() 7: { 8:
int intOne;
9:
int &rSomeRef = intOne;
10: 11:
intOne = 5;
12:
cout << "intOne: " << intOne << endl;
Trang 120
Tù häc C++ trong 21 ngµy. 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
5: 6:
int main()
7:
{
8:
int intOne;
9:
int &rSomeRef = intOne;
10: 11:
intOne = 5;
12:
cout << "intOne:\t" << intOne << endl;
13:
cout << "rSomeRef:\t" << rSomeRef << endl;
14:
cout << "&intOne:\t" << &intOne << endl;
15:
cout << "&rSomeRef:\t" << &rSomeRef << endl;
16: 17:
int intTwo = 8;
18:
rSomeRef = intTwo; // not what you think!
19:
cout << "\nintOne:\t" << intOne << endl;
20:
cout << "intTwo:\t" << intTwo << endl;
21:
cout << "rSomeRef:\t" << rSomeRef << endl;
22:
cout << "&intOne:\t" << &intOne << endl;
Trang 121
Tù häc C++ trong 21 ngµy. 23:
cout << "&intTwo:\t" << &intTwo << endl;
24:
cout << "&rSomeRef:\t" << &rSomeRef << endl;
25:
return 0;
26: } Output: intOne: rSomeRef:
5 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.
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 ;
Trang 122
Tù häc C++ trong 21 ngµy. 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 5: 6: class SimpleCat 7: { 8:
public:
9:
SimpleCat (int age, int weight);
10:
~SimpleCat() {}
11:
int GetAge() { return itsAge; }
12:
int GetWeight() { return itsWeight; }
13:
private:
14:
int itsAge;
15:
int itsWeight;
16: }; 17: 18: SimpleCat::SimpleCat(int age, int weight) 19: { 20:
itsAge = age;
21:
itsWeight = weight;
22: } 23: 24: int main() 25: { 26:
SimpleCat Frisky(5,8);
27:
SimpleCat & rCat = Frisky;
28: 29:
cout << "Frisky is: ";
30:
cout << Frisky.GetAge() << " years old. \n";
31:
cout << "And Frisky weighs: ";
32:
cout << rCat.GetWeight() << " pounds. \n";
Trang 123
Tù häc C++ trong 21 ngµy. 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
4: 5:
void swap(int *x, int *y);
6: 7:
int main()
8:
{
9:
int x = 5, y = 10;
10: 11:
cout << "Main. Before swap, x: " << x << " y: " << y << "\n";
12:
swap(&x,&y);
13:
cout << "Main. After swap, x: " << x << " y: " << y << "\n";
14:
return 0;
15:
}
16 17:
void swap (int *px, int *py)
18:
{
19:
int temp;
Trang 124
Tù häc C++ trong 21 ngµy. 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
5: 6:
void swap(int &x, int &y);
7: 8:
int main()
9:
{
10:
int x = 5, y = 10;
11: 12:
cout << "Main. Before swap, x: " << x << " y: " << y << "\n";
13:
swap(x,y);
14:
cout << "Main. After swap, x: " << x << " y: " << y << "\n";
15:
return 0;
16:
}
17: 18:
void swap (int &rx, int &ry)
19:
{
Trang 125
Tù häc C++ trong 21 ngµy. 20:
int temp;
21: 22:
cout << "Swap. Before swap, rx: " << rx << " ry: " << ry << "\n";
23: 24:
temp = rx;
25:
rx = ry;
26:
ry = temp;
27: 28:
cout << "Swap. After swap, rx: " << rx << " ry: " << ry << "\n";
29: 30: } Output: Main. Before swap, x:5 y: 10 Swap. Before swap, rx:5 ry:10 Swap. After swap, rx:10 ry:5 Main. After swap, x:10, y:5
Listing 9.8. Returning values with pointers. 1:
//Listing 9.8
2:
// Returning multiple values from a function
3: 4:
#include
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);
Trang 126
Tù häc C++ trong 21 ngµy. 19: 20:
if (!error)
21:
{
22:
cout << "number: " << number << "\n";
23:
cout << "square: " << squared << "\n";
24:
cout << "cubed: " << cubed << "\n";
25:
}
26:
else
27:
cout << "Error encountered!!\n";
28:
return 0;
29: } 30: 31: short Factor(USHORT n, USHORT *pSquared, USHORT *pCubed) 32: { 33: short Value = 0; 34:
if (n > 20)
35:
Value = 1;
36:
else
37:
{
38:
*pSquared = n*n;
39:
*pCubed = n*n*n;
40:
Value = 0;
41:
}
42:
return Value;
43: } Output: Enter a number (0-20): 3 number: 3 square: 9 cubed: 27
X
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. Trang 127
Tù häc C++ trong 21 ngµy. 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 3: 4: int main() 5: { 6: int myArray[5]; 7: int i; 8: for ( i=0; i<5; i++) // 0-4 9: { 10: cout << "Value for myArray[" << i << "]: "; 11: cin >> myArray[i]; 12: } 13: for (i = 0; i<5; i++) 14: cout << i << ": " << myArray[i] << "\n"; 15: return 0; 16: } Output: Value for myArray[0]: 3 Value for myArray[1]: 6 Value for myArray[2]: 9 Value for myArray[3]: 12 Value for myArray[4]: 15 0: 3 1: 6 2: 9 3: 12 4: 15
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} ; Trang 128
Tù häc C++ trong 21 ngµy. 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 5: int main() 6: { 7: enum WeekDays { Sun, Mon, Tue, 8: Wed, Thu, Fri, Sat, DaysInWeek }; 9: int ArrayWeek[DaysInWeek] = { 10, 20, 30, 40, 50, 60, 70 }; 10: 11: cout << "The value at Tuesday is: " << ArrayWeek[Tue]; 12: return 0; 13: } Output: The value at Tuesday is: 30
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ô: Trang 129
Tù häc C++ trong 21 ngµy. Listing 11.4. Creating an array of objects. 1: // Listing 11.4 - An array of objects 2: 3: #include 4: 5: class CAT 6: { 7: public: 8: CAT() { itsAge = 1; itsWeight=5; } 9: ~CAT() {} 10: int GetAge() const { return itsAge; } 11: int GetWeight() const { return itsWeight; } 12: void SetAge(int age) { itsAge = age; } 13: 14: private: 15: int itsAge; 16: int itsWeight; 17: }; 18: 19: int main() 20: { 21: CAT Litter[5]; 22: int i; 23: for (i = 0; i < 5; i++) 24: Litter[i].SetAge(2*i +1); 25: 26: for (i = 0; i < 5; i++) 27: { 28: cout << "Cat #" << i+1<< ": "; 29: cout << Litter[i].GetAge() << endl; 30: } 31: return 0; 32: } Output: cat #1: 1 cat #2: 3 cat #3: 5 cat #4: 7 cat #5: 9
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:
Trang 130
Tù häc C++ trong 21 ngµy. 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: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
// Listing 11.6 - An array of pointers to objects #include class CAT { public: CAT() { itsAge = 1; itsWeight=5; } ~CAT() {} // destructor int GetAge() const { return itsAge; } int GetWeight() const { return itsWeight; } void SetAge(int age) { itsAge = age; } private: int itsAge; int itsWeight; }; int main() { CAT * Family[500]; int i; CAT * pCat; for (i = 0; i < 500; i++) { pCat = new CAT; pCat->SetAge(2*i +1); Family[i] = pCat; } for (i = 0; i < 500; i++) { cout << "Cat #" << i+1 << ": "; cout << Family[i]->GetAge() << endl;
Trang 131
Tù häc C++ trong 21 ngµy. 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. 1: Cat Fone[500] ; 2: Cat *Ftwo[500] ; 3: Cat *Fthree = new Cat[500] ; FOne lµ mét m¶ng 500 Cat. Trang 132
Tù häc C++ trong 21 ngµy. 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: 2: 3: 4: 5: 6:
//Listing 11.8 char array buffers #include int main() {
Trang 133
Tù häc C++ trong 21 ngµy. 7: 8: 9: 10: 11: 12:
char buffer[80]; cout << "Enter the string: "; cin >> buffer; cout << "Here's the buffer: " << buffer << endl; return 0; }
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 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 134
Tù häc C++ trong 21 ngµy. Listing 11.10. Using strcpy(). 1: #include 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 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: 2: 3:
//Listing 11.12 #include
Trang 135
Tù häc C++ trong 21 ngµy. 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55:
#include <string.h> // Rudimentary string class class String { public: // constructors String(); String(const char *const); String(const String &); ~String(); // overloaded operators char & operator[](unsigned short offset); char operator[](unsigned short offset) const; String operator+(const String&); void operator+=(const String&); String & operator= (const String &); // General accessors unsigned short GetLen()const { return itsLen; } const char * GetString() const { return itsString; } private: String (unsigned short); char * itsString; unsigned short itsLen; };
// private constructor
// default constructor creates string of 0 bytes String::String() { itsString = new char[1]; itsString[0] = `\0'; itsLen=0; } // private (helper) constructor, used only by // class methods for creating a new string of // required size. Null filled. String::String(unsigned short len) { itsString = new char[len+1]; for (unsigned short i = 0; i<=len; i++) itsString[i] = `\0'; itsLen=len; } // Converts a character array to a String String::String(const char * const cString) { itsLen = strlen(cString);
Trang 136
Tù häc C++ trong 21 ngµy. 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107:
itsString = new char[itsLen+1]; for (unsigned short i = 0; i itsLen) return itsString[itsLen-1]; else return itsString[offset]; } // constant offset operator for use // on const objects (see copy constructor!) char String::operator[](unsigned short offset) const
Trang 137
Tù häc C++ trong 21 ngµy. 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159:
{ if (offset > itsLen) return itsString[itsLen-1]; else return itsString[offset]; } // creates a new string by adding current // string to rhs String String::operator+(const String& rhs) { unsigned short totalLen = itsLen + rhs.GetLen(); String temp(totalLen); for (unsigned short i = 0; i
Trang 138
Tù häc C++ trong 21 ngµy. 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173:
cout << "S1:\t" << s1.GetString() << endl; cout << "S1[999]:\t" << s1[999] << endl; String s2(" Another string"); String s3; s3 = s1+s2; cout << "S3:\t" << s3.GetString() << endl; String s4; s4 = "Why does this work?"; cout << "S4:\t" << s4.GetString() << endl; return 0; }
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 139