版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第六章 數(shù)組 指針與字符串目錄6.1 數(shù)組6.2 指針6.3 動態(tài)內(nèi)存分配6.4 用vector創(chuàng)建數(shù)組對象6.5 深拷貝與淺拷貝6.6 字符串6.7 綜合實(shí)例個人銀行賬戶管理程序6.8 深度探索6.9 小結(jié)2數(shù)組的概念數(shù)組是具有一定順序關(guān)系的若干相同類型變量的集合體,組成數(shù)組的變量稱為該數(shù)組的元素。數(shù)組屬于構(gòu)造類型。36.1 數(shù)組6.1.1 數(shù)組的聲明與使用數(shù)組的聲明46.1 數(shù)組類型說明符 數(shù)組名 常量表達(dá)式 常量表達(dá)式 ;數(shù)組名的構(gòu)成方法與一般變量名相同。例如:int a10; 表示a為整型數(shù)組,有10個元素:a0.a9例如: int a53;表示a為整型二維數(shù)組,其中第一維有5個下標(biāo)(
2、04),第二維有3個下標(biāo)(02),數(shù)組的元素個數(shù)為15,可以用于存放5行3列的整型數(shù)據(jù)表格。6.1.1 數(shù)組的聲明與使用(續(xù))引用必須先聲明,后使用。只能逐個引用數(shù)組元素,而不能一次引用整個數(shù)組例如:a0=a5+a7-a2*3例如:b12=a23/256.1 數(shù)組66.1 數(shù)組 6.1.1 數(shù)組的聲明與使用例6-1#include using namespace std;int main() int a10, b10; for(int i = 0; i 10; i+) ai = i * 2 - 1; b10 - i - 1 = ai; for(int i = 0; i 10; i+) cout
3、 a i = ai ; cout b I = bi endl; return 0;76.1 數(shù)組6.1.2 數(shù)組的存儲與初始化一維數(shù)組的存儲數(shù)組元素在內(nèi)存中順次存放,它們的地址是連續(xù)的。例如:a0a1a2a3a4a5a6a7a8a9a數(shù)組名字是數(shù)組首元素的內(nèi)存地址。數(shù)組名是一個常量,不能被賦值。86.1 數(shù)組6.1.2 數(shù)組的存儲與初始化(續(xù))一維數(shù)組的初始化可以在定義數(shù)組的同時賦給初值:在聲明數(shù)組時對數(shù)組元素賦以初值。例如:static int a10=0,1,2,3,4,5,6,7,8,9;可以只給一部分元素賦初值。例如:static int a10=0,1,2,3,4;在對全部數(shù)組元素賦
4、初值時,可以不指定數(shù)組長度。例如:static int a=0,1,2,3,4,5,6,7,8,996.1 數(shù)組6.1.2 數(shù)組的存儲與初始化(續(xù))二維數(shù)組的存儲按行存放例如: float a34;其中數(shù)組a的存儲順序?yàn)椋篴0a00 a01 a02 a03a1a10 a11 a12 a13a2a20 a21 a22 a23a可以理解為:a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23106.1 數(shù)組6.1.2 數(shù)組的存儲與初始化(續(xù))二維數(shù)組的初始化將所有數(shù)據(jù)寫在一個內(nèi),按順序賦值例如:static int a34=1,2,3,4,5,6,7,8,
5、9,10,11,12;分行給二維數(shù)組賦初值例如:static int a34 =1,2,3,4,5,6,7,8,9,10,11,12;可以對部分元素賦初值例如:static int a34=1,0,6,0,0,11;116.1 數(shù)組 6.1.2 數(shù)組的存儲與初始化例: 數(shù)組處理求Fibonacci數(shù)列#include using namespace std;int main() int f20 = 1,1;/初始化第0、1個數(shù) for (int i = 2; i 20; i+) /求第219個數(shù) fi = fi - 2 + fi - 1; for (i=0;i20;i+) /輸出,每行5個數(shù)
6、if (i % 5 = 0) cout endl; cout.width(12); /設(shè)置輸出寬度為12 cout fi; return 0;126.1 數(shù)組 6.1.2 數(shù)組的存儲與初始化例 (續(xù))運(yùn)行結(jié)果:11235813213455891442333776109871597258441816765例: 一維數(shù)組應(yīng)用舉例循環(huán)從鍵盤讀入若干組選擇題答案,計算并輸出每組答案的正確率,直到輸入ctrl+z為止。每組連續(xù)輸入5個答案,每個答案可以是a.d。136.1 數(shù)組 6.1.2 數(shù)組的存儲與初始化例 (續(xù))#include using namespace std;int main() con
7、st char KEY = a,c,b,a,d; const int NUM_QUES = 5; char c; int ques = 0, numCorrect = 0; cout Enter the NUM_QUES question tests: endl; while(cin.get(c) if(c != n) if(c = keyques) numCorrect+; cout ; else cout*; ques+; else cout Score static_cast(numCorrect)/NUM_QUES*100 %; ques = 0; numCorrect = 0; co
8、ut endl; return 0;146.1 數(shù)組 6.1.2 數(shù)組的存儲與初始化156.1 數(shù)組 6.1.2 數(shù)組的存儲與初始化例 (續(xù))運(yùn)行結(jié)果:acbba * Score 60%acbad Score 100%abbda * * Score 40%bdcba* Score 0%166.1 數(shù)組6.1.3 數(shù)組作為函數(shù)參數(shù)數(shù)組元素作實(shí)參,與單個變量一樣。數(shù)組名作參數(shù),形、實(shí)參數(shù)都應(yīng)是數(shù)組名,類型要一樣,傳送的是數(shù)組首地址。對形參數(shù)組的改變會直接影響到實(shí)參數(shù)組。例6-2 使用數(shù)組名作為函數(shù)參數(shù)主函數(shù)中初始化一個矩陣并將每個元素都輸出,然后調(diào)用子函數(shù),分別計算每一行的元素之和,將和直接存放在
9、每行的第一個元素中,返回主函數(shù)之后輸出各行元素的和。176.1 數(shù)組 6.1.3 數(shù)組作為函數(shù)參數(shù)#include using namespace std;void rowSum(int a4, int nRow) for (int i = 0; i nRow; i+) for(int j = 1; j 4; j+)ai0 += aij; int main() /主函數(shù)int table34 = 1, 2, 3, 4, 2, 3, 4, 5, 3, 4, 5, 6; /聲明并初始化數(shù)組18例6-2 (續(xù))6.1 數(shù)組 6.1.3 數(shù)組作為函數(shù)參數(shù) /輸出數(shù)組元素for (int i = 0;
10、i 3; i+)for (int j = 0; j 4; j+)cout tableij ;cout endl;rowSum(table, 3);/調(diào)用子函數(shù),計算各行和 /輸出計算結(jié)果for (int i = 0; i 3; i+)cout Sum of row i is tablei0 endl;return 0;19例6-2 (續(xù))6.1 數(shù)組 6.1.3 數(shù)組作為函數(shù)參數(shù)20例6-2 (續(xù))運(yùn)行結(jié)果:1 2 3 42 3 4 53 4 5 6Sum of row 0 is 10Sum of row 1 is 14Sum of row 2 is 186.1 數(shù)組 6.1.3 數(shù)組作為函數(shù)
11、參數(shù)216.1 數(shù)組6.1.4 對象數(shù)組聲明:類名 數(shù)組名元素個數(shù);訪問方法:通過下標(biāo)訪問 數(shù)組名下標(biāo).成員名22對象數(shù)組初始化數(shù)組中每一個元素對象被創(chuàng)建時,系統(tǒng)都會調(diào)用類構(gòu)造函數(shù)初始化該對象。通過初始化列表賦值。 例:Point a2=Point(1,2),Point(3,4);如果沒有為數(shù)組元素指定顯式初始值,數(shù)組元素便使用默認(rèn)值初始化(調(diào)用缺省構(gòu)造函數(shù))。6.1 數(shù)組 6.1.4 對象數(shù)組23數(shù)組元素所屬類的構(gòu)造函數(shù)不聲明構(gòu)造函數(shù),則采用缺省構(gòu)造函數(shù)。各元素對象的初值要求為相同的值時,可以聲明具有默認(rèn)形參值的構(gòu)造函數(shù)。各元素對象的初值要求為不同的值時,需要聲明帶形參的構(gòu)造函數(shù)。當(dāng)數(shù)組中每
12、一個對象被刪除時,系統(tǒng)都要調(diào)用一次析構(gòu)函數(shù)。6.1 數(shù)組 6.1.4 對象數(shù)組24例6-3 對象數(shù)組應(yīng)用舉例/Point.h#ifndef _POINT_H#define _POINT_Hclass Point /類的定義public:/外部接口Point();Point(int x, int y);Point();void move(int newX,int newY);int getX() const return x; int getY() const return y; static void showCount();/靜態(tài)函數(shù)成員private:/私有數(shù)據(jù)成員int x, y;#en
13、dif/_POINT_H6.1 數(shù)組 6.1.4 對象數(shù)組25例6-3 (續(xù))/Point.cpp#include #include Point.husing namespace std;Point:Point() x = y = 0;cout Default Constructor called. endl;Point:Point(int x, int y) : x(x), y(y) cout Constructor called. endl;Point:Point() cout Destructor called. endl;void Point:move(int newX,int new
14、Y) cout Moving the point to ( newX , newY ) endl;x = newX;y = newY;6.1 數(shù)組 6.1.4 對象數(shù)組26例6-3 (續(xù))/6-3.cpp#include Point.h#include using namespace std;int main() cout Entering main. endl;Point a2;for(int i = 0; i 2; i+)ai.move(i + 10, i + 20);cout Exiting main. endl;return 0;6.1 數(shù)組 6.1.4 對象數(shù)組27例6-3 (續(xù))運(yùn)
15、行結(jié)果:Entering main.Default Constructor called.Default Constructor called.Moving the point to (10, 20)Moving the point to (11, 21)Exiting main.Destructor called.Destructor called.6.1 數(shù)組 6.1.4 對象數(shù)組6.1.5 程序?qū)嵗?-4 利用Point類進(jìn)行點(diǎn)的線性擬合用n個數(shù)據(jù)點(diǎn)擬合成直線的問題,直線模型為其中:286.1 數(shù)組/Point.h#ifndef _POINT_H#define _POINT_Hclas
16、s Point /Point類的定義public:/外部接口Point(float x = 0, float y = 0) : x(x), y(y) float getX() const return x; float getY() const return y; private:/私有數(shù)據(jù)成員float x, y;#endif/_POINT_H296.1 數(shù)組 6.1.5 程序?qū)嵗?-4(續(xù))/6_4.cpp#include Point.h#include #include using namespace std;/直線線性擬合,points為各點(diǎn),nPoint為點(diǎn)數(shù)float lineF
17、it(const Point points, int nPoint) float avgX = 0, avgY = 0;float lxx = 0, lyy = 0, lxy = 0;for(int i = 0; i nPoint; i+) /計算x、y的平均值avgX += pointsi.getX() / nPoint;avgY += pointsi.getY() / nPoint;for(int i = 0; i nPoint; i+) /計算Lxx、Lyy和Lxylxx += (pointsi.getX() - avgX) * (pointsi.getX() - avgX);lyy +
18、= (pointsi.getY() - avgY) * (pointsi.getY() - avgY);lxy += (pointsi.getX() - avgX) * (pointsi.getY() - avgY);306.1 數(shù)組 6.1.5 程序?qū)嵗?-4(續(xù))cout This line can be fitted by y=ax+b. endl;cout a = lxy / lxx ;/輸出回歸系數(shù)acout b = avgY - lxy * avgX / lxx endl;/輸出回歸系數(shù)breturn static_cast(lxy / sqrt(lxx * lyy);/返回相關(guān)
19、系數(shù)rint main() Point p10 = Point(6, 10), Point(14, 20), Point(26, 30), Point(33, 40), Point(46, 50), Point(54, 60), Point(67, 70), Point(75, 80), Point(84, 90), Point(100, 100) ;/初始化數(shù)據(jù)點(diǎn)float r = lineFit(p, 10);/進(jìn)行線性回歸計算cout Line coefficient r = r endl;/輸出相關(guān)系數(shù)return 0;316.1 數(shù)組 6.1.5 程序?qū)嵗?-4(續(xù))例6-4(續(xù))
20、運(yùn)行結(jié)果為:This line can be fitted by y=ax+b.a = 0.97223 b = 5.90237Line coefficient r = 0.998193326.1 數(shù)組 6.1.5 程序?qū)嵗?.2.1 內(nèi)存空間的訪問方式內(nèi)存空間的訪問方式通過變量名訪問通過地址訪問336.2 指針6.2.2 指針變量的聲明概念指針:內(nèi)存地址,用于間接訪問內(nèi)存單元指針變量:用于存放地址的變量聲明例:static int i;static int *ptr = &i;引用例1:i = 3;例2:*ptr = 3;346.2 指針指向整型變量的指針20003ptr*ptri2000內(nèi)存
21、用戶數(shù)據(jù)區(qū)變量 i變量 j變量 ptr3620002000200430106.2.3 與地址相關(guān)的運(yùn)算“*”和“&”地址運(yùn)算符:&例:int var;則 &var 表示變量 var 在內(nèi)存中的起始地址356.2 指針6.2.4 指針的賦值指針變量的初始化語法形式存儲類型 數(shù)據(jù)類型 *指針名初始地址;例:int *pa = &a;注意事項(xiàng)用變量地址作為初值時,該變量必須在指針初始化之前已聲明過,且變量類型應(yīng)與指針類型一致??梢杂靡粋€已賦初值的指針去初始化另一個指針變量。不要用一個內(nèi)部 auto 變量去初始化 static 指針。366.2 指針指針變量的賦值運(yùn)算指針名=地址“地址”中存放的數(shù)據(jù)類
22、型與指針類型必須相符。向指針變量賦的值必須是地址常量或變量,不能是普通整數(shù)。但可以賦值為整數(shù)0,表示空指針。指針的類型是它所指向變量的類型,而不是指針本身數(shù)據(jù)值的類型,任何一個指針本身的數(shù)據(jù)值都是unsigned long int型。允許聲明指向 void 類型的指針。該指針可以被賦予任何類型對象的地址。例: void *general; 376.2 指針 6.2.4 指針的賦值例6-5 指針的聲明、賦值與使用#include using namespace std;int main() int i;/定義int型數(shù)iint *ptr = &i;/取i的地址賦給ptri = 10;/int型數(shù)
23、賦初值cout i = i endl;/輸出int型數(shù)的值cout *ptr = *ptr endl;/輸出int型指針?biāo)傅刂返膬?nèi)容return 0;386.2 指針 6.2.4 指針的賦值運(yùn)行結(jié)果:i = 10*ptr = 10例6-6 void類型指針的使用#include using namespace std;int main() /!void voidObject; 錯,不能聲明void類型的變量void *pv;/對,可以聲明void類型的指針int i = 5;pv = &i;/void類型指針指向整型變量int *pint = static_cast(pv); /void類型
24、指針賦值給int類型指針cout *pint = *pint endl;return 0; 396.2 指針 6.2.4 指針的賦值指向常量的指針不能通過指針來改變所指對象的值,但指針本身可以改變,可以指向另外的對象。例:int a;const int *p1 = &a;/p1是指向常量的指針int b;p1 = &b;/正確,p1本身的值可以改變*p1 = 1;/編譯時出錯,不能通過p1改變所指的對象406.2 指針 6.2.4 指針的賦值指針類型的常量若聲明指針常量,則指針本身的值不能被改變。例:int a;int * const p2 = &a; p2 = &b;/錯誤,p2是指針常量,
25、值不能改變416.2 指針 6.2.4 指針的賦值指針變量的算術(shù)運(yùn)算指針與整數(shù)的加減運(yùn)算指針p加上或減去n,其意義是指針當(dāng)前指向位置的前方或后方第n個數(shù)據(jù)的地址。這種運(yùn)算的結(jié)果值取決于指針指向的數(shù)據(jù)類型。p1n1等價于*(p1 + n1)指針加一,減一運(yùn)算指向下一個或前一個數(shù)據(jù)。例如:y=*px+ 相當(dāng)于 y=*(px+) (*和+優(yōu)先級相同,自右向左運(yùn)算)426.2 指針 6.2.5 指針運(yùn)算papa-2pa-1pa+1pa+2pa+3*(pa-2)或pa-2*pa或pa0*(pa+1)或pa1*(pa+2)或pa2*(pa+3)或pa3*(pa-1)或pa-1short *pa436.2
26、指針 6.2.5 指針運(yùn)算pb-1pbpb+1pb+2*(pb-1)或pb-1*pb或pb0*(pb+1)或pb1*(pb+2)或pb2long *pb446.2 指針 6.2.5 指針運(yùn)算指針變量的關(guān)系運(yùn)算關(guān)系運(yùn)算指向相同類型數(shù)據(jù)的指針之間可以進(jìn)行各種關(guān)系運(yùn)算。指向不同數(shù)據(jù)類型的指針,以及指針與一般整數(shù)變量之間的關(guān)系運(yùn)算是無意義的。指針可以和零之間進(jìn)行等于或不等于的關(guān)系運(yùn)算。例如:p=0或p!=0賦值運(yùn)算向指針變量賦的值必須是地址常量或變量,不能是普通整數(shù)。但可以賦值為整數(shù)0,表示空指針。456.2 指針 6.2.5 指針運(yùn)算6.2.6 用指針處理數(shù)組元素聲明與賦值例:int a10, *p
27、a; pa=&a0; 或 pa=a;通過指針引用數(shù)組元素經(jīng)過上述聲明及賦值后:*pa就是a0,*(pa+1)就是a1,. ,*(pa+i)就是ai.ai, *(pa+i), *(a+i), pai都是等效的。不能寫 a+,因?yàn)閍是數(shù)組首地址是常量。466.2 指針例6-7476.2 指針 6.2.6 用指針處理數(shù)組元素設(shè)有一個int型數(shù)組a,有10個元素。用三種方法輸出各元素:使用數(shù)組名和下標(biāo)使用數(shù)組名和指針運(yùn)算使用指針變量例6-7 (續(xù)) 使用數(shù)組名和下標(biāo)486.2 指針 6.2.6 用指針處理數(shù)組元素#include using namespace std;int main() int a
28、10 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 ;for (int i = 0; i 10; i+)cout ai ;cout endl;return 0;例6-7 (續(xù)) 使用數(shù)組名指針運(yùn)算496.2 指針 6.2.6 用指針處理數(shù)組元素#include using namespace std;int main() int a10 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 ;for (int i = 0; i 10; i+)cout *(a+i) ;cout endl;return 0;例6-7 (續(xù)) 使用指針變量506.2 指針 6.2.6 用指針
29、處理數(shù)組元素#include using namespace std;int main() int a10 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 ;for (int *p = a; p (a + 10); p+)cout *p ;cout endl;return 0;6.2.7 指針數(shù)組數(shù)組的元素是指針型例:Point *pa2;由pa0,pa1兩個指針組成 516.2 指針例6-8 利用指針數(shù)組存放單位矩陣526.2 指針 6.2.7 指針數(shù)組#include using namespace std;int main() int line1 = 1, 0, 0 ;/矩
30、陣的第一行int line2 = 0, 1, 0 ;/矩陣的第二行int line3 = 0, 0, 1 ;/矩陣的第三行/定義整型指針數(shù)組并初始化int *pLine3 = line1, line2, line3 ;例6-8 (續(xù))536.2 指針 6.2.7 指針數(shù)組cout Matrix test: endl; /輸出單位矩陣for (int i = 0; i 3; i+) for (int j = 0; j 3; j+) cout pLineij ; cout endl;return 0;輸出結(jié)果為:Matrix test:1,0,00,1,00,0,1例6-9 二維數(shù)組舉例546.2
31、 指針 6.2.7 指針數(shù)組#include using namespace std;int main() int array233= 11, 12, 13 , 21, 22, 23 , 31, 32, 33 ; for(int i = 0; i 3; i+) for(int j = 0; j 3; j+) cout *(*(array2 + i) + j) ;/逐個輸出二維數(shù)組第i行元素值 cout endl; return 0;55例6-9 (續(xù))運(yùn)行結(jié)果:11 12 1321 22 2331 32 336.2 指針 6.2.7 指針數(shù)組56指針數(shù)組 vs 二維數(shù)組6.2 指針 6.2.7
32、 指針數(shù)組pLine0pLine1pLine2(a) 指針數(shù)組array20array21array22array2二維數(shù)組pLine6.2.8 用指針作為函數(shù)參數(shù)以地址方式傳遞數(shù)據(jù),可以用來返回函數(shù)處理結(jié)果。實(shí)參是數(shù)組名時形參可以是指針。576.2 指針例6-10586.2 指針 6.2.8 用指針作為函數(shù)參數(shù)題目:讀入三個浮點(diǎn)數(shù),將整數(shù)部分和小數(shù)部分分別輸出#include using namespace std;void splitFloat(float x, int *intPart, float *fracPart) /取x的整數(shù)部分 *intPart = static_cast(x
33、); /取x的小數(shù)部分 *fracPart = x - *intPart;例6-10 (續(xù))596.2 指針 6.2.8 用指針作為函數(shù)參數(shù)int main() cout Enter 3 float point numbers: endl; for(int i = 0; i x; splitFloat(x, &n, &f);/變量地址作為實(shí)參 cout Integer Part = n Fraction Part = f endl; return 0;60例6-10 (續(xù))運(yùn)行結(jié)果:Enter 3 floating point numbers 4.7Integer Part = 4 Fract
34、ion Part = 0.78.913Integer Part = 8 Fraction Part = 0.913-4.7518Integer Part = -4 Fraction Part = -0.75186.2 指針 6.2.8 用指針作為函數(shù)參數(shù)例: 輸出數(shù)組元素的內(nèi)容和地址616.2 指針 6.2.8 用指針作為函數(shù)參數(shù)#include #include using namespace std;void arrayPtr(long *p, int n) cout In func, address of array is p endl;cout Accessing array usin
35、g pointers endl;for (int i = 0; i n; i+) cout Address for index i is p + i; cout Value is *(p + i) endl;例 (續(xù))626.2 指針 6.2.8 用指針作為函數(shù)參數(shù)int main() long list5=50, 60, 70, 80, 90;cout In main, address of array is list endl;cout endl; arrayPtr(list,5);return 0;63例 (續(xù))運(yùn)行結(jié)果:In main, address of array is 0012
36、FF50In func, address of array is 0012FF50Accessing array using pointersAddress for index 0 is 0012FF50 Value is 50Address for index 1 is 0012FF54 Value is 60Address for index 2 is 0012FF58 Value is 70Address for index 3 is 0012FF5C Value is 80Address for index 4 is 0012FF60 Value is 906.2 指針 6.2.8 用
37、指針作為函數(shù)參數(shù)例: 指向常量的指針做形參646.2 指針 6.2.8 用指針作為函數(shù)參數(shù)#includeusing namespace std;const int N = 6;void print(const int *p, int n);int main() int arrayN; for (int i = 0; i arrayi; print(array, N); return 0;void print(const int *p, int n) cout *p; for (int i = 1; i n; i+) cout , *(p+i); cout endl;6.2.9 指針型函數(shù)當(dāng)函
38、數(shù)的返回值是地址時,該函數(shù)就是指針形函數(shù)。聲明形式存儲類型 數(shù)據(jù)類型 *函數(shù)名()656.2 指針6.2.10 指向函數(shù)的指針聲明形式存儲類型 數(shù)據(jù)類型 (*函數(shù)指針名)();含義:數(shù)據(jù)指針指向數(shù)據(jù)存儲區(qū),而函數(shù)指針指向的是程序代碼存儲區(qū)。666.2 指針例6-11 函數(shù)指針676.2 指針 6.2.10 指向函數(shù)的指針#include using namespace std;void printStuff(float) cout This is the print stuff function. endl;void printMessage(float data) cout The data
39、 to be listed is data endl;void printFloat(float data) cout The data to be printed is data 成員名ptr-getx() 相當(dāng)于 (*ptr).getx();706.2 指針例6-12使用指針來訪問Point類的成員/6_12.cpp#include using namespace std;class Point /類的定義public:/外部接口Point(int x = 0, int y = 0) : x(x), y(y) /構(gòu)造函數(shù)int getX() const return x; /返回xint
40、getY() const return y; /返回yprivate:/私有數(shù)據(jù)int x, y;716.2 指針 6.2.11 對象指針的一般概念例6-12(續(xù))72int main() /主函數(shù)Point a(4, 5);/定義并初始化對象aPoint *p1 = &a;/定義對象指針,用a的地址將其初始化cout getX() endl;/利用指針訪問對象成員cout a.getX() x;766.2 指針 6.2.11 對象指針指向類的非靜態(tài)成員的指針通過指向成員的指針只能訪問公有成員聲明指向成員的指針聲明指向公有數(shù)據(jù)成員的指針類型說明符 類名:*指針名;聲明指向公有函數(shù)成員的指針類型
41、說明符 (類名:*指針名)(參數(shù)表);776.2 指針 6.2.11 對象指針指向類的非靜態(tài)成員的指針(續(xù))指向數(shù)據(jù)成員的指針說明指針應(yīng)該指向哪個成員指針名 = &類名:數(shù)據(jù)成員名;通過對象名(或?qū)ο笾羔槪┡c成員指針結(jié)合來訪問數(shù)據(jù)成員對象名.*類成員指針名或: 對象指針名-*類成員指針名786.2 指針 6.2.11 對象指針指向類的非靜態(tài)成員的指針(續(xù))指向函數(shù)成員的指針初始化指針名=&類名:函數(shù)成員名;通過對象名(或?qū)ο笾羔槪┡c成員指針結(jié)合來訪問函數(shù)成員(對象名.*類成員指針名)(參數(shù)表)或:(對象指針名-*類成員指針名)(參數(shù)表)796.2 指針 6.2.11 對象指針例6-13 訪問對
42、象的公有成員函數(shù)的不同方式80int main() /主函數(shù) Point a(4,5);/聲明對象APoint *p1 = &a; /聲明對象指針并初始化 /聲明成員函數(shù)指針并初始化int (Point:*funcPtr)() = Point:getX; /(1)使用成員函數(shù)指針訪問成員函數(shù)cout (a.*funcPtr)() endl; /(2)使用成員函數(shù)指針和對象指針訪問成員函數(shù)cout *funcPtr)() endl; /(3)使用對象名訪問成員函數(shù)cout a.getX() endl; /(4)使用對象指針訪問成員函數(shù)cout getX() endl; return 0;6.2
43、指針 6.2.11 對象指針指向類的靜態(tài)成員的指針對類的靜態(tài)成員的訪問不依賴于對象可以用普通的指針來指向和訪問靜態(tài)成員例6-14通過指針訪問類的靜態(tài)數(shù)據(jù)成員例6-15通過指針訪問類的靜態(tài)函數(shù)成員816.2 指針 6.2.11 對象指針例6-14 通過指針訪問類的靜態(tài)數(shù)據(jù)成員82#include using namespace std;class Point /Point類定義public:/外部接口Point(int x = 0, int y = 0) : x(x), y(y) count+;Point(const Point &p) : x(p.x), y(p.y) count+;Point
44、() count-; int getX() const return x; int getY() const return y; static int count;private:/私有數(shù)據(jù)成員int x, y;int Point:count = 0;6.2 指針 6.2.11 對象指針例6-14 (續(xù))83int main() /主函數(shù)實(shí)現(xiàn) /定義一個int型指針,指向類的靜態(tài)成員int *ptr = &Point:count;Point a(4, 5);/定義對象acout Point A: a.getX() , a.getY();cout Object count = *ptr endl
45、;Point b(a);/定義對象bcout Point B: b.getX() , b.getY();cout Object count = *ptr endl; return 0;6.2 指針 6.2.11 對象指針例6-15 通過指針訪問類的靜態(tài)函數(shù)成員84#include using namespace std;class Point /Point類定義public:/外部接口Point(int x = 0, int y = 0) : x(x), y(y) count+; Point(const Point &p) : x(p.x), y(p.y) count+; Point() co
46、unt-; int getX() const return x; int getY() const return y; static void showCount() cout Object count = count endl; private:/私有數(shù)據(jù)成員int x, y;static int count;int Point:count = 0;6.2 指針 6.2.11 對象指針例6-15 (續(xù))85int main() /主函數(shù)實(shí)現(xiàn) /定義一個指向函數(shù)的指針,指向類的靜態(tài)成員函數(shù)void (*funcPtr)() = Point:showCount;Point a(4, 5);/定義
47、對象Acout Point A: a.getX() , a.getY();funcPtr();/輸出對象個數(shù),直接通過指針訪問靜態(tài)函數(shù)成員Point b(a);/定義對象Bcout Point B: b.getX() , b.getY();funcPtr();/輸出對象個數(shù),直接通過指針訪問靜態(tài)函數(shù)成員return 0;6.2 指針 6.2.11 對象指針866.3 動態(tài)內(nèi)存分配動態(tài)申請內(nèi)存操作符 newnew 類型名T(初始化參數(shù)列表)功能:在程序執(zhí)行期間,申請用于存放T類型對象的內(nèi)存空間,并依初值列表賦以初值。結(jié)果值:成功:T類型的指針,指向新分配的內(nèi)存;失敗:拋出異常。876.3 動態(tài)內(nèi)
48、存分配釋放內(nèi)存操作符deletedelete 指針p功能:釋放指針p所指向的內(nèi)存。p必須是new操作的返回值。例6-16 動態(tài)創(chuàng)建對象舉例88#include using namespace std;class Point public:Point() : x(0), y(0) coutDefault Constructor called.endl;Point(int x, int y) : x(x), y(y) cout Constructor called.endl;Point() coutDestructor called.endl; int getX() const return x;
49、 int getY() const return y; void move(int newX, int newY) x = newX;y = newY;private:int x, y;6.3 動態(tài)內(nèi)存分配例6-16 (續(xù))89int main() cout Step one: endl;Point *ptr1 = new Point;/調(diào)用缺省構(gòu)造函數(shù)delete ptr1;/刪除對象,自動調(diào)用析構(gòu)函數(shù)cout Step two: endl;ptr1 = new Point(1,2);delete ptr1;return 0;6.3 動態(tài)內(nèi)存分配運(yùn)行結(jié)果:Step One:Default C
50、onstructor called.Destructor called.Step Two:Constructor called.Destructor called.906.3 動態(tài)內(nèi)存分配申請和釋放動態(tài)數(shù)組分配:new 類型名T 數(shù)組長度 數(shù)組長度可以是任何表達(dá)式,在運(yùn)行時計算釋放:delete 數(shù)組名p釋放指針p所指向的數(shù)組。p必須是用new分配得到的數(shù)組首地址。例6-17 動態(tài)創(chuàng)建對象數(shù)組舉例91#includeusing namespace std;class Point /類的聲明同例6-16,略 ;int main() Point *ptr = new Point2;/創(chuàng)建對象數(shù)組p
51、tr0.move(5, 10); /通過指針訪問數(shù)組元素的成員ptr1.move(15, 20); /通過指針訪問數(shù)組元素的成員cout Deleting. endl;delete ptr; /刪除整個對象數(shù)組return 0;6.3 動態(tài)內(nèi)存分配92例6-17 (續(xù))運(yùn)行結(jié)果:Default Constructor called.Default Constructor called.Deleting.Destructor called.Destructor called.6.3 動態(tài)內(nèi)存分配936.3 動態(tài)內(nèi)存分配將動態(tài)數(shù)組封裝成類更加簡潔,便于管理建立和刪除數(shù)組的過程比較繁瑣封裝成類后更加
52、簡潔,便于管理可以在訪問數(shù)組元素前檢查下標(biāo)是否越界用assert來檢查,assert只在調(diào)試時生效例6-18 動態(tài)數(shù)組類94#include #include using namespace std;class Point /類的聲明同例6-16 ;class ArrayOfPoints /動態(tài)數(shù)組類public:ArrayOfPoints(int size) : size(size) points = new Pointsize;ArrayOfPoints() cout Deleting. = 0 & index size);return pointsindex;private:Point
53、*points;/指向動態(tài)數(shù)組首地址int size;/數(shù)組大小;6.3 動態(tài)內(nèi)存分配例6-18 (續(xù))95int main() int count; cout count;ArrayOfPoints points(count);/創(chuàng)建對象數(shù)組/通過訪問數(shù)組元素的成員points.element(0).move(5, 0);/通過類訪問數(shù)組元素的成員points.element(1).move(15, 20);return 0;6.3 動態(tài)內(nèi)存分配96例6-18 (續(xù))運(yùn)行結(jié)果:Please enter the number of points:2Default Constructor cal
54、led.Default Constructor called.Deleting.Destructor called.Destructor called.6.3 動態(tài)內(nèi)存分配976.3 動態(tài)內(nèi)存分配動態(tài)創(chuàng)建多維數(shù)組 new 類型名T第1維長度第2維長度;如果內(nèi)存申請成功,new運(yùn)算返回一個指向新分配內(nèi)存首地址的指針,是一個T類型的數(shù)組,數(shù)組元素的個數(shù)為除最左邊一維外各維下標(biāo)表達(dá)式的乘積。例如:char (*fp)3;fp = new char23;986.3 動態(tài)內(nèi)存分配char (*fp)3;fpfp+1fp00fp01fp02fp10fp11fp12例6-19 動態(tài)創(chuàng)建多維數(shù)組99#incl
55、ude using namespace std;int main() float (*cp)98 = new float898; for (int i = 0; i 8; i+) for (int j = 0; j 9; j+) for (int k = 0; k 8; k+) /以指針形式數(shù)組元素 *(*(*(cp + i) + j) + k) = static_cast(i * 100 + j * 10 + k);6.3 動態(tài)內(nèi)存分配例6-19 (續(xù))100 for (int i = 0; i 8; i+) for (int j = 0; j 9; j+) for (int k = 0;
56、k 8; k+)/將指針cp作為數(shù)組名使用,通過數(shù)組名和下標(biāo)訪問數(shù)組元素cout cpijk ;cout endl;cout endl;delete cp;return 0;6.3 動態(tài)內(nèi)存分配101用vector創(chuàng)建數(shù)組對象為什么需要vector?將動態(tài)數(shù)組封裝,自動創(chuàng)建和刪除數(shù)組下標(biāo)越界檢查例6-18中封裝的ArrayOfPoints也提供了類似功能,但只適用于一種類型的數(shù)組vector動態(tài)數(shù)組對象的定義vector 數(shù)組對象名(數(shù)組長度);例:vector arr(5)建立大小為5的int數(shù)組6.4 用vector創(chuàng)建數(shù)組對象1026.4 用vector創(chuàng)建數(shù)組對象vector數(shù)組對象的
57、使用對數(shù)組元素的引用與普通數(shù)組具有相同形式:數(shù)組對象名 下標(biāo)表達(dá)式 但vector數(shù)組對象名不表示數(shù)組首地址獲得數(shù)組長度用size函數(shù)數(shù)組對象名.size()例6-20 vector應(yīng)用舉例103#include #include using namespace std;/計算數(shù)組arr中元素的平均值double average(const vector &arr) double sum = 0;for (unsigned i = 0; i arr.size(); i+)sum += arri;return sum / arr.size();6.4 用vector創(chuàng)建數(shù)組對象例6-20 (續(xù))
58、104int main() unsigned n;cout n;vector arr(n);/創(chuàng)建數(shù)組對象cout Please input n real numbers: endl;for (unsigned i = 0; i arri;cout Average = average(arr) endl;return 0;6.4 用vector創(chuàng)建數(shù)組對象1056.5 深拷貝與淺拷貝深拷貝與淺拷貝淺拷貝實(shí)現(xiàn)對象間數(shù)據(jù)元素的一一對應(yīng)復(fù)制。深拷貝當(dāng)被復(fù)制的對象數(shù)據(jù)成員是指針類型時,不是復(fù)制該指針成員本身,而是將指針?biāo)笇ο筮M(jìn)行復(fù)制。例6-21 對象的淺拷貝106#include #include
59、using namespace std;class Point /類的聲明同例6-16 /;class ArrayOfPoints /類的聲明同例6-18 /;6.5 深拷貝與淺拷貝例6-21 (續(xù))107int main() int count;cout count;ArrayOfPoints pointsArray1(count); /創(chuàng)建對象數(shù)組pointsArray1.element(0).move(5,10);pointsArray1.element(1).move(15,20);ArrayOfPoints pointsArray2 = pointsArray1; /創(chuàng)建副本cout
60、 Copy of pointsArray1: endl;cout Point_0 of array2: pointsArray2.element(0).getX() , pointsArray2.element(0).getY() endl;cout Point_1 of array2: pointsArray2.element(1).getX() , pointsArray2.element(1).getY() endl;6.5 深拷貝與淺拷貝例6-21 (續(xù))108pointsArray1.element(0).move(25, 30);pointsArray1.element(1).mo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度美團(tuán)團(tuán)購服務(wù)合同范本升級版8篇
- 二零二五年度高空作業(yè)腳手架租賃與施工總承包合同3篇
- 2025版協(xié)議離婚特殊規(guī)定及婚姻財產(chǎn)分割與子女撫養(yǎng)合同3篇
- 2025版臨時工特殊工種作業(yè)安全協(xié)議書4篇
- 2025年度酒店式公寓房間長期租賃服務(wù)協(xié)議3篇
- 2025年度個人企業(yè)全額承包經(jīng)營合作協(xié)議范本4篇
- 2025年度新能源電池殼體模具開發(fā)與加工服務(wù)協(xié)議4篇
- 2025年度文化創(chuàng)意園區(qū)場地租賃安全管理與文化創(chuàng)新合同4篇
- 水電消防工程2025年度施工及進(jìn)度管理合同2篇
- 2025新生入學(xué)教育法律協(xié)議書(定制版)2篇
- GB/T 16895.3-2024低壓電氣裝置第5-54部分:電氣設(shè)備的選擇和安裝接地配置和保護(hù)導(dǎo)體
- GJB9001C質(zhì)量管理體系要求-培訓(xùn)專題培訓(xùn)課件
- 二手車車主寄售協(xié)議書范文范本
- 窗簾采購?fù)稑?biāo)方案(技術(shù)方案)
- 基于學(xué)習(xí)任務(wù)群的小學(xué)語文單元整體教學(xué)設(shè)計策略的探究
- 人教版高中物理必修一同步課時作業(yè)(全冊)
- 食堂油鍋起火演練方案及流程
- 《呼吸衰竭的治療》
- 2024年度醫(yī)患溝通課件
- 2024年中考政治總復(fù)習(xí)初中道德與法治知識點(diǎn)總結(jié)(重點(diǎn)標(biāo)記版)
- 2024年手術(shù)室的應(yīng)急預(yù)案
評論
0/150
提交評論