技能培訓三知識講解_第1頁
技能培訓三知識講解_第2頁
技能培訓三知識講解_第3頁
技能培訓三知識講解_第4頁
技能培訓三知識講解_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

主講人:曹宣俊C++面向對象程序設計2025/1/6目錄指針與引用比較函數重載函數指針鏈表面向對象設計思想類和對象2025/1/6指針與引用比較指針與引用都是間接引用其他對象。首先,要認識到在任何情況下都不能使用指向空值的引用。一個引用必須總是指向某些對象。因此如果你使用一個變量并讓它指向一個對象,但是該變量在某些時候也可能不指向任何對象,這時你應該把變量聲明為指針,因為這樣你可以賦空值給該變量。相反,如果變量肯定指向一個對象,例如你的設計不允許變量為空,這時你就可以把變量聲明為引用。

2025/1/6指針與引用比較char*pc=0;//設置指針為空值

char&rc=*pc;//讓引用指向空值

這是非常有害的,毫無疑問。結果將是不確定的(編譯器能產生一些輸出,導致任何事情都有可能發(fā)生)。2025/1/6指針與引用比較不存在指向空值的引用這個事實意味著使用引用的代碼效率比使用指針的要高。因為在使用引用之前不需要測試它的合法性。

voidprintDouble(constdouble&rd)

{

cout<<rd;//不需要測試rd,它

}//肯定指向一個double值

相反,指針則應該總是被測試,防止其為空:

voidprintDouble(constdouble*pd)

{

if(pd){//檢查是否為NULL

cout<<*pd;

}

}

2025/1/6指針與引用比較指針與引用的另一個重要的不同是指針可以被重新賦值以指向另一個不同的對象。但是引用則總是指向在初始化時被指定的對象,以后不能改變。

strings1("Nancy");

strings2("Clancy");

string&rs=s1;//rs引用s1

string*ps=&s1;//ps指向s1

rs=s2;//rs仍舊引用s1,

//但是s1的值現(xiàn)在是

//"Clancy"

ps=&s2;//ps現(xiàn)在指向s2;

//s1沒有改變

2025/1/6指針與引用比較總的來說,在以下情況下你應該使用指針,一是你考慮到存在不指向任何對象的可能(在這種情況下,你能夠設置指針為空),二是你需要能夠在不同的時刻指向不同的對象(在這種情況下,你能改變指針的指向)。如果總是指向一個對象并且一旦指向一個對象后就不會改變指向,那么你應該使用引用。

還有一種情況,就是當你重載某個操作符時,你應該使用引用。最普通的例子是操作符[]。這個操作符典型的用法是返回一個目標對象,其能被賦值。

vector<int>v(10);//建立整形向量(vector),大小為10;

v[5]=10;//這個被賦值的目標對象就是操作符[]返回的值

如果操作符[]返回一個指針,那么后一個語句就得這樣寫:

*v[5]=10;

但是這樣會使得v看上去象是一個向量指針。因此你會選擇讓操作符返回一個引用。

當你知道你必須指向一個對象并且不想改變其指向時,或者在重載操作符并為防止不必要的語義誤解時,你不應該使用指針。而在除此之外的其他情況下,則應使用指針2025/1/6函數類別內部函數和外部函數內部函數:內部函數時是在定義它的文件中可以被調用的函數,而在同一程序的其他文件中不可調用,定義內部函數的格式如下:static類型說明函數名(參數表){

函數體;}2025/1/6函數類別外部函數:外部函數是作用域在整個程序中的函數,包含組成該程序的若干個文件。外部函數的定義格式如下:[extern]類型說明函數名(參數表)2025/1/6函數重載所謂重載就是賦給同一個函數名不同的含義。具體的講,c++中允許在相同的作用域內以相同的名字定義幾個不同實現(xiàn)的函數,可以是類成員函數,也可以是普通的函數。但是,定義重載函數時要求同名函數的參數至少有一個類型不同,或者個數不同,否則會造成二義性。而對返回值沒有要求。2025/1/6函數指針定義方式數據類型(*函數名)(參數列表);

應用(小學生四則混合運算綜合程序設計):要求:一張試卷包含十道題目 題目隨機產生 考生做完后可以查看得分intadd(intleft,intright){ returnleft+right;}intsub(intleft,intright){ returnleft+right;}2025/1/6函數指針intmultiply(intleft,intright){ returnleft*right;}intdivide(intleft,intright){ if(right==0) return-1; returnleft/right;}2025/1/6函數指針structTopic{ intleft; charop; intright; intresult; intkey; boolflag;};structPaper{ intnum; Topic*topics; charname[15]; intscore;};2025/1/6函數指針Paper*createPaper(char*name){ Paper*paper=newPaper; strcpy(paper->name,name); paper->topics=newTopic[10]; paper->num=10; charop[4]={'+','-','*','/'}; for(inti=0;i<10;++i) { intwhichop=rand()%4; intleft=rand()%100; intright=rand()%100;

paper->topics[i].left=left; paper->topics[i].right=right; paper->topics[i].op=op[whichop]; } returnpaper;}2025/1/6函數指針intgetResult(intleft,intright,charop){ int(*fun)(int,int); switch(op) { case'+': fun=add; break; case'-': fun=sub; break; case'*': fun=multiply; break; case'/': fun=divide; break; default: break; } returnfun(left,right);}2025/1/6函數指針voidtestSystem(){ cout<<"***************************小學生四則混合運算"; cout<<"***************************"<<endl; charname[15]={0}; cout<<"請輸入考生姓名:"; cin>>name; Paper*paper=createPaper(name); intcount=0; for(inti=0;i<paper->num;++i) { intresult;cout<<paper->topics[i].left<<paper->topics[i].op<<paper->topics[i].right<<"="; cin>>result;paper->topics[i].result=result; paper->topics[i].key=getResult(paper->topics[i].left,paper->topics[i].right,paper->topics[i].op); if(result==paper->topics[i].key) {paper->topics[i].flag=true;++count;} else {paper->topics[i].flag=false;} } paper->score=count*100/paper->num; cout<<"恭喜您得了"<<paper->score<<"分"<<endl; deletepaper;}2025/1/6函數指針voidmain(){ testSystem();}2025/1/6鏈表實現(xiàn)數據結構程序=算法+數據結構常見數據結構分類 數組 集合 線性表 樹結構 圖結構2025/1/6線性表單向鏈表結點定義structlink { intdata;//數據域 link*next;//指針域 };數據域指針域數據域指針域A結點B結點2025/1/6單向鏈表的實現(xiàn)link*createSingleLink(){ inta[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; link*head=newlink; head->data=a[0]; head->next=NULL; link*tmp=head; for(inti=1;i<15;++i) { link*newnode=newlink; newnode->data=a[i]; newnode->next=NULL; tmp->next=newnode; tmp=newnode; } returnhead;}2025/1/6單向鏈表的實現(xiàn)voidprint(link*head){ while(head!=NULL) { cout<<head->data<<endl; head=head->next; }}voidmain(){ link*head=createSingleLink(); print(head);}2025/1/6雙向表雙向鏈表結點定義structlink { intdata;//數據域

link*prev;//指針域 link*next;//指針域 };2025/1/6雙向表應用舉例:有15個人圍成一圈,輪流按1,2,3報數,報到3的人退出圈子。下一個人報1,問最后一個人是誰?2025/1/6雙向表#defineN15inta[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};charch[15]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o'};structlink { intdata;//數據域

link*prev;//指針域

link*next;//指針域

};2025/1/6雙向表link*createDleLink(){

link*head=newlink; head->prev=head->next=NULL; head->data=a[0]; link*tmp=head; for(inti=1;i<N;++i) { link*newnode=newlink; newnode->data=a[i]; newnode->next=NULL; newnode->prev=tmp; tmp->next=newnode; tmp=newnode; } tmp->next=head; head->prev=tmp; returnhead;}2025/1/6intgetLast(link*phead){ intcount=N; intstep=3; intseq=1; link*head=phead; while(count>1) { if(seq==step) { link*tmp=head->next; head->prev->next=head->next; head->next->prev=head->prev;

deletehead; head=tmp; seq=1; --count; } else { head=head->next; ++seq; }

} returnhead->data;}2025/1/6雙向表voidapp(){ link*head=createDleLink(); cout<<ch[getLast(head)]<<endl;}voidmain(){ app();}2025/1/6面向對象程序設計思想從現(xiàn)實世界中客觀存在的事物(對象)出發(fā)來構造系統(tǒng),并在系統(tǒng)構造中盡可能地運用人類的自然思維方式。2025/1/6以面向對象思想構造軟件系統(tǒng)的主要內容1、對象是以面向對象方法構造的系統(tǒng)的基本單位。對象是對問題域中客觀存在的事物的抽象。2、對象的屬性和操作組成一個完整的對象,對象具有一定的對外接口,外界對象可以通過該接口來訪問對象。3、以對象為基礎,對對象分類,將具有共同特性的對象進行抽象,形成對這些對象的抽象描述——類,每個對象就是該類的一個實例。2025/1/64、對形成的對象類進一步抽象,抽出這些類的共同特征,形成基本的類和派生的類,派生的類又可以具有更多的派生類,這樣就形成一個類簇?;绢惡团缮惖年P系稱為繼承。5、一個系統(tǒng)就是由各個對象組成,對象和對象之間存在靜態(tài)關系和動態(tài)關系。靜態(tài)關系體現(xiàn)了對象之間固有的關系;動態(tài)關系是對象之間通過發(fā)送消息進行通信,相互協(xié)作,完成系統(tǒng)功能。2025/1/6面向對象程序方法面向對象方法是利用抽象、封裝等機制,借助于對象、類、繼承、消息傳遞等概念進行軟件系統(tǒng)構造的軟件開發(fā)方法。2025/1/6面向對象方法的形成1、面向對象程序設計語言的三階段☆發(fā)生☆發(fā)展☆成熟2025/1/6面向對象方法的形成2、Smalltalk語言

Smalltalk是第一個完善的、實用的純面向對象的語言。它有三個特點:(1)將任何東西都看成對象,包括類本身。對對象的方法的調用在Smalltalk中稱為發(fā)送消息給對象。2025/1/6Smalltalk語言(2)不進行任何類型檢查操作,強調多態(tài)性和動態(tài)連接。(3)Smalltalk不僅是一種語言,它還是一個具有類庫支持和交互式圖形擁護界面的完整的程序設計環(huán)境。2025/1/6面向對象程序設計語言的分類(1)純粹的面向對象程序設計語言完全依照面向對象思想而設計的,它的所有語言成分都以對象為核心。如:Smalltalk、Eiffel、Actor和JAVA等2025/1/6面向對象程序設計語言的分類(2)混合的面向對象程序設計語言在某種已經被廣泛使用的其他語言的基礎上增加了支持面向對象思想的語言成分。如:ObjectC、C++、ObjectPascal、和CLOS等2025/1/6類和對象類的定義格式class類名{ public: 成員函數或數據成員的說明;

private: 數據成員或成員的說明;};

2025/1/6類和對象公有成員:可以被程序中任何代碼訪問;私有的成員只能被類本身的成員函數及友元類的成員函數訪問,其他類的成員函數,包括其派生類的成員函數都不能訪問他們:保護的成員與私有成員類似,只是除了類本身的成員函數和說明為友元類的成員函數可以訪問保護成員外,該類的派生類成員也可以訪問。2025/1/6舉例classA{ private:inti;protected: intj;public:intk;intgeti(){returni;}intgetj(){returnj;}intgetk(){returnk;}};2025/1/6下面是訪問類A的對象a中數據成員的各種情況:Aa;//定義類A的對象aa.i;//非法,i為A的私有成員a.j;//非法,j為A的保護成員a.k;//合法,k為A的公有成員本例的所有成員函數都是在類體中。若在類體外實現(xiàn)。若在類體外實現(xiàn),需要使用作用域運算符::,用它來標識某個成員函數是屬于哪個類的。該運算符在這里使用的格式如下:類名::函數名(參數表)intA::geti(){ returni;}2025/1/6對象普通對象定義在定義了一個類以后,定義其對象的一般格式如下:類名對象名表;對象指針定義類名*對象指針名表;Aa1,a2,*p;2025/1/6對象數組對象數組是指數組元素為對象的數組。該數組中若干個元素必須是同一個類的若干個對象。對象數組的定義,賦值和引用與普通數組一樣,只是數組的元素與普通數組不同,它是同類的若干個對象。類名數組名[大小]…SampleArray[5];2025/1/6構造函數和析構函數構造函數構造函數功能:在創(chuàng)建對象時使用給定的值將對象初始化。構造函數的特點:(1)構造函數是成員函數,函數體可放在類體內,也可放在類體外。(2)構造函數是一個特殊的函數,該函數的名字與類名相同,且不指定類型說明,它有隱含的返回值,該值由系統(tǒng)內部使用。該函數可以有一個參數,也可以有多個參數2025/1/6構造函數和析構函數(3)構造函數可以重載,即可以定義多個參數不同的函數。(4)程序中不能直接調用構造函數,在創(chuàng)建對象時系統(tǒng)自動調用構造函數。和一般成員函數類似,類的構造函數可以帶有參數,也可以重載,構造函數的重載表示類對象的不同的初始化方式。不帶任何參數的構造函數為默認構造函數。2025/1/6示例程序一classSample{ intn;

public:

Sample(){n=0;}; Sample(inti){n=i;} void

溫馨提示

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

評論

0/150

提交評論