C++面向对象程序设计课件_第1页
C++面向对象程序设计课件_第2页
C++面向对象程序设计课件_第3页
C++面向对象程序设计课件_第4页
C++面向对象程序设计课件_第5页
已阅读5页,还剩414页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C++面向對象程式設計第一章

面向对象程序设计概述

1.1.1面向過程程式設計的基本概念

考慮一個銀行系統,該系統允許顧客開設不同類型的銀行帳戶,包括現金賬戶、支票帳戶和貸款帳戶,同時允許顧客存款、取款和轉帳。首先考慮數據結構:structaccount{char*name;/*姓名*/unsignedlongaccountId;/*帳號*/floatbalance;/*餘額*/floatinterestYTD;/*年利息*/characcountType;/*帳戶類型(現金x、支票z和貸款d)};

1.1什麼是面向對象程式設計1

再考慮用三個過程分別負責存款、取款和轉帳。我們可以三個C函數:

MakeDeposit()

WithDraw()

Transfer()這種數據結構與過程分離有很多問題,例如增加一種帳戶類型---退休帳戶(t),則三個C函數都必須重新編寫。21.1.2面向對象程式設計的基本概念

面向對象程式設計是一種新的程式設計範型。面向對象程式的主要結構特點是:第一,程式一般由類的定義和類的使用兩部分組成,在主程序中定義對象並規定它們之間傳遞消息的規律;第二,程式中的一切操作都是通過向對象發送消息來實現的,對象接收到後,啟動有關方法完成相應操作。數據與定義在它上面的用戶需要的操作構成一個整體。當把對銀行帳戶的操作定義在數據上,銀行帳戶就是一個類,稱為銀行帳戶類。我們可以建立許多具體的銀行帳戶,而每一個具體的銀行帳戶就是銀行帳戶類的一個對象。3classBankAccount{char*name;/*姓名*/unsignedlongaccountId;/*帳號*/floatbalance;/*餘額*/floatinterestYTD;/*年利息*/public:voidMakeDeposit(floatamount);floatWithDraw(floatamount);boolTransfer(BankAccount&to,floatamount);};41.2對象與類1.2.1對象與類概念對象是現實世界的一個實體,其特性是:

(1)每一個必須有一個名字以區別於其他對象;

(2)用屬性來描述它的某些特徵;

(3)有一組操作,每一個操作決定對象的一種行為。類是一組具有共同的屬性特徵和行為特徵的對象的抽象。類名:教師類對象對象屬性:姓名:字串年齡:整數學歷:字串職稱:字串專業:字串動作:說自己的年齡吃飯授課屬性:姓名:黎明年齡:30

學歷:博士職稱:教授專業:電腦軟體動作:說自己的年齡吃飯授課屬性:姓名:

年齡:

學歷:

職稱:

專業:動作:說自己的年齡吃飯授課5什麼是對象(object)對象是面向對象(O-O)方法的核心。關於對象可以從如下幾點說明:*對象是人們要進行研究(感興趣)的任何事物,從最簡的整數到航太飛都可以看成對象

1)有形的實體。指一切看得見摸得著的實物。

2)作用。指人或組織所起的作用。醫生、公司、部門等。

3)事件。在特定時間發生的事。如飛行、演出、開會等。

4)性能說明。如機床廠對機床的性能說明。對象不僅能表示結構化的數據,而且也能表示抽象的事件、規則以及複雜的工程實體。因此對象具有很強制表達能力和描述功能。*對象實現了數據與操作結合對象有狀態用來描述它的某些特徵,通常用數據來描述。對象還應當有操作,用以改變對象的狀態,對象及其操作就是對象的行為。為此改變了傳統方法中將數據與操作(亦稱函數或過程)相分離的做法,實現了將數據與操作封裝在對象的統一體中。6*對象應具有唯一識別的功能對象有唯一對象識別字(ObjectIdentify,簡稱OID)它可唯一,且永久地標識對象。即使二完全一樣的茶杯也是二個對象有甲、乙之分*對象必須參與一個或一個以上的對象類。對象應參與對象類,並是類的一個實例。*有自己內部的和對外部的動作,稱為操作。*可以通過指令、命令或稱消息發動它的動作。總之對象是現實世界中可以區分的一個事、物,它有獨立性又有相關性。7對象類(Objectclass)對象類是(O-O)方法的一個重要抽象概念,稱類。將具有相同結構、操作,並遵守相同約束規則的對象聚合成一組,這組對象集合就稱為類。它是把許多對象進行抽象。如茶杯有不同大小的茶杯,不同材料,不同形狀,可哥完全相同的許多茶杯----茶杯的類具體對類進行定義時,最低限度應包括如下內容:1)類名。2)內部表示。3)對外介面。對於操縱類實例——對象的外部可施力的操作。4)介面如何在內部動作的。內部實現。對類的一個具體稱為對象或實例或實體。類最鮮明的特色是將數據的結構與數據的操作都封裝在類中,並實現了類的外部特性與類實現的隔離。也就實現了將使用類和對象的使用者,與具體設計對象和類的開發者區分開,從而有良好的模組化特性進而為複雜大系統的分析、設計,實現提供先進的方法。81.2.2對象的狀態

我們可以把對象看成是一個帶有狀態和行為的活的實體。類的屬性的具體值為對象的狀態。對象的狀態是所有靜態屬性和這些屬性的動態值的總體。屬性:姓名:字串年齡:整數學歷:字串職稱:字串專業:字串對象的狀態不僅僅是初等的數據類型(整數,字串),而且可以是另外的對象作為它的狀態的一部分。

一輛車發動機座位車輪91.2.3對象的交互對象之間的聯繫稱為對象的交互。一個對象向另一個對象發出的請求被稱為消息。方法(Methods)和消息(Messnges)

方法也即類的外部介面的另一種說法,實際就是類對象的某一個操作,要使類對象進行某一種操作,先要給以消息,也可以方法與消息等同。因此,消息是要求對象進行動作的說明或命令或指導,是對象之間相互請求或相互協作的途徑。把發送消息的對象稱為發送者,接收消息的對象稱為接收者。對象間的聯繫,只能通過傳遞消息來進行。對象也只有在收到消息後才能選用方法而被啟動。消息具有三個性質:(1)同一個對象可以接收不同形式的多個消息,做出不同的回應。(2)相同形式的消息可以傳遞給不同的對象,所做出的回應可以是不同的。(3)消息的發送可以不考慮具體的接受者,對象可以回應消息,也可以不回應。10C++語言中對類、對象、方法、消息的實現實例Classperson{private:charname[20];intage;charadd[40];charsex;voidprintname(){cout<<name;}\\私有消息

voidprintage(){cout<<age;}voidprintadd(){cout<<add;}voidprintsex(){cout<<sex;}public:voidprintme(){printname();\\公有消息

printage();printadd();printsex();}};//這是類,有類名person,內部表示數據,提供外部介面printme()及實現。有了這個類就可以定義各種各樣的人(對象),及給對象一個資訊(消息),他就會自報家門。11#include<iostream.h>main(){persony;//y是對象

y.printme();//這是消息,向對象y發送了方法printme()的消息。}*注*假定y己有初值數據,如何給初值以後構造函數中實現。

printme();y.printname;y.printage;等都是錯誤的。121.3數據的抽象與封裝1.3.1現實世界中的抽象與封裝1.3.2數據的抽象與封裝的基本概念

將數據結構和作用於數據結構上的操作組成一個實體,數據的表示方式和對數據的操作細節被隱藏起來,用戶通過操作介面對數據進行操作。這就是數據的封裝。

對象的封裝是:(1)對象具有一個清楚的邊界,對象的私有數據、成員函數的細節被封裝在該邊界內;(2)具有一個描述對象與其它對象如何相互作用的介面,該介面必須說明消息傳遞的使用方法;(3)對象內部的代碼和數據應受到保護,其他對象不能直接修改。131.3.3對象的特性(1)封裝性封裝是指將一個數據和與這個數據有關的操作集合放在一起形成一個能動的實體-----對象,有一個清楚的邊界包裝,對象,類的所有私有數據內部程式(成員函數)的細節都被固定在這個邊界內。具有一個介面,這個介面描述了對象對外界的消息、方法和回應。對象受封殼保護,外界不能直接修改使用本對象所擁有的數據和代碼。(2)模組獨立性(3)動態連接性(4)易維護性141.4繼承性1.4.1繼承的概念以面向對象程式設計的觀點來看,繼承所表達的是對象類之間相關的關係。這種關係使得某類對象可以繼承另外一類對象的特徵和能力。類之間具有繼承關係,則有下列特性:(1)類間具有共用特性(包括數據和程式代碼的共用);(2)類間具有判別或新增部分(包括非共用的數據和程式代碼);(3)類間具有層次結構。假設有兩個類A和B,若類B繼承類A,則屬於類B中的對象具有類A的一切特徵(包括數據屬性和操作),這時,我們稱被繼承類A為基類或父類或超類;而稱繼承類B為類A的派生類或子類。同時我們還可以說,類B是從類A中派生出來的。如果類B從類A派生出來,而類C又是從類B派生出來的,就構成了類的層次。繼承機制允許派生類繼承基類的數據和操作(即數據成員和成員函數),也就是說,允許派生類使用基類的數據和操作。同時派生類還可以增加新的操作和數據。151.4.2繼承的分類從繼承源上分,繼承分為單繼承和多繼承。從繼承內容上劃分,繼承可分為取代繼承、包含繼承、受限繼承、特化繼承等。161.4.3繼承與封裝的關係

在面向對象系統中,封裝的單位是對象,也就是說,把一個屬於某一類的對象封裝起來,使其數據和操作成為一個整體。一個對象,無論它是基類的實例,還是派生類的實例,都是一個被封裝的實體。因此,我們得出結論:繼承機制的引入並不影響對象的封裝性。繼承是類之間的相交關係,即類間的繼承關係。要進行類間繼承它們之間應有:類間具有共用特徵(包括數據和程式共用)類間具有細微的差別或有新增部分(非共用的數據和代碼)類間具有層次結構

從繼承源上劃分: 單繼承和多繼承 從繼承內容上劃分:繼承可以對數據(結構特性)的繼承又具有操作(行為)的繼承。

171.5多態性

1.5.1什麼是多態性

面向對象系統的多態性是指不同的對象收到相同的消息時產生多種不同的行為方式。1.5.2重載的概念重載一般包括函數重載和運算符重載。函數重載是指一個識別字可同時用於為多個函數命名,而運算符重載是指一個運算符可同時用於多種運算。多態性:指接收同一個消息名後,對象可以採用多種不同的行為(態度)重載概念:即可以有同名函數。同一運算符可以定義成不同的操作。虛函數概念:指類繼承和派生中可以用相同函數名,但不同的實現版本。抽象類的概念:可以定義一種類,這種類中有虛函數,因此不能有具體對象的類,稱抽象類。182.1.1C++的起源2.1.2C++的特點

*.cC的根源程式以下的檔C和C++都可用:

*.hC的頭包含檔

*.cppC++的根源程式

*.hppC++的頭包含檔

/**/C的注釋

//<CR>C++的注釋2.1C++的起源和特點12.2C++根源程式的構成2.2.1C++程式的一般格式〖例2.1〗說明C++構造的示例程式#include<iostream.h>//系統頭檔intadd(inta,intb);//函數原型的說明intmain()//主函數{intx,y,sum;//定義三個整型變數

cout<<"輸入二個數:"<<'\n';//介面:提示用戶輸入二個數

cin>>x;//從鍵盤輸入變數x的值

cin>>y;//從鍵盤輸入變數y的值

sum=add(x,y);//調用函數add,將函數返回值賦給變數sumcout<<"二數和是:"<<sum<<'\n';//輸出

return0;}intadd(inta,intb)//定義函數add,函數(返回)值為整型{intc;//定義臨時變數cc=a+b;//求和

returnc;//將c的值返回,通過add帶回調用處}22.2.2C++程式的結構特點1.注釋2.包含檔及頭檔3.語句4.標準輸入與輸出

printf(格式說明,運算式表列);scanf(格式說明,地址表列);cout<<cin>>5.新行“\n”endl6.主函數

voidmain(){…….}7.一般的函數函數頭intadd(inta,intb)

函數體{intc;//變數定義

c=a+b;//執行部分

returnc;}32.3C++在非面向對象方面的一些特性2.3.1注釋行/**/C的注釋

//<CR>C++的注釋2.3.2新的I/O流cin是標準輸入流,在程式中代表標準輸入設備,即鍵盤。運算符“>>”表示向右cout是標準輸出流,在程式中代表標準輸出設備,即螢幕。運算符“<<”表示向左使用cin或cout進行I/O操作時,在程式中必須嵌入頭檔iostream.h//例2.2#include<iostream.h>intmain(){charname[20];cout<<"Hello,yourname:";cin>>name;cout<<name<<endl;return0;}//例2.3#include<iostream.h>voidmain(){intx=25;cout<<hex<<x<<’'<<dec<<x<<''<<oct<<x<<'\n';}42.3.3靈活的局部變數說明intf(){inti;i=10;intj;j=25;for(intk=5;k>=0;k--)…..…….}以上的寫法在C程式中都是錯誤的,但在C++程式中都是正確的。52.3.4結構、聯合和枚舉名可直接作為類型名定義枚舉類型名:enumbool{FALSE,TRUE};定義結構枚舉類型名:Structstudent{intsno;char*sneme;};C語言中定義枚舉類型變數:enumbooldone;定義結構類型變數:structstudents1,s2;C++語言中定義枚舉類型變數:booldone;定義結構類型變數:students1,s2;62.3.5const修飾符#defineLIMIT100這裏LIMIT是一個標誌,代表100constintLIMIT=100;這裏LIMIT是一個常量名,在內存有空間放了100,因此有地址,可以用指針指向這空間,但不能修改它。inti=100;這裏i是一個變數名,在內存有空間放了100,因此有地址,可以用指針指向這空間,且可以改放別的整數。(1)可以用一個指向常量的指針變數指向常量:

constchar*name=“chen”;name[3]=‘a’;//錯誤

name=“zhang”;//正確(2)指針常量

char*constname=“chen”;name[3]=‘a’;//正確

name=“zhang”;//錯誤(3)constchar*constname=“chen”;namechen常量zhang常量nXanamechenzhang常量anaX7//例2.4#include<iostream.h>main(){inta=1;#defineT1a+a#defineT2T1-T1cout<<"T2is"<<T2<<endl;return0;}

cout<<“T2is“<<a+a-a+a<<endl;//例2.5#include<iostream.h>main(){inta=1;constT1=a+a;constT2=T1-T1;cout<<"T2is"<<T2<<endl;return0;}T2a+aa+aT1-T182.3.6內置函數//例2.6#include<iostream.h>intmain()3次{for(inti=1;i<=3;i++)cout<<"r="<<i<<"area="<<circle(i)<<endl;return0;}在函數前加以inline,成為內置函數#include<iostream.h>intmain()代碼嵌入{for(inti=1;i<=3;i++)cout<<"r="<<i<<"area="<<circle(i)<<endl;return0;}floatcircle(floatr){return3.1416*r*r;}inlinefloatcircle(floatr){return3.1416*r*r;}9//例2.7#include<iostream.h>#definedoub(x)x*2intmain(){for(inti=1;i<=3;i++)cout<<i<<"doubledis"<<doub(i)<<endl;cout<<"1+2doubledis"<<doub(1+2)<<endl;return0;}//例2.8#include<iostream.h>inlineintdoub(intx){returnx*2;}intmain(){for(inti=1;i<=3;i++)cout<<i<<"doubledis"<<doub(i)<<endl;cout<<"1+2doubledis"<<doub(1+2)<<endl;return0;}102.3.7函數原型返回類型函數名(參數表);//例2.9#include<iostream.h>voidwrite(char*s);//函數原型或叫函數申明

voidmain(){write("Hello,world!");}voidwrite(char*s)無分號

{cout<<s<<endl;}112.3.8帶有缺省參數的函數C++在說明函數原型時,可以為一個或多個參數指定缺省參數值,以後調用此函數時,若省略其中某一實參,C++自動以缺省值作為相應參數的值。intspecial(intx=5,floaty=5.3);合法的調用;special();special(25);special(100,79.8);說明:(1)所有取缺省值參數都必須出現在不取缺省值參數的右邊。

intfun(inti,intj=5,intk)是錯誤的

intfun(inti,intk,intj=5)是正確的(2)調用時,若某個參數省略,則其後的參數皆應省略。不合法的調用;special(,21.5);122.3.9函數重載C++中,只要函數的參數的類型不同,或者參數個數不同,或者二兼有之,幾個函數可以用相同的函數名。稱為函數重載//**例2.10#include<iostream.h>intsquare(inti){returni*i;}floatsquare(floatf){returnf*f;}doublesquare(doubled){returnd*d;}voidmain(){inti=12;floatf=3.4;doubled=5.67;cout<<i<<'*'<<i<<'='<<square(i)<<endl;cout<<f<<'*'<<f<<'='<<square(f)<<endl;cout<<d<<'*'<<d<<'='<<square(d)<<endl;}13//**例2.11#include<iostream.h>intmul(intx,inty){returnx*y;}intmul(intx,inty,intz){returnx*y*z;}voidmain(){inta=3,b=4,c=5;cout<<a<<'*'<<b<<'='<<mul(a,b)<<endl;cout<<a<<'*'<<b<<'*'<<c<<'='<<mul(a,b,c)<<endl;}說明:(1)重載函數應在參數個數或參數類型上有所不同,編譯才能識別調用哪一個重載版本,即使返回類型不同也不行。如:intmul(intx,inty);和doublemul(intx,inty);是不能重載的。(2)一般而言,重載函數應對不同的參數情況執行相同的功能。如:abs(intx);和abs(floatx);都是求絕對值,一個是整數的絕對值,一個是實數的。142.3.10作用域運算符::當全局變數和局部變數同名時,函數中不能使用全局變數。//**例2.12#include<iostream.h>intavar=10;//全局變數voidmain(){intavar=25;//局部變數

cout<<"avaris"<<avar<<endl;}

局部變數可用作用域運算符:://**例2.13#include<iostream.h>intavar;voidmain(){intavar;avar=25;//局部變數avar::avar=10;//全局變數avarcout<<"localavar="<<avar<<endl;cout<<"globalavar="<<::avar<<endl;}152.3.11無名聯合C語言的共用體:uniondata{inti;charch;floatf;}uniondataa,b,c;引用:a.ia.cha.f等C++的無名聯合:union{inti;charch;floatf;}直接可用ichf等16a4位元組ichf2.3.12強制類型轉換C語言的強制類型轉換:inti=10;floatx=(float)i;C++的強制類型轉換:inti=10;floatx=float(i);floaty=(float)i;兩種方法C++都可以。172.3.13new和deleteC語言用函數malloc()和free()動態分配記憶體和釋放動態分配的記憶體。C++使用運算符new和delete能更好、更簡單地進行記憶體的分配和釋放。如C語言中用:

int*p;p=(int*)malloc(sizeof(int));*p=10;

而C++語言中//**2.14#include<iostream.h>voidmain(){int*p;//定義一個整型指針變數pp=newint;//動態分配一個整型存儲區,並把首地址賦給p*p=10;cout<<*p<<endl;deletep;//釋放p指的空間,撤銷指針p}new和delete的優點:(1)new可以自動計算所要分配記憶體的類型的大小,而不必用sizeof來計算。p18(2)new能夠自動返回正確的指針類型,而不必進行類型轉換。(3)可以用new將分配的對象初始化。(4)new和delete都可以被重載,允許建立自定義的分配系統。說明:(1)使用new可以為數組動態分配記憶體空間。

int*pi=newint[10];int*pi=newint[2][3][4];(2)new可在為簡單變數分配記憶體空間的同時,進行初始化。//**例2.15#include<iostream.h>voidmain(){int*p;p=newint(99);//動態分配記憶體,並將99作為初始值賦給它

cout<<*p<<endl;deletep;}(3)釋放動態分配的數組存儲區:

delete[]p;19(4)使用動態分配記憶體時,分配失敗,將返回空指針(NULL)。因此通常要對內存的動態分配是否成功進行檢查。分配記憶體失敗,p=NULL//**例2.16#include<iostream.h>voidmain(){int*p;p=newint;if(!p)//若分配記憶體失敗

{cout<<"allocationfailure\n";return;}*p=20;cout<<*p<<endl;deletep;}pNULL202.3.14引用引用可為變數起別名,主要有變數的引用、函數參數的引用、函數返回值的引用。1.引用變數type&//**例2.17#include<iostream.h>voidmain(){inti;int&j=i;//i又叫jii=30;jcout<<"i="<<i<<"j="<<j<<"\n";j=80;cout<<"i="<<i<<"j="<<j<<"\n";cout<<“Addressofi”<<&i<<“\n”;//顯示i的地址

cout<<"Addressofj"<<&j<<"\n";}(1)定義引用時,必須立即對它進行初始化,不能以後再賦值。

inti;int&j;//錯誤j=i;21(2)引用實際上是一種隱式指針,可以少用“*”號//**例2.18#include<iostream.h>voidmain(){inti=15;//整型變數iint*iptr=&i;//iptr指向iint&rptr=i;//rptr引用icout<<"iis"<<i<<endl;cout<<"*iptris"<<*iptr<<endl;cout<<"rptris"<<rptr<<endl;i=29;cout<<"Afterchangingito29"<<endl;cout<<"iis"<<i<<endl;cout<<"*iptris"<<*iptr<<endl;cout<<"rptris"<<rptr<<endl;}iis15iis29*iptris15*iptris29rptris15rptris29iptrirptr22(3)引用不可重新賦值,不可使其作為另一個變數的別名。inti,k;int&j=i;j=&k;//錯誤(4)引用不同於普通變數。int&b[3];//不能建立引用數組int&*p;//不能建立指向引用的指針int&&r;//不能建立引用的引用(5)當使用取地址運算符時&,取的是被引用變數的地址。intnum=50;int&ref=num;int*p=&ref;則p中保存的是變數num的地址。2.引用參數引用參數的方法可以代替C語言中的指針地址調用的方式。23//**例2.19C語言中的指針地址調用的方式#include<iostream.h>voidswap(int*m,int*n){inttemp;temp=*m;*m=*n;*n=temp;}voidmain(){inta=5,b=10;cout<<"a="<<a<<"b="<<b<<endl;swap(&a,&b);cout<<"a="<<a<<"b="<<b<<endl;}a=5b=10a=10b=524m&aatemn&bb//**例2.20引用參數的方法#include<iostream.h>voidswap(int&m,int&n){inttemp;temp=m;m=n;n=temp;}main(){inta=5,b=10;cout<<"a="<<a<<"b="<<b<<endl;swap(a,b);cout<<"a="<<a<<"b="<<b<<endl;return0;}a=5b=10a=10b=525matemnb3.引用返回值函數可返回一個引用,其目的是可將函數用在賦值運算符的左邊。//**例2.21#include<iostream.h>inta[]={1,3,5,7,9};int&index(int);//聲明返回引用的函數voidmain(){index(2)=25;//將a[2]重新賦值為25cout<<index(2)<<endl;}int&index(inti){returna[i];}264.引用舉例例2.21//引用參數和引用返回值#include<iostream.h>int&max(int&num1,int&num2);int&min(int&num1,int&num2);main(){intnum1,num2;cout<<"輸入第一個數:";cin>>num1;cout<<"輸入第二個數:";cin>>num2;max(num1,num2)=0;cout<<"\n把大的數置成0後,這兩個數是:";cout<<'\n'<<num1<<"和"<<num2<<'\n';cout<<"\n再一次輸入二個數:\n";cout<<"輸入第一個數:";cin>>num1;cout<<"輸入第二個數:";cin>>num2;27min(num1,num2)=0;cout<<"\n把小的數置成0後,這兩個數是:";cout<<'\n'<<num1<<"和"<<num2<<'\n';return0;}int&max(int&num1,int&num2)//兩數中找大數{return(num1>num2)?num1:num2;}int&min(int&num1,int&num2)//兩數中找小數{return(num1<num2)?num1:num2;}運行結果:輸入第一個數:45輸入第二個數:78把大的數置成0後,這兩個數是:45和0再一次輸入二個數:輸入第一個數:13輸入第二個數:56把小的數置成0後,這兩個數是:0和56282.4存儲類存儲類類型修飾符類型變數名表列;存儲類autostaticexternregister類型修飾符constvolatile2.4.1自動變數和寄存器變數2.4.2靜態變數2.4.3外部變數292.5基本運算符和運算式2.5.1關係運算符2.5.2算術運算符2.5.3邏輯運算符2.5.4位運算符2.5.5條件運算符2.5.6逗號運算式2.5.7sizeof運算符2.6賦值及運算順序2.7類型轉換302.8語句2.8.1運算式語句、空語句和塊語句2.8.2選擇語句

1.if語句

2.switch語句2.8.3迴圈

1.while語句

2.dowhile語句

3.for語句2.8.4轉移

1.break與continue語句

2.goto語句2.8.5return語句312.9函數2.9.1函數的基礎知識

函數先聲明再調用後定義的例子

#include<iostream.h>voidmain(){inta,b,c;intsum(int,int);//先申明sum()函數

a=25;b=36;c=sum(a,b);//調用sum()函數

cout<<c<<endl;}intsum(intx,inty)//定義sum()函數

{inttemp;temp=x+y;returntemp;}32//習題函數(7.1)#include<stdio.h>voidmain(){intm,n,l,s;intmaxj(inta,intb);intminb(inta,intb);printf("輸入個正整數:");scanf("%d,%d",&m,&n);if(m>0&&n>0){l=maxj(m,n);s=minb(m,n);printf("%d和%d的最大公約數為%d\n",m,n,l);printf("%d和%d的最小公倍數為%d\n",m,n,s);}elseprintf("輸入了負數!\n");return;}intmaxj(inta,intb){intr,t;if(a<b){t=a;a=b;b=t;}r=a%b;while(r!=0){a=b;b=r;r=a%b;}returnb;}intminb(inta,intb){intr;r=maxj(a,b);if(r!=0)returna*b/r;elsereturn0;}sln78m56trb78a56rb78a5633//習題函數(7.5)#include<iostream.h>#include<stdio.h>#include<string.h>voidmain(){chara[255];voidconvert(charb[]);printf("請輸入一個字串:\n");gets(a);convert(a);printf("該字串反序為:\n");puts(a);return;}voidconvert(charb[]){intl,i;charc;l=strlen(b);for(i=0;i<=l/2;i++){c=b[i];b[i]=b[l-i-1];b[l-i-1]=c;}return;}caba[1]a[0]b[1]b[0]acbdefa[254]\034m#include<stdio.h>#include<math.h>voidmain(){floata,b,c,d,x[2];voidroot0(floata,floatb,floatc,floatd,floatx[]);voidroot1(floata,floatb,floatc,floatx[]);voidroot2(floata,floatb,floatc,floatd,floatx[]);printf("請輸入一元二次方程的三個係數a,b,c:\n");scanf("%f,%f,%f",&a,&b,&c);if(a<=1e-6)printf("不是一元二次方程!\n");else{printf("方程(%4.1f)x*x+(%4.1f)x+(%4.1f)=0\n",a,b,c);d=b*b-4*a*c;if(d<0){root0(a,b,c,d,x);printf("由於b*b-4*a*c<0因此有二個虛根:\n");printf("x1=%f+%fi\n",x[0],x[1]);printf("x2=%f-%fi\n",x[0],x[1]);}elseif(d==0){root1(a,b,c,x);printf("由於b*b-4*a*c=0因此有一個重根:\n");printf("x1=%f\n",x[0]);printf("x2=%f\n",x[1]);}x[1]x[0]35voidroot2(floata,floatb,floatc,floatd,floatx[]){floatr,i;r=-b/(2*a);i=sqrt(d)/(2*a);x[0]=r-i;x[1]=r+i;}voidroot1(floata,floatb,floatc,floatx[]){x[0]=x[1]==-b/(2*a);}voidroot0(floata,floatb,floatc,floatd,floatx[]){x[0]=-b/(2*a);x[1]=sqrt(-d)/(2*a);}

else{root2(a,b,c,d,x);printf("由於b*b-4*a*c>0因此有二個實根:\n");printf("x1=%f\n",x1);printf("x2=%f\n",x2);}}return;}362.9.2參數傳遞及函數返回值

(1)值傳一般變數

(2)傳地址結構,數組

(3)傳引用一般變數,結構,數組缺省參數2.9.3使用C++系統函數372.10數組定義類型數組名[大小];inta[4;];intb[3][4];intc[2][3][4];使用時數組元素數組名[運算式]a[0]=10;i=3;a[i]=5;b[0][3]=20;

初始值定義時

inta[]={2,4,6,8,10};intb[][3]={{2,4,6},{8,10,12}};382.11指針定義類型*指針變數名;2.11.1使用指針取地址運算符&

取內容運算符*

位移取值[]#include<iostream.h>voidmain(){inta[10]={2,4,6,8,10};for(int*p=a;p<a+10;p++)cout<<p[+0]<<endl;}這裏p[+0]位移+0,等價於*pp=a;p[+2]即*(p+2)p[-i]即*(p-i)392.11.2指針運算1.賦值

intx,*px,*q;px=&x;q=px;表示q和px同指一個地方(q跟著px指)2.比較

px==qq!=px判斷q和px是否同指一個地方

p<q判斷p和q指在數組元素的前後3.移動指針

p=p+3;++--運算

y=*px++;//y=*(px++);y=*++px;//y=*(++px);y=++*px;//y=++(*px);y=(*px)++;402.11.3指針和數組1.指向一維數組的指針inta[4],*p;p=a;或p=&a[0];即p指向a[0];2.指針數組許多個指針變數在一起都可用來指向整數

int*pa[2];char*pc[5][7];

例#include<iostream.h>voidmain(){inta[2][3]={{2,4,6},{8,10,12}};int*pa[2];//有二個指針pa[0]和pa[1]pa[0]=a[0];pa[1]=a[1];for(inti=0;i<2;i++)for(intj=0;j<3;j++,pa[i]++)cout<<"a["<<i<<"]["<<j<<"]=”<<*pa[i]<<endl;}413.指向整個數組的指針(行指針)

如:int(*a)[5];intb[2][5]={0,1,2,3,4,5,6,7,8,9}a=b;ab0123456789#include<iostream.h>voidmain(){int(*a)[5];intb[2][5]={0,1,2,3,4,5,6,7,8,9};a=b;for(inti=0;i<5;i++)cout<<i<<":"<<*(*a+i)<<endl;a++;for(inti=0;i<5;i++)cout<<i<<":"<<*(*a+i)<<endl;}42一維數組的地址

inta[4];

a+0是第0列的地址a+i是第i列的地址

*(a+0)是第0列的數據*(a+i)是第i列的數據地址a數據*a&a[0]a[0]一維數組的指針

inta[4],*p;p=a;

可以p++指針p數據*pa[0]43二維數組的地址*aa[0]

inta[3][4];

*(a+i)+j是第i行第j列地址

*(*(a+i)+j)

a+0是第0行的地址

……….a+i是第i行的地址

*(a+0)是第0行第0列的地址……..*(a+0)+j是第0行第j列的地址

*(a+i)是第i行第0列的地址……...*(a+i)+j是第i行第j列的地址

*(*(a+0)+0)是第0行第0列的數據..(*(a+0)+j)是第0行第j列的數據

*(*(a+i)+0)是第i行第0列的數據….*(*(a+i)+j)是第i行第j列的數據行地址a+0列地址

*(a+0)行地址a+i44二維數組的指針*aa[0]

inta[3][4];(p+i*4+j)是第i行第j列地址

(1)int*p;(小指针)

p=*a;∨p=a;ㄨ

p=a[0];∨

*(p+i*4+j)

p=&a[0][0];∨

元素地址:p=*a+j;

p+j

p++;

元素數據:*p*(p+j)p[j]

*(a+0)是第0行第0列的地址……..*(a+0)+j是第0行第j列的地址

*(a+i)是第i行第0列的地址……...*(a+i)+j是第i行第j列的地址

*(*(a+0)+0)是第0行第0列的數據..(*(a+0)+j)是第0行第j列的數據

*(*(a+i)+0)是第i行第0列的數據….*(*(a+i)+j)是第i行第j列的數據

p當一維數組名用但可p=p+ip++走(i)一行元素地址:*p+j

數據:*(*p+j)(*p)[j]列地址

*(a+0)45structstudent{intnum;floatscore;structstudent*next};structstudent*p;nextnumscore結點#include<stdlib.h>申請空間函數:malloc(位元組數)測試位元組運算符:sizeof(類型)p=(structstudent*)malloc(sizeof(structstudent));釋放空間函數:free(指針);free(p);nextnumscore結點p46p1=p2=(structstudent*)malloc(LEN);scanf(“%d,%f”,&p1->num,&p1->score);nextnumscore結點p1p22010189.5headNULLn=0

1head=p1;headnextnumscorep1p1=(structstudent*)malloc(LEN);20103902(n=2)p2->next=p1;p2=p1;

p2scanf(“%d,%f”,&p1->num,&p1->score);nextnumscore

p10NULLp1->num==047pp0103070811NULLheadp1p2p1p20103070811NULLheadp005p1p01030811headNULLp1p2482.11.4引用

引用可為變數起別名,它主要用作函數參數以及函數的返回類型。有參數引用和返回值引用。

1.引用說明

intnum=50;int&ref=num;

表示放整數50的記憶體空間可叫num,又可叫ref

引用實質上是為另一個變數建立別名。

2.引用參數(傳引用)

493.返回引用的函數當一個函數的返回值需重新賦值的時候,我們也可對返回值進行引用,這時函數可出現在賦值號的左邊。這種函數稱為返回引用的函數。形式類型&函數名(參數)#include<iostream.h>inta[]={2,4,6,8,10,12};int&index(inti);voidmain(){index(3)=16;//index(3)即返回值a[i],i=3,a[3]改為16cout<<index(3)<<endl;cout<<a[3]<<endl;}int&index(inti){returna[i];}注意:返回值是函數內的局部變數時不能引用

50例#include<iostream.h>inte(inti){returni+1;}int&f(){inti=1;return++i;}intg(int&i){i=i+1;returni;}main(){intr1=e(3);int&r2=e(4);intr3=f();int&r4=f();inta=0,b=0,c=0,d;d=g(4);a+=g(g(c));b+=g(e(3));return1;}512.11.5void類型指針

void指針是一個特殊指針,它可以指向任一類型的C++對象。

voidmain(){void*vp;inti=5;floatf=7.8;charc='A';int*ip;float*fp;char*cp;ip=&i;vp=&i;cp=&c;vp=&c;fp=&f;vp=&f;vp=ip;vp=fp;vp=cp;ip=vp;cp=vp;fp=vp;//錯誤

}522.12類型定義

typedef類型名識別字2.13指針和動態記憶體分配

C++的基本操作符new和delete

分配記憶體:指針變數名=new類型[大小];int*ip;ip=newint[5];

釋放記憶體

deleteip;532.14指針和函數

指針變數可以作函數的參數,指針也可作函數的返回值,還有一種指針可以用來指向函數2.14.1指針作為函數的參數

函數中的形參,可以是指針變數。這時實參可以是地址或指針來調用它

【例】指針作為參數的例子

#include<iostream.h>voidmain(){inta[15];voidinput(int*s,intn);input(a,15);for(inti=0;i<15;i++)cout<<a[i]<<endl;}voidinput(int*s,intn){cout<<“請輸入”<<n<<“個整數:”<<endl;for(inti=0;i<n;i++)cin>>

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论