C++語言程序設(shè)計(jì)第六章_第1頁
C++語言程序設(shè)計(jì)第六章_第2頁
C++語言程序設(shè)計(jì)第六章_第3頁
C++語言程序設(shè)計(jì)第六章_第4頁
C++語言程序設(shè)計(jì)第六章_第5頁
已閱讀5頁,還剩107頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1本章主要內(nèi)容數(shù)組指針動(dòng)態(tài)存儲(chǔ)分配指針與數(shù)組指針與函數(shù)字符串第1頁/共118頁2數(shù)組的概念數(shù)組是具有一定順序關(guān)系的若干相同類型變量的集合體,組成數(shù)組的變量稱為該數(shù)組的元素。數(shù)組屬于構(gòu)造類型。

數(shù)組第2頁/共118頁3一維數(shù)組的聲明與引用一維數(shù)組的聲明類型說明符數(shù)組名[常量表達(dá)式];

例如:inta[10];

表示a為整型數(shù)組,有10個(gè)元素:a[0]...a[9]引用必須先聲明,后使用。只能逐個(gè)引用數(shù)組元素,而不能一次引用整個(gè)數(shù)組

例如:a[0]=a[5]+a[7]-a[2*3]數(shù)組名的構(gòu)成方法與一般變量名相同。

數(shù)組第3頁/共118頁4例6.1一維數(shù)組的聲明與引用#include<iostream>usingnamespacestd;intmain(){intA[10],B[10];inti;for(i=0;i<10;i++){

A[i]=i*2-1;

B[10-i-1]=A[i];}

數(shù)組for(i=0;i<10;i++){ cout<<"A["<<i<<"]="<<A[i]; cout<<"B["<<i<<"]="<<B[i]<<endl;}}第4頁/共118頁5一維數(shù)組的存儲(chǔ)順序數(shù)組元素在內(nèi)存中順次存放,它們的地址是連續(xù)的。例如:具有10個(gè)元素的數(shù)組a,在內(nèi)存中的存放次序如下:數(shù)組名字是數(shù)組首元素的內(nèi)存地址。數(shù)組名是一個(gè)常量,不能被賦值。a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a

數(shù)組第5頁/共118頁6一維數(shù)組的初始化在聲明數(shù)組時(shí)對數(shù)組元素賦以初值。

例如:staticinta[10]={0,1,2,3,4,5,6,7,8,9};可以只給一部分元素賦初值。

例如:staticinta[10]={0,1,2,3,4};在對全部數(shù)組元素賦初值時(shí),可以不指定數(shù)組長度。

例如:staticinta[]={1,2,3,4,5}

數(shù)組第6頁/共118頁7#include<iostream>usingnamespacestd;intmain(){inti;staticintf[20]={1,1};//初始化第0、1個(gè)數(shù)

for(i=2;i<20;i++)//求第2~19個(gè)數(shù)

f[i]=f[i-2]+f[i-1];for(i=0;i<20;i++)//輸出,每行5個(gè)數(shù)//{if(i%5==0)cout<<endl; cout.width(12);//設(shè)置輸出寬度為12 cout<<f[i];}}例:用數(shù)組來處理求Fibonacci數(shù)列問題第7頁/共118頁8例:用數(shù)組來處理求Fibonacci數(shù)列問題運(yùn)行結(jié)果:

1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765第8頁/共118頁9一維數(shù)組應(yīng)用舉例循環(huán)從鍵盤讀入若干組選擇題答案,計(jì)算并輸出每組答案的正確率,直到輸入ctrl+z為止。每組連續(xù)輸入5個(gè)答案,每個(gè)答案可以是'a'..'d'。

數(shù)組第9頁/共118頁#include<iostream>usingnamespacestd;intmain(){

char

key[]={'a','c','b','a','d'};

charc;

int

ques=0,numques=5,numcorrect=0;

cout<<"Enterthe"<<numques<<"questiontests:"<<endl;

while(cin.get(c))

{if(c!='\n')

if(c==key[ques])

{numcorrect++;

cout<<"";

}

else

cout<<"*";

else{cout<<"Score"<<float(numcorrect)/numques*100<<"%";

ques=0;

numcorrect=0;

cout<<endl;

continue;

} ques++; }}10第10頁/共118頁運(yùn)行結(jié)果:acbba**

Score

60%acbadScore100%abbda***Score40%bdcba*****Score0%11第11頁/共118頁12二維數(shù)組的聲明及引用數(shù)據(jù)類型標(biāo)識(shí)符[常量表達(dá)式1][常量表達(dá)式2]…;例:inta[5][3];

表示a為整型二維數(shù)組,其中第一維有5個(gè)下標(biāo)(0~4),第二維有3個(gè)下標(biāo)(0~2),數(shù)組的元素個(gè)數(shù)為15,可以用于存放5行3列的整型數(shù)據(jù)表格。

數(shù)組第12頁/共118頁13存儲(chǔ)順序按行存放,上例中數(shù)組a的存儲(chǔ)順序?yàn)椋?/p>

二維數(shù)組的聲明類型說明符數(shù)組名[常量表達(dá)式][常量表達(dá)式]例如:floata[3][4];a00a01a02a03a10a11a12a13a20a21a22a23a[0]——a00a01a02a03a[1]——a10a11a12a13

a[2]——a20a21a22a23a可以理解為:引用例如:b[1][2]=a[2][3]/2下標(biāo)不要越界二維數(shù)組的聲明及引用

數(shù)組第13頁/共118頁14將所有數(shù)據(jù)寫在一個(gè){}內(nèi),按順序賦值例如:staticinta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};分行給二維數(shù)組賦初值例如:staticinta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};可以對部分元素賦初值例如:staticinta[3][4]={{1},{0,6},{0,0,11}};二維數(shù)組的初始化

數(shù)組第14頁/共118頁15數(shù)組作為函數(shù)參數(shù)數(shù)組元素作實(shí)參,與單個(gè)變量一樣。數(shù)組名作參數(shù),形、實(shí)參數(shù)都應(yīng)是數(shù)組名,類型要一樣,傳送的是數(shù)組首地址。對形參數(shù)組的改變會(huì)直接影響到實(shí)參數(shù)組。

數(shù)組第15頁/共118頁16例6-2使用數(shù)組名作為函數(shù)參數(shù)主函數(shù)中初始化一個(gè)矩陣并將每個(gè)元素都輸出,然后調(diào)用子函數(shù),分別計(jì)算每一行的元素之和,將和直接存放在每行的第一個(gè)元素中,返回主函數(shù)之后輸出各行元素的和。

數(shù)組第16頁/共118頁#include<iostream>usingnamespacestd;voidRowSum(intA[][4],intnrow){ intsum; for(inti=0;i<nrow;i++) { sum=0; for(intj=0;j<4;j++) sum+=A[i][j]; cout<<"Sumofrow"<<i

<<"is"<<sum<<endl;A[i][0]=sum; }}17第17頁/共118頁intmain(){ intTable[3][4]={{1,2,3,4},{2,3,4,5},{3,4,5,6}}; for(inti=0;i<3;i++) { for(intj=0;j<4;j++) cout<<Table[i][j]<<""; cout<<endl; } RowSum(Table,3);

for(inti=0;i<3;i++)

cout<<Table[i][0]}18第18頁/共118頁運(yùn)行結(jié)果:123423453456Sumofrow0is10Sumofrow1is14Sumofrow2is1810141819第19頁/共118頁20對象數(shù)組聲明:類名數(shù)組名[元素個(gè)數(shù)];訪問方法:通過下標(biāo)訪問數(shù)組名[下標(biāo)].成員名

數(shù)組第20頁/共118頁21對象數(shù)組初始化數(shù)組中每一個(gè)元素對象被創(chuàng)建時(shí),系統(tǒng)都會(huì)調(diào)用類構(gòu)造函數(shù)初始化該對象。通過初始化列表賦值。例:

PointA[2]={Point(1,2),Point(3,4)};如果沒有為數(shù)組元素指定顯式初始值,數(shù)組元素便使用默認(rèn)值初始化(調(diào)用默認(rèn)構(gòu)造函數(shù))。

數(shù)組第21頁/共118頁22數(shù)組元素所屬類的構(gòu)造函數(shù)不聲明構(gòu)造函數(shù),則采用默認(rèn)構(gòu)造函數(shù)。各元素對象的初值要求為相同的值時(shí),可以聲明具有默認(rèn)形參值的構(gòu)造函數(shù)。各元素對象的初值要求為不同的值時(shí),需要聲明帶形參的構(gòu)造函數(shù)。當(dāng)數(shù)組中每一個(gè)對象被刪除時(shí),系統(tǒng)都要調(diào)用一次析構(gòu)函數(shù)。

數(shù)組第22頁/共118頁23例6-3對象數(shù)組應(yīng)用舉例//Point.h#if!defined(_POINT_H)#define_POINT_HclassPoint{public:

Point();Point(intxx,intyy);~Point();voidMove(intx,inty);intGetX(){returnX;}intGetY(){returnY;}private:intX,Y;};#endif

數(shù)組第23頁/共118頁//6-2.cpp#include<iostream>usingnamespacestd;#include"Point.h"Point::Point(){X=Y=0;cout<<"DefaultConstructorcalled."<<endl;}Point::Point(intxx,intyy){X=xx;Y=yy;cout<<"Constructorcalled."<<endl;}Point::~Point(){cout<<"Destructorcalled."<<endl;}voidPoint::Move(intx,inty){X=x;Y=y;}24第24頁/共118頁#include<iostream>#include"Point.h"usingnamespacestd;intmain(){cout<<"Enteringmain..."<<endl;

Point

A[2];for(inti=0;i<2;i++)

A[i].Move(i+10,i+20);cout<<"Exitingmain..."<<endl;

return0;}25第25頁/共118頁運(yùn)行結(jié)果:Enteringmain...DefaultConstructorcalled.DefaultConstructorcalled.Exitingmain...Destructorcalled.Destructorcalled.26第26頁/共118頁27關(guān)于內(nèi)存地址內(nèi)存空間的訪問方式通過變量名訪問通過地址訪問地址運(yùn)算符:&例:intvar;則&var

表示變量var在內(nèi)存中的起始地址第27頁/共118頁28聲明例:staticinti;staticint*i_pointer=&i;

指向整型變量的指針概念

指針:內(nèi)存地址,用于

間接訪問內(nèi)存單元

指針變量:

用于存放地址的變量20003i_pointer*i_pointeri2000內(nèi)存用戶數(shù)據(jù)區(qū)變量i變量j變量

i_pointer362000200020043010引用例1:i=3;

例2:*i_pointer=3;

指針指針變量的概念第28頁/共118頁29語法形式

存儲(chǔ)類型數(shù)據(jù)類型*指針名=初始地址;例:int*pa=&a;注意事項(xiàng)用變量地址作為初值時(shí),該變量必須在指針初始化之前已說明過,且變量類型應(yīng)與指針類型一致??梢杂靡粋€(gè)已賦初值的指針去初始化另一個(gè)指針變量。不要用一個(gè)內(nèi)部auto變量去初始化static指針。

指針指針變量的初始化第29頁/共118頁30指針變量的賦值運(yùn)算指針名=地址“地址”中存放的數(shù)據(jù)類型與指針類型必須相符。向指針變量賦的值必須是地址常量或變量,不能是普通整數(shù)。但可以賦值為整數(shù)0,表示空指針。指針的類型是它所指向變量的類型,而不是指針本身數(shù)據(jù)值的類型,任何一個(gè)指針本身的數(shù)據(jù)值都是unsignedlongint型。允許聲明指向void類型的指針。該指針可以被賦予任何類型對象的地址。例:void*general;

指針第30頁/共118頁31例6-5指針的聲明、賦值與使用#include<iostream>usingnamespacestd;intmain(){int*i_pointer; //聲明int型指針i_pointerinti;//聲明int型數(shù)ii_pointer=&i;//取i的地址賦給i_pointeri=10;//int型數(shù)賦初值

cout<<"Outputinti="<<i<<endl;//輸出int型數(shù)的值

cout<<"Outputintpointeri="<<*i_pointer<<endl;//輸出int型指針?biāo)傅刂返膬?nèi)容}

指針第31頁/共118頁程序運(yùn)行的結(jié)果是:Outputinti=10Outputintpointeri=1032第32頁/共118頁33例6-6void類型指針的使用voidvobject;//錯(cuò),不能聲明void類型的變量void*pv;//對,可以聲明void類型的指針int*pint;inti;intmain(){ pv=&i; //void類型指針指向整型變量

//void指針賦值給int指針需要類型強(qiáng)制轉(zhuǎn)換:pint=(int*)pv;}

指針第33頁/共118頁34指向常量的指針不能通過指針來改變所指對象的值,但指針本身可以改變,可以指向另外的對象。例1char*name1="John";//name1是一般指針*name1='A';//編譯正確,運(yùn)行出錯(cuò)例2constchar*name1="John";//指向常量的指針chars[]="abc";name1=s;//正確,name1本身的值可以改變*name1='1';//編譯時(shí)指出錯(cuò)誤

指針第34頁/共118頁35指針類型的常量若聲明指針常量,則指針本身的值不能被改變。例:char*constname2="John";name2="abc";//錯(cuò)誤,指針常量值不能改變

指針第35頁/共118頁36指針變量的算術(shù)運(yùn)算指針與整數(shù)的加減運(yùn)算指針p加上或減去n,其意義是指針當(dāng)前指向位置的前方或后方第n個(gè)數(shù)據(jù)的地址。這種運(yùn)算的結(jié)果值取決于指針指向的數(shù)據(jù)類型。指針加一,減一運(yùn)算指向下一個(gè)或前一個(gè)數(shù)據(jù)。例如:y=*px++相當(dāng)于y=*(px++)

(*和++優(yōu)先級(jí)相同,自右向左運(yùn)算)

指針第36頁/共118頁papa-2pa-1pa+1pa+2pa+3*(pa-2)*pa*(pa+1)*(pa+2)*(pa+3)*(pa-1)short*pa37第37頁/共118頁pb-1pbpb+1pb+2*(pb-1)*pb*(pb+1)*(pb+2)long*pb38第38頁/共118頁39關(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,表示空指針。指針變量的關(guān)系運(yùn)算

指針第39頁/共118頁40指向數(shù)組元素的指針聲明與賦值例:inta[10],*pa;pa=&a[0];或pa=a;通過指針引用數(shù)組元素經(jīng)過上述聲明及賦值后:*pa就是a[0],*(pa+1)就是a[1],...,*(pa+i)就是a[i].a[i],*(pa+i),*(a+i),pa[i]都是等效的。不能寫a++,因?yàn)閍是數(shù)組首地址是常量。

指針第40頁/共118頁41例6-7設(shè)有一個(gè)int型數(shù)組a,有10個(gè)元素。用三種方法輸出各元素:使用數(shù)組名和下標(biāo)使用數(shù)組名和指針運(yùn)算使用指針變量

指針第41頁/共118頁intmain(){inta[10];inti;for(i=0;i<10;i++)cin>>a[i];cout<<endl;for(i=0;i<10;i++)cout<<a[i];}使用數(shù)組名和下標(biāo)42第42頁/共118頁intmain(){inta[10];inti;for(i=0;i<10;i++)cin>>a[i];cout<<endl;for(i=0;i<10;i++)cout<<*(a+i);}使用數(shù)組名指針運(yùn)算43第43頁/共118頁使用指針變量intmain(){inta[10];int*p,i;

for(i=0;i<10;i++)cin>>a[i];cout<<endl;for(p=a;p<(a+10);p++)cout<<*p;}44第44頁/共118頁45指針數(shù)組數(shù)組的元素是指針型例:Point*pa[2];

由pa[0],pa[1]兩個(gè)指針組成

指針第45頁/共118頁46例6-8利用指針數(shù)組存放單位矩陣#include<iostream>usingnamespacestd;intmain(){ intline1[]={1,0,0};//聲明數(shù)組,矩陣的第一行

intline2[]={0,1,0};//聲明數(shù)組,矩陣的第二行

intline3[]={0,0,1};//聲明數(shù)組,矩陣的第三行

int*p_line[3]; //聲明整型指針數(shù)組

p_line[0]=line1;//初始化指針數(shù)組元素

p_line[1]=line2; p_line[2]=line3;

指針第46頁/共118頁 //輸出單位矩陣

cout<<"Matrixtest:"<<endl; for(inti=0;i<3;i++)//對指針數(shù)組元素循環(huán)

{ for(intj=0;j<3;j++)//對矩陣每一行循環(huán)

{cout<<p_line[i][j]<<"";} cout<<endl; }}輸出結(jié)果為:Matrixtest:1,0,00,1,00,0,147第47頁/共118頁48例6-9二維數(shù)組舉例#include<iostream>usingnamespacestd;intmain(){ intarray2[2][3]={{11,12,13},{21,22,23}};for(inti=0;i<2;i++){cout<<*(array2+i)<<endl; for(intj=0;j<3;j++){cout<<*(*(array2+i)+j)<<"";//或者cout<<array2[i][j]<<"";} cout<<endl; }}

指針第48頁/共118頁在某次運(yùn)行之后,程序的輸出結(jié)果為:0X0065FDE011,12,130X0065FDEC21,22,2349第49頁/共118頁50以指針作為函數(shù)參數(shù)以地址方式傳遞數(shù)據(jù),可以用來返回函數(shù)處理結(jié)果。實(shí)參是數(shù)組名時(shí)形參可以是指針。

指針與函數(shù)第50頁/共118頁51例6.10題目:讀入三個(gè)浮點(diǎn)數(shù),將整數(shù)部分和小數(shù)部分分別輸出#include<iostream>usingnamespacestd;voidsplitfloat(floatx,int*intpart,

float*fracpart){//形參intpart、fracpart是指針

*intpart=int(x);

//取x的整數(shù)部分

*fracpart=x-*intpart;//取x的小數(shù)部分}

指針與函數(shù)第51頁/共118頁intmain(){ inti,n; floatx,f; cout<<"Enterthree(3)floatingpointnumbers"

<<endl; for(i=0;i<3;i++) {

cin>>x;

splitfloat(x,&n,&f);//變量地址做實(shí)參

cout<<"IntegerPartis"<<n

<<"FractionPartis"<<f<<endl; }}52第52頁/共118頁運(yùn)行結(jié)果:Enterthree(3)floatingpointnumbers4.7IntegerPartis4FractionPartis0.78.913IntegerPartis8FractionPartis0.913-4.7518IntegerPartis-4FractionPartis-0.751853第53頁/共118頁54例:

輸出數(shù)組元素的內(nèi)容和地址#include<iostream>#include<iomanip>usingnamespacestd;voidArray_Ptr(long*P,intn){ inti; cout<<"Infunc,addressofarrayis"

<<unsignedlong(P)<<endl; cout<<"Accessingarrayusingpointers"<<endl; for(i=0;i<n;i++) {

cout<<"Addressforindex"<<i<<"is"

<<unsignedlong(P+i);

cout<<"Valueis"<<*(P+i)<<endl; }}

指針與函數(shù)第54頁/共118頁intmain(){ longlist[5]={50,60,70,80,90};

cout<<"Inmain,addressofarrayis"<<unsignedlong(list)<<endl; cout<<endl;

Array_Ptr(list,5);}55第55頁/共118頁運(yùn)行結(jié)果:Inmain,addressofarrayis6684132Infunc,addressofarrayis6684132AccessingarrayusingpointersAddressforindex0is6684132Valueis50Addressforindex1is6684136Valueis60Addressforindex2is6684140Valueis70Addressforindex3is6684144Valueis80Addressforindex4is6684148Valueis9056第56頁/共118頁57指向常量的指針做形參#include<iostream>usingnamespacestd;constintN=6;voidprint(constint

*p,intn);intmain(){intarray[N];for(inti=0;i<N;i++)cin>>array[i];print(array,N);}

指針第57頁/共118頁voidprint(constint*p,intn){cout<<"{"<<*p;for(inti=1;i<n;i++)cout<<"."<<*(p+i);cout<<"}"<<endl;}58第58頁/共118頁59指針型函數(shù)當(dāng)函數(shù)的返回值是地址時(shí),該函數(shù)就是指針形函數(shù)。聲明形式

存儲(chǔ)類型數(shù)據(jù)類型*函數(shù)名()

指針與函數(shù)第59頁/共118頁60聲明形式

存儲(chǔ)類型數(shù)據(jù)類型(*函數(shù)指針名)();

含義:數(shù)據(jù)指針指向數(shù)據(jù)存儲(chǔ)區(qū),而函數(shù)指針指向的是程序代碼存儲(chǔ)區(qū)。指向函數(shù)的指針

指針與函數(shù)第60頁/共118頁61例6-11函數(shù)指針#include<iostream>usingnamespacestd;voidprint_stuff(floatdata_to_ignore);voidprint_message(floatlist_this_data);voidprint_float(floatdata_to_print);void(*function_pointer)(float); intmain() { floatpi=(float)3.14159; floattwo_pi=(float)2.0*pi;

指針與函數(shù)第61頁/共118頁print_stuff(pi);

function_pointer=print_stuff;

function_pointer(pi);

function_pointer=print_message;

function_pointer(two_pi);

function_pointer(13.0);

function_pointer=print_float;

function_pointer(pi);print_float(pi);}62第62頁/共118頁voidprint_stuff(floatdata_to_ignore){ cout<<"Thisistheprintstufffunction.\n";}voidprint_message(floatlist_this_data){ cout<<"Thedatatobelistedis"<<list_this_data<<endl;}voidprint_float(floatdata_to_print){ cout<<"Thedatatobeprintedis"<<data_to_print<<endl;}63第63頁/共118頁運(yùn)行結(jié)果:

Thisistheprintstufffunction.Thisistheprintstufffunction.Thedatatobelistedis6.283180Thedatatobelistedis13.000000Thedatatobeprintedis3.141590Thedatatobeprintedis3.14159064第64頁/共118頁65對象指針的一般概念聲明形式類名*對象指針名;例PointA(5,10);Piont*ptr;ptr=&A;通過指針訪問對象成員對象指針名->成員名ptr->getx()相當(dāng)于(*ptr).getx();

指針第65頁/共118頁66對象指針應(yīng)用舉例intmain(){PointA(5,10);Point*ptr;

ptr=&A; intx; x=ptr->GetX(); cout<<x<<endl;return0;}

指針第66頁/共118頁67曾經(jīng)出現(xiàn)過的錯(cuò)誤例子classFred; //前向引用聲明classBarney{Fredx; //錯(cuò)誤:類Fred的聲明尚不完善

};classFred{Barneyy;};

指針第67頁/共118頁68正確的程序classFred; //前向引用聲明classBarney{Fred*x; };classFred{Barneyy;};

指針第68頁/共118頁69this指針隱含于每一個(gè)類的成員函數(shù)中的特殊指針。明確地指出了成員函數(shù)當(dāng)前所操作的數(shù)據(jù)所屬的對象。當(dāng)通過一個(gè)對象調(diào)用成員函數(shù)時(shí),系統(tǒng)先將該對象的地址賦給this指針,然后調(diào)用成員函數(shù),成員函數(shù)對對象的數(shù)據(jù)成員進(jìn)行操作時(shí),就隱含使用了this指針。

指針第69頁/共118頁70this指針例如:Point類的構(gòu)造函數(shù)體中的語句:X=xx;Y=yy;相當(dāng)于:this->X=xx;this->Y=yy;

指針第70頁/共118頁71指向類的非靜態(tài)成員的指針通過指向成員的指針只能訪問公有成員聲明指向成員的指針聲明指向公有數(shù)據(jù)成員的指針類型說明符類名::*指針名; 聲明指向公有函數(shù)成員的指針類型說明符(類名::*指針名)(參數(shù)表);

指針第71頁/共118頁72指向類的非靜態(tài)成員的指針指向數(shù)據(jù)成員的指針說明指針應(yīng)該指向哪個(gè)成員指針名=&類名::數(shù)據(jù)成員名;通過對象名(或?qū)ο笾羔槪┡c成員指針結(jié)合來訪問數(shù)據(jù)成員對象名.*類成員指針名或:對象指針名—>*類成員指針名

指針第72頁/共118頁73指向類的非靜態(tài)成員的指針指向函數(shù)成員的指針初始化指針名=類名::函數(shù)成員名;通過對象名(或?qū)ο笾羔槪┡c成員指針結(jié)合來訪問函數(shù)成員(對象名.*類成員指針名)(參數(shù)表)或:(對象指針名—>*類成員指針名)(參數(shù)表)

指針第73頁/共118頁74指向類的非靜態(tài)成員的指針例6-13訪問對象的公有成員函數(shù)的不同方式intmain() //主函數(shù){ PointA(4,5); //聲明對象A Point*p1=&A; //聲明對象指針并初始化

//聲明成員函數(shù)指針并初始化

int(Point::*p_GetX)()=Point::GetX;

//(1)使用成員函數(shù)指針訪問成員函數(shù)

cout<<(A.*p_GetX)()<<endl;

//(2)使用對象指針訪問成員函數(shù)

cout<<(p1->GetX)()<<endl;

//(3)使用對象名訪問成員函數(shù)

cout<<A.GetX()<<endl; }

指針第74頁/共118頁75指向類的靜態(tài)成員的指針對類的靜態(tài)成員的訪問不依賴于對象可以用普通的指針來指向和訪問靜態(tài)成員例6-14通過指針訪問類的靜態(tài)數(shù)據(jù)成員例6-15通過指針訪問類的靜態(tài)函數(shù)成員

指針第75頁/共118頁76例6-14通過指針訪問類的靜態(tài)數(shù)據(jù)成員#include<iostream>usingnamespacestd;classPoint //Point類聲明{public: //外部接口

Point(intxx=0,intyy=0){X=xx;Y=yy;countP++;}//構(gòu)造函數(shù)

Point(Point&p); //拷貝構(gòu)造函數(shù)

intGetX(){returnX;} intGetY(){returnY;}

staticintcountP;//靜態(tài)數(shù)據(jù)成員引用性說明private: //私有數(shù)據(jù)成員

intX,Y;};Point::Point(Point&p){ X=p.X;Y=p.Y;countP++;}intPoint::countP=0;//靜態(tài)數(shù)據(jù)成員定義性說明

指針第76頁/共118頁intmain() //主函數(shù){//聲明一個(gè)int型指針,指向類的靜態(tài)成員

int*count=&Point::countP; PointA(4,5); //聲明對象A cout<<"PointA,"<<A.GetX()<<","<<A.GetY(); //直接通過指針訪問靜態(tài)數(shù)據(jù)成員

cout<<"Objectid="<<*count<<endl; PointB(A); //聲明對象B cout<<"PointB,"<<B.GetX()<<","<<B.GetY();//直接通過指針訪問靜態(tài)數(shù)據(jù)成員

cout<<"Objectid="<<*count<<endl; }77第77頁/共118頁78例6-15通過指針訪問類的靜態(tài)函數(shù)成員#include<iostream>usingnamespacestd;classPoint //Point類聲明{public: //外部接口

//其他函數(shù)略

staticvoidGetC()//靜態(tài)函數(shù)成員

{cout<<"Objectid="<<countP<<endl;}private: //私有數(shù)據(jù)成員

intX,Y; staticintcountP; //靜態(tài)數(shù)據(jù)成員引用性說明};//函數(shù)實(shí)現(xiàn)略intPoint::countP=0; //靜態(tài)數(shù)據(jù)成員定義性說明

指針第78頁/共118頁intmain() //主函數(shù){//指向函數(shù)的指針,指向類的靜態(tài)成員函數(shù)

void(*gc)()=Point::GetC; PointA(4,5); //聲明對象A cout<<"PointA,"<<A.GetX()<<","<<A.GetY(); gc();//輸出對象序號(hào),通過指針訪問靜態(tài)函數(shù)成員

PointB(A);//聲明對象B cout<<"PointB,"<<B.GetX()<<","<<B.GetY(); gc();//輸出對象序號(hào),通過指針訪問靜態(tài)函數(shù)成員}79第79頁/共118頁80動(dòng)態(tài)申請內(nèi)存操作符newnew類型名T(初值列表)功能:在程序執(zhí)行期間,申請用于存放T類型對象的內(nèi)存空間,并依初值列表賦以初值。結(jié)果值:成功:T類型的指針,指向新分配的內(nèi)存。失?。?(NULL)

動(dòng)態(tài)存儲(chǔ)分配第80頁/共118頁81釋放內(nèi)存操作符deletedelete指針P功能:釋放指針P所指向的內(nèi)存。P必須是new操作的返回值。

動(dòng)態(tài)存儲(chǔ)分配第81頁/共118頁82例6-16動(dòng)態(tài)創(chuàng)建對象舉例#include<iostream>usingnamespacestd;classPoint{public:Point(){X=Y=0;cout<<"DefaultConstructorcalled.\n";}Point(intxx,intyy){X=xx;Y=yy;cout<<"Constructorcalled.\n";}~Point(){cout<<"Destructorcalled.\n";}intGetX(){returnX;}intGetY(){returnY;} voidMove(intx,inty){X=x;Y=y;}private:intX,Y;};

動(dòng)態(tài)存儲(chǔ)分配第82頁/共118頁intmain(){cout<<"StepOne:"<<endl;Point*Ptr1=newPoint;deletePtr1;cout<<"StepTwo:"<<endl;Ptr1=newPoint(1,2);deletePtr1;return0;}運(yùn)行結(jié)果:StepOne:DefaultConstructorcalled.Destructorcalled.StepTwo:Constructorcalled.Destructorcalled.83第83頁/共118頁84例6-17動(dòng)態(tài)創(chuàng)建對象數(shù)組舉例#include<iostream>usingnamespacestd;classPoint{//類的聲明同例6-16,略};intmain(){Point*Ptr=newPoint[2];//創(chuàng)建對象數(shù)組

Ptr[0].Move(5,10);//通過指針訪問數(shù)組元素的成員

Ptr[1].Move(15,20);//通過指針訪問數(shù)組元素的成員

cout<<"Deleting..."<<endl;delete[]Ptr;//刪除整個(gè)對象數(shù)組

return0;}

動(dòng)態(tài)存儲(chǔ)分配第84頁/共118頁運(yùn)行結(jié)果:DefaultConstructorcalled.DefaultConstructorcalled.Deleting...Destructorcalled.Destructorcalled.85第85頁/共118頁例6-18動(dòng)態(tài)數(shù)組類#include<iostream>usingnamespacestd;classPoint{//類的聲明同例6-16…};classArrayOfPoints{public:ArrayOfPoints(intn){numberOfPoints=n;points=newPoint[n];}~ArrayOfPoints(){cout<<"Deleting..."<<endl;numberOfPoints=0;delete[]points;}Point&Element(intn){returnpoints[n];}private:Point*points;intnumberOfPoints;};86第86頁/共118頁intmain(){ intnumber; cout<<"Pleaseenterthenumberofpoints:"; cin>>number;//創(chuàng)建對象數(shù)組

ArrayOfPointspoints(number);//通過指針訪問數(shù)組元素的成員

points.Element(0).Move(5,10);//通過指針訪問數(shù)組元素的成員

points.Element(1).Move(15,20);}87第87頁/共118頁運(yùn)行結(jié)果如下:Pleaseenterthenumberofpoints:2DefaultConstructorcalled.DefaultConstructorcalled.Deleting...Destructorcalled.Destructorcalled.88第88頁/共118頁89動(dòng)態(tài)創(chuàng)建多維數(shù)組new類型名T[下標(biāo)表達(dá)式1][下標(biāo)表達(dá)式2]…;如果內(nèi)存申請成功,new運(yùn)算返回一個(gè)指向新分配內(nèi)存首地址的指針,是一個(gè)T類型的數(shù)組,數(shù)組元素的個(gè)數(shù)為除最左邊一維外各維下標(biāo)表達(dá)式的乘積。例如:char(*fp)[3];fp=newchar[2][3];

動(dòng)態(tài)存儲(chǔ)分配第89頁/共118頁char(*fp)[3];fpfp+1fp[0][0]fp[0][1]fp[0][2]fp[1][0]fp[1][1]fp[1][2]90第90頁/共118頁91例6-18動(dòng)態(tài)創(chuàng)建多維數(shù)組#include<iostream>usingnamespacestd;intmain(){ float(*cp)[9][8]; inti,j,k; cp=newfloat[8][9][8]; for(i=0;i<8;i++) for(j=0;j<9;j++) for(k=0;k<9;k++) *(*(*(cp+i)+j)+k)=i*100+j*10+k;//通過指針訪問數(shù)組元素

動(dòng)態(tài)存儲(chǔ)分配第91頁/共118頁for(i=0;i<8;i++){for(j=0;j<9;j++){for(k=0;k<8;k++) //將指針cp作為數(shù)組名使用,

//通過數(shù)組名和下標(biāo)訪問數(shù)組元素

cout<<cp[i][j][k]<<""; cout<<endl; } cout<<endl;}}92第92頁/共118頁93動(dòng)態(tài)存儲(chǔ)分配函數(shù)void*malloc(size);參數(shù)size:欲分配的字節(jié)數(shù)返回值:成功,則返回void型指針。

失敗,則返回空指針。頭文件:<cstdlib>和<cmalloc>

動(dòng)態(tài)存儲(chǔ)分配第93頁/共118頁94動(dòng)態(tài)內(nèi)存釋放函數(shù)voidfree(void*memblock);參數(shù)memblock:指針,指向需釋放的內(nèi)存。返回值:無頭文件:<cstdlib>和<cmalloc>

動(dòng)態(tài)存儲(chǔ)分配第94頁/共118頁95淺拷貝與深拷貝淺拷貝實(shí)現(xiàn)對象間數(shù)據(jù)元素的一一對應(yīng)復(fù)制。深拷貝當(dāng)被復(fù)制的對象數(shù)據(jù)成員是指針類型時(shí),不是復(fù)制該指針成員本身,而是將指針?biāo)傅膶ο筮M(jìn)行復(fù)制。淺拷貝與深拷貝第95頁/共118頁96例6-20對象的淺拷貝#include<iostream>usingnamespacestd;classPoint{//類的聲明同例6-16//……};classArrayOfPoints{//類的聲明同例6-18//……};淺拷貝與深拷貝第96頁/共118頁intmain(){ intnumber; cin>>number;ArrayOfPointspointsArray1(number);pointsArray1.Element(0).Move(5,10);pointsArray1.Element(1).Move(15,20);

ArrayOfPointspointsArray2(pointsArray1);

cout<<"CopyofpointsArray1:"<<endl;cout<<"Point_0ofarray2:"<<pointsArray2.Element(0).GetX()<<","<<pointsArray2.Element(0).GetY()<<endl;cout<<"Point_1ofarray2:"<<pointsArray2.Element(1).GetX()<<","<<pointsArray2.Element(1).GetY()<<endl;97第97頁/共118頁pointsArray1.Element(0).Move(25,30);pointsArray1.Element(1).Move(35,40);cout<<"AfterthemovingofpointsArray1:"<<endl;cout<<"Point_0ofarray2:"<<pointsArray2.Element(0).GetX()<<","<<pointsArray2.Element(0).GetY()<<endl;cout<<"Point_1ofarray2:"<<pointsArray2.Element(1).GetX()<<","<<pointsArray2.Element(1).GetY()<<endl;}98第98頁/共118頁運(yùn)行結(jié)果如下:Pleaseenterthenumberofpoints:2DefaultConstructorcalled.DefaultConstructorcalled.CopyofpointsArray1:Point_0ofarray2:5,10Point_1ofarray2:15,20AfterthemovingofpointsArray1:Point_0ofarray2:25,30Point_1ofarray2:35,40Deleting...Destructorcalled.Destructorcalled.Deleting...接下來程序出現(xiàn)異常,也就是運(yùn)行錯(cuò)誤。99第99頁/共118頁拷貝前拷貝后pointsArray1的數(shù)組元素占用的內(nèi)存pointsnumberOfPointspointsArray1pointsnumberOfPointspointsArray1pointsArray1的數(shù)組元素占用的內(nèi)存pointsnumberOfPointspointsArray2100第100頁/共118頁101例6-21對象的深拷貝#include<iostream>usingnamespacestd;classPoint{//類的聲明同例6-16……};classArrayOfPoints{public:ArrayOfPoints(ArrayOfPoints&pointsArray);//其他成員同例6-18};淺拷貝與深拷貝第101頁/共118頁ArrayOfPoints::ArrayOfPoints(ArrayOfPoints&pointsArray){numberOfPoints=pointsArray.numberOfPoints;points=newPoint[numberOfPoints];for(inti=0;i<numberOfPoints;i++)points[i].Move(pointsArray.Element(i).GetX(),pointsArray.Element(i).GetY());}intmain(){//同例6-20}102第102頁/共118頁程序的運(yùn)行結(jié)果如下:Pleaseenterthenumberofpoints:2DefaultConstructorcalled.DefaultConstructorcalled.DefaultConstructorcalled.DefaultConstructorcalled.CopyofpointsArray1:Point_0ofarray2:5,10Point_1ofarray2:15,20AfterthemovingofpointsArray1:Point_0ofarray2:5,10Point_1ofarray2:15,20Deleting...Destructorcalled.Destructorcalled.Deleting...Destructorcalled.Destructorcalled.103第103頁/共118頁拷貝前pointsArray1的數(shù)組元素占用的內(nèi)存pointsnumberOfPointspointsArray1拷貝后pointsnumberOfPointspointsArray1pointsArray1的數(shù)組元素占用的內(nèi)存pointsnumberOfPointspointsArray2104第104頁/共118頁105用字符數(shù)組存儲(chǔ)和處理字符串字符數(shù)組的聲明和引用例:staticcharstr[8]={112,114,111,103,114,97,109,0};

staticcharstr[8]={'p','r','o','g','r','a','m','\0'};

staticcharstr[8]="program";

staticcharstr[]="program";字符串字符串常量,例如:"china"沒有字符串變量,用字符數(shù)組來存放字符串字符串以'\0'為結(jié)束標(biāo)志字符數(shù)組的初始化

字符串第105頁/共118頁106#include<iostream>usingnamespacestd;intmain(){staticcharc[10]={'I','','a','m','','a','','b','o','y'};inti;for(i=0;i<10;i++)cout<<c[i];cout<<endl;}運(yùn)行結(jié)果:Iamaboy

字符串例6-22輸出一個(gè)字符串第106頁/共118頁107#include<iostream>usingnamespacestd;intmain(){staticchardiam

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論