C++语言程序设计课件_第1页
C++语言程序设计课件_第2页
C++语言程序设计课件_第3页
C++语言程序设计课件_第4页
C++语言程序设计课件_第5页
已阅读5页,还剩244页未读 继续免费阅读

下载本文档

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

文档简介

C++語言程式設計第1講:緒論/5低級語言與高級語言面向機器的語言是低級語言;面向使用者的語言是高級語言。機器可直接執行的語言是低級語言;必須經過“翻譯”才能執行的語言是高級語言。組合語言是低級語言;Basic、Pascal、Fortran、C、MathLab、C++、Java、C#等都是高級語言。低級語言由於面向機器,所以執行效率很高;但可讀性差、編寫困難,不易維護。人與電腦的溝通機器語言:機器直接執行組合語言:與機器碼對應高級語言:通過“翻譯”010100101001001100110011010100101001001100110011MOVAX,A5hMOVBX,90hINT13h010100101001001100110011。。。for(i=1,i<20;i++){variable+=25;if(variable==100)break;}高級語言高級語言遮罩了機器的細節,提高了語言的抽象層次,程式中可以採用具有一定涵義的數據命名和容易理解的執行語句。這使得在書寫程式時可以聯繫到程式所描述的具體事物。高級語言的特徵:使用人比較容易理解的邏輯語言來記錄電腦運算過程。高級語言的邏輯結構:順序結構、選擇結構、迴圈結構等。高級語言與具體機器指令無關。高級語言需要通過編譯或解釋才能在電腦上運行。面向過程與面向對象最早面向過程FORTRAN77:代碼結構化程式ALGOL60,後發展成PASCAL:代碼50年代開始發展,直到80年代。80年代末C語言開始流行,一直到90年代。面向過程實際上就是面向結構和函數的程式。軟體危機軟體危機最早在1968年的NATO會議提出,表現為:對軟體的需求遠超出現有的生產能力;人們依賴於脆弱的軟體,目前的軟體不可靠、缺乏安全性、性能下降、出錯、難以升級,73%的軟體專案被延遲、超資、取消或失敗。為了從根本上解決軟體危機的危機,人類提出了“軟體工程”的一些列方法,然而,眾多的軟體工程的方法並沒有徹底解決“軟體危機”的問題。軟體危機1986年,弗雷德裏克·布魯克斯提出一個著名悲觀論斷:“沒有一種單純的技術或管理上的進步,能夠獨立地承諾在10年內大幅度地提高軟體的生產率、可靠性和簡潔性”。非常遺憾的是銀彈論斷迄今為止尚未打破!據美國國家標準和技術研究院的一份報告顯示,佔據世界軟體銷售額85%的是大型的專用軟體,而其開發的失敗率卻高達70%。針對日趨複雜的軟體需求的挑戰,軟體業界在90年代發展出了面向對象(Object-Oriented)的軟體開發模式,作為針對“軟體危機”的最佳對策。面向對象的思想一般對象:是現實世界中一個實際存在的事物。可以使有形的(比如一輛汽車),也可以是無形的(比如一項計畫)。是構成世界的一個獨立單位,具有:靜態特徵:可以用某種數據來描述動態特徵:對象所表現的行為或具有的功能軟體中的對象:對象應可以用量化描述和處理;對象具有屬性和行為:屬性:描述對象的靜態特徵的資料項目;行為:表述對象的動態特徵的操作序列。面向對象的思想面向過程好比是無人管理的閱覽室,只有書架和圖書,隨便看,隨便拿。面向對象好比是圖書館,圖書被有效的管理(分類),借書憑證,到期歸還。屬性:各種類型的圖書、各個閱覽室行為:圖書進貨,閱讀規則,借閱規則,殘破處理等。面向對象的思想——類

Class分類——人類通常的思維方法分類所依據的原則——抽象忽略事物的非本質特徵,只注意那些與當前目標有關的本質特徵,從而找出事物的共性,把具有共同性質的事物劃分為一類,得出一個抽象的概念。例如,石頭、樹木、汽車、房屋等都是人們在長期的生產和生活實踐中抽象出的概念。面向對象的思想——類

Class面向對象方法中的"類"具有相同屬性和服務的一組對象的集合為屬於該類的全部對象提供了抽象的描述,包括屬性和行為兩個主要部分。類與對象的關係:

猶如模具與鑄件之間的關係,一個屬於某類的對象稱為該類的一個實例。面向對象的思想——封裝

Envelopment把對象的屬性和服務結合成一個獨立的系統單位。盡可能隱蔽對象的內部細節。對外形成一個邊界(或者說一道屏障),只保留有限的對外介面使之與外部發生聯繫。例如:圖書館的管理,由管理員驗證你證件的有效性,查找你所需要的資料等。面向對象的思想——繼承

Inherit繼承對於軟體複用有著重要意義,是面向對象技術能夠提高軟體開發效率的重要原因之一。定義:特殊類的對象擁有其一般類的全部屬性與服務,稱作特殊類對一般類的繼承。例如:將輪船作為一個一般類,客輪便是一個特殊類。面向對象的思想——多態性

Polymorphism多態是指在一般類中定義的屬性或行為,被特殊類繼承之後,可以具有不同的數據類型或表現出不同的行為。這使得同一個屬性或行為在一般類及其各個特殊類中具有不同的語義。例如:數的加法->實數的加法

->複數的加法軟體編寫的一些常見問題問題1:常量與變數的區別?常量:在程式運行中其值不能被改變的量。變數:在程式運行中其值可以被改變的量。常量類型:整型常量、實型常量、字元常量、符號常量(宏定義)。#definePI3.1415926變數:變數名,變數值。原則:先定義後使用。inta;a=10;

問題2:運算符的來歷?在低級語言中只有操作指令(instruction)和運算元(operand)instructionoperand1,operand2高級語言將能完成某項工作的一組有關指令用函數(function)來表示。如:intc;c=Add(inta,intb)表示a與b的和。進一步抽象:inta,b,c;…c=a+b;同樣:c=Increase(inta);

c=a++;根據運算符operator的運算元的個數來確定運算符的目數:單目、雙目、三目。

問題3:

C語言中有哪些運算符?雙目運算符:有兩個運算元;單目運算符:有一個運算元;雙目運算符:+(加),-(減),*(乘),/(除),%(取餘)

=

(賦值)+=、-=、/=、*=、|=、&=、^===(相等),!=(不相等),>(大於),<(小於),>=

(大於等於),<=(小於等於)。||(邏輯或),&&(邏輯與)

<<(左移),>>(右移),|(或),&(與),^(異或)

.(結構成員)、->(指針型結構成員),(逗號運算)問題4:

C語言中有哪些運算符?單目運算符:++(遞增),--(遞減),-(負)。!(邏輯非)、~(補)&(取地址)、*(按指針取值)sizeof(取大小)、()(類型轉換)、[](數組下標)三目運算符:

?:(條件運算):c=(a>b)?a:b;等價於if(a>b)c=a;elsec=b;

問題5:

宏定義是什麼?1.定義一個常量#definePI3.1415926floatx,y;x=PI/2.0;y=3*PI;2.定義一個帶參數的運算式#defineDISTANT(x,y)sqrt((x)*(x)+(y)*(y))floatx,y,d;d=DISTANT(x,y);3.字串可以這樣定義:

#definePRINT_MYNAME(myname) \ printf(“Mynameis=%s”,#myname);4.字串還能這樣:

#defineNEW_VARIABLE(newtype) \ var=Var_##newtype;問題6:

地址是什麼回事?指針又是怎麼?地址(address)是數據在內存中存放的位置。按位元組編號。每個有效的變數都有有效的地址。在有效地址上存放的可能是別的地址的值。例如設a,b的地址分別是A,B,A=>&a,B=>&b;地址B存放了地址A的值&a=>A=>*B=>b;

因此a=>*(&a)=>*b;所以b是指向a的指針![注]=>為等價於(數值相同)的意思。

inta;int*b;a=10;b=&a;則*b的值是10!b是a的指針!問題7:雙指針是怎麼回事?指針與數組是什麼關係?請看下麵的例子:inta;int*b;int**c;a=10;b=&a;c=&b;c就是指針的指針,即雙指針。數組有靜態的(棧stack中申請)和動態的(堆heap中申請)

charName[10];/*Name擁有10個位元組的空間*/char*Text;Text=malloc(10);/*Text也擁有10個位元組的空間*/

靜態空間是自動釋放的,而動態空間是需要調用Free來釋放的。二維數組就應該用雙指針,如char**。問題8:如何理解函數的參數?函數有形參和實參。形參表示參數的形式,實參表示實際的參數傳遞。實參的數據類型要與形參保持一致。聲明:voidfunction(intvar1,intvar2);使用:intv1,v2;v1=10;v2=20;function(v1,v2);v1,v2通過函數入口將數值傳入function內。如果function將var1和var2的值改變了,是否會影響function外部呢?

問題8:如何理解函數的參數?如果函數定義:voidfunction(intvar1,intvar2){var1=100;var2=200;}調用:intv1,v2;v1=10;v2=20;function(v1,v2);printf(“var1=%d,var2=%d”,v1,v2);結果是:var1=10,var2=20這稱為傳值調用。問題8:如何理解函數的參數?如果函數定義:voidfunction(intvar1,int*pvar2){var1=100;*pvar2=200;}調用:intv1,v2;v1=10;v2=20;function(v1,&v2);printf(“var1=%d,var2=%d”,v1,v2);結果是:var1=10,var2=200這稱為傳指針調用。本課考核方法平時成績:20分上課和作業實驗成績:30分三次MFC編程練習期末考試:50分開卷考試,基本概念和編程能力C++語言概述C++是從C語言發展演變而來的,首先是一個更好的C。引入了類的機制,最初的C++被稱為“帶類的C”。1983年正式取名為C++。從1989年開始C++語言的標準化工作。於1994年制定了ANSIC++標準草案。於1998年11月被國際標準化組織(ISO)批准為國際標準,成為目前的C++。C++的特點全面相容C它保持了C的簡潔、高效和接近組合語言等特點。對C的類型系統進行了改革和擴充。支持面向對象的方法C++支持面向過程的程式設計,但不是一個純正的面向對象的語言。C++程式實例—例2-1//2_1.cpp#include<iostream>usingnamespacestd;intmain(){

cout<<"Hello!\n";

cout<<"Welcometoc++!\n";}運行結果:Hello!Welcometoc++!數據類型

——常量與變數#include<iostream>usingnamespacestd;#definePI3.14159intmain(){

const

intPRICE=30;

intnum,total;

floatv,r,h;num=10;total=num*PRICE;

cout<<total<<endl;r=2.5;h=3.2;v=PI*r*r*h;

cout<<v<<endl;}變數常量常量先聲明,後使用數據類型—整型數據及取值範圍類型 說明符 位數 數值範圍

布爾 boolfalse,true位元組 char 8-128~127短整數 short 16 -32768~32767 -215~(215-1) 長整數 long 32 -231~(231-1)無符號

byte 8 0~256 unsignedshort 16 0~65535(216-1)

unsigned[int] 32 0~(232-1)

unsignedlong 32 0~(232-1) 數據類型—int類型int類型與操作系統有關。Windows3.0內核,為16位Win32內核,為32位未來64系統中(Vista),將為64位int有關的數據類型intunsignedint數據類型—浮點數據及取值範圍

float 32位

#defineFLT_MAX3.402823466e+38F/*maxvalue*/=3.402823466×1038F表示單精確度浮點數:保證小數點後7位精度

double 64位#defineDBL_MAX1.7976931348623158e+308=

1.7976931348623158×10308雙精度數:保證小數點後15位精度數據類型的轉換整數間轉換bytea=100;unsignedlongb=(unsignedlong)a;//強制類型轉換bytec=(byte)b;//需要注意精度損失的問題浮點數與整數轉換floata=3.1415926f;intb=(int)a;//b=3如何實現四捨五入?

intb=(int)(a+0.5f);變數的存儲類型auto屬於一時性存儲,其存儲空間可以被若干變數多次覆蓋使用。register存放在通用寄存器中。extern在所有函數和程式段中都可引用。static在內存中是以固定地址存放的,在整個程式運行期間都有效。關係運算與關係運算式關係運算是比較簡單的一種邏輯運算,優先次序為:

<<=>>===!=

優先順序相同(高)優先順序相同(低)關係運算式是一種最簡單的邏輯運算式其結果類型為bool,值只能為true

或false。例如:a>b,c<=a+b,x+y==3邏輯運算與邏輯運算式邏輯運算符

!(非)&&(與)||(或)

優先次序:高→低邏輯運算式

例如:(a>b)&&(x>y)

其结果类型为bool,值只能為true

或false條件運算符與條件運算式一般形式運算式1

?運算式2:

運算式3運算式1必須是bool類型執行順序先求解運算式1,若運算式1的值為true,則求解運算式2,運算式2的值為最終結果若運算式1的值為false,則求解運算式3,運算式3的值為最終結果例:x=(a>b)?a:b;sizeof運算符語法形式

sizeof(類型名)

或sizeof(運算式)結果值:

“類型名”所指定的類型或“運算式”的結果類型所占的位元組數。例:sizeof(short)sizeof(x)位運算——按位與(&)AND運算規則將兩個運算量的每一個位進行邏輯與操作舉例:計算3&53:000000115:(&)000001013&5:00000001用途:將某一位置0,其他位不變。例如:

將char型變數a的最低位置0:

a=a&0376;取指定位。

例如:有charc;inta;

取出a的低位元組,置於c中:c=a&0377;

位運算——按位或(|)OR運算規則將兩個運算量的每一個位進行邏輯或操作舉例:計算3|53:000000115:(|)000001013|5:00000111用途:將某些位置1,其他位不變。

例如:將int

型變數a

的低位元組置

1

a=a|0xff;位運算——按位異或(^)XOR運算規則兩個運算元進行異或:

若對應位相同,則結果該位為0,

若对应位不同,則結果該位為1,舉例:計算071^052071: 00111001052:(^)00101010071^052: 00010011位運算——按位異或(^)

XOR用途:使特定位翻轉(與0異或保持原值,與1異或取反)例如:要使01111010

低四位翻轉:

01111010(^) 00001111 01110101

位運算——取反(~)

NOT單目運算符,對一個二進位數按位取反。例:025:0000000000010101~025:1111111111101010位運算——移位SHIFT左移運算(<<)左移後,低位補0,高位捨棄。例:83<<3

0x53<<3

01010011<<310011000

0x98

152右移運算(>>)右移後,低位捨棄,高位補0或補“符號位”例:152>>4

0x98>>4

10011000>>4

00001001

9高位捨棄低位捨棄低位補0高位補0運算符分類算術運算符加(+)、減(-)、乘(*)、除(/)、求餘(或稱模運算,%)、自增(++)、自減(--)共七種。關係運算符大於(>)、小於(<)、等於(==)、大於等於(>=)、小於等於(<=)和不等於(!=)六種。邏輯運算符與(&&)、或(||)、非(!)三種。位操作運算符位與(&)、位或(|)、位非(~)、位異或(^)、左移(<<)、右移(>>)六種。賦值運算符賦值(=)、複合算術賦值(+=,-=,*=,/=,%=)和複合位運算賦值(&=,|=,^=,>>=,<<=)三類共十一種。條件運算符用於條件求值(?:)。逗號運算符用於把若干運算式組合成一個運算式(,)。指針運算符用於取內容(*)和取地址(&)二種運算。求位元組數運算符用於計算數據類型所占的位元組數(sizeof)。特殊運算符有括弧(),下標[],成員(->,.)等幾種。運算符優先順序括弧++,--,sizeof*,/,%+,-==,!=位運算&&||?:賦值運算=逗號運算,思考:intx=1,y=0;boolz=!x&&x+y&&++y;高低boolz=(!x)&&(x+y)&&(++y);

(!1)&&(1+0)&&(1)

0#include<iostream>usingnamespacestd;intmain(){ intyear;

boolIsLeapYear;

cout

<<

"Entertheyear:";

cin

>>

year; IsLeapYear=((

year%4==0&&

year%100!=0)||(year%400==0));

if(IsLeapYear)

cout

<<

year

<<

"isaleapyear“

<<

endl;

else

cout

<<

year

<<

"isnotaleapyear“

<<

endl;}例2-2:輸入一個年份,判斷是否閏年運行結果:Entertheyear:20002000isaleapyear#include<iostream>using

namespacestd;intmain(){ intday;

cin>>day;

switch(day)

{

case0:

cout<<"Sunday"<<endl;

break;

case1:

cout<<"Monday"<<endl;

break;

case2:

cout<<"Tuesday"<<endl;

break;

case3:cout<<"Wednesday"<<endl;

break;

case4:

cout<<"Thursday"<<endl;

break;

case5:

cout<<"Friday"<<endl;

break;

case6:

cout<<"Saturday"<<endl;

break;

default:

cout<<"DayoutofrangeSunday..Saturday"<<endl;

break; }}例2-4:輸入一個0~6的整數,轉換成星期運行結果:2Tuesday例2-7:用do-while語句編程程式1:#include<iostream>usingnamespacestd;intmain(){inti,sum(0);

cin>>i;

while(i<=10){sum+=i;i++;}

cout<<"sum="<<sum<<endl;}程式2:#include<iostream>usingnamespacestd;intmain(){inti,sum(0);

cin>>i;

do{sum+=i;i++;}while(i<=10);

cout<<"sum="<<sum<<endl;}break和continue語句break語句使程式從循環體和switch語句內跳出,繼續執行邏輯上的下一條語句。不宜用在別處。continue

語句結束本次迴圈,接著判斷是否執行下一次迴圈。運算符分類算術運算符加(+)、減(-)、乘(*)、除(/)、求餘(或稱模運算,%)、自增(++)、自減(--)共七種。關係運算符大於(>)、小於(<)、等於(==)、大於等於(>=)、小於等於(<=)和不等於(!=)六種。邏輯運算符與(&&)、或(||)、非(!)三種。位操作運算符位與(&)、位或(|)、位非(~)、位異或(^)、左移(<<)、右移(>>)六種。賦值運算符賦值(=)、複合算術賦值(+=,-=,*=,/=,%=)和複合位運算賦值(&=,|=,^=,>>=,<<=)三類共十一種。條件運算符用於條件求值(?:)。逗號運算符用於把若干運算式組合成一個運算式(,)。指針運算符用於取內容(*)和取地址(&)二種運算。求位元組數運算符用於計算數據類型所占的位元組數(sizeof)。特殊運算符有括弧(),下標[],成員(->,.)等幾種。運算符優先順序括弧++,--,sizeof*,/,%+,-==,!=位運算&&||?:賦值運算=逗號運算,思考:intx=1,y=0;boolz=!x&&x+y&&++y;Z=?高低z

(!x)&&(x+y)&&(++y)

0&&(1+0)&&(1)

0#include<iostream>using

namespacestd;intmain(){ intyear;

boolIsLeapYear;

cout

<<

"Entertheyear:";

cin

>>

year; IsLeapYear=((

year%4==0&&

year%100!=0)||(year%400==0));

if(IsLeapYear)

cout

<<

year

<<

"isaleapyear“

<<

endl;

else

cout

<<

year

<<

"isnotaleapyear“

<<

endl;}例2-2:輸入一個年份,判斷是否閏年運行結果:Entertheyear:20002000isaleapyear#include<iostream>using

namespacestd;intmain(){ intday;

cin>>day;

switch(day)

{

case0:

cout<<"Sunday"<<endl;

break;

case1:

cout<<"Monday"<<endl;

break;

case2:

cout<<"Tuesday"<<endl;

break;

case3:cout<<"Wednesday"<<endl;

break;

case4:

cout<<"Thursday"<<endl;

break;

case5:

cout<<"Friday"<<endl;

break;

case6:

cout<<"Saturday"<<endl;

break;

default:

cout<<"DayoutofrangeSunday..Saturday"<<endl;

break; }}例2-4:輸入一個0~6的整數,轉換成星期運行結果:2Tuesday例2-7:用do-while語句編程程式1:#include<iostream>using

namespacestd;intmain(){inti,sum(0);

cin>>i;

while(i<=10){sum+=i;i++;}

cout<<"sum="<<sum<<endl;}程式2:#include<iostream>using

namespacestd;intmain(){inti,sum(0);

cin>>i;

do{sum+=i;i++;}while(i<=10);

cout<<"sum="<<sum<<endl;}例2-8:用for語句編程#include<iostream>using

namespacestd;intmain(){intn,k;

cout<<"Enterapositiveinteger:";

cin>>n;

cout<<"Number"<<n<<"Factors

";

for(

k=1;k<=n;k++

)

if(

n%k==0

)

cout<<k<<"";

cout<<endl;}運行結果1:Enterapositiveinteger:7Number7Factors17運行結果2:Enterapositiveinteger:36Number36Factors123469121836關於宏定義1.定義一個常量#definePI3.1415926floatx,y;x=PI/2.0;y=3*PI;2.定義一個帶參數的運算式#defineDISTANT(x,y)sqrt((x)*(x)+(y)*(y))

floatx,y,d;d=DISTANT(x,y);3.字串可以這樣定義:

#definePRINT_MYNAME(myname) \ printf(“Mynameis=%s”,#myname);4.字串還能這樣:

#defineNEW_VARIABLE(newtype) \ var=Var_##newtype;關於地址和指針地址(address)是數據在內存中存放的位置。按位元組編號。每個有效的變數都有有效的地址。在有效地址上存放的可能是別的地址的值。設

為等價於(數值相同)的意思。例如設a的地址是A,A=&a;則a

*A;另有變數b的地址B(b*B)存放了地址A的值

*B=A;則*B&a

即b&a或*ba

因此a

*(&a)

*A*(*B)*b

所以b是指向a的指針!例:inta;int*b;b=&a;a=10;

這時,*b10

指針是記錄別的變數的地址的變數。aAb=AB更好的C1.C++的單行注釋

C代碼中只能是:/*Thisisamulti-linecomment.*/C++代碼增加:

//Thisisasingle-linecomment.2.C++的輸入/輸出流C代碼:

printf(“Enternewtag:”);//列印輸出

scanf(“%d”,&tag);//等待輸入

printf(“Tagis:%d\n”,tag);//列印輸出C++代碼:

cout

<<“Enternewtag:”;//輸出流

cin

>>tag;//輸入流

cout

<<“Tagis:”<<tag<<‘\n’;//輸出流更好的C3.C++中的聲明 (變數)C代碼:函數體的執行語句之前(頭部):

inti;

for(i=0;i<=5;i++) printf(“%d\n”,i);C++代碼:函數體的任何地方,如

for(int

i=0;i<=5;i++)

cout<<i<<‘\n’;4.在C++中建立新的數據類型 C代碼:

enum、struct、union不是新的數據類型。C++代碼:enum、struct、union、class是新的數據類型。//datatypedeclareenumBoolean{FALSE,TRUE};structName{

charfirst[10];

charlast[10];};unionNumber{

inti;

floatf;};enum、struct、union作為數據類型//在C中的用法:enumBooleandone;structNamestudent;unionNumberx;//在C++中的用法:Booleandone=FALSE;Namestudent={“zhang”,”wang”};Numberx={21,39.3};5.函數原型和類型檢查C代碼:函數原型不是必須的;C++代碼:函數原型必須有,如 intaquare(int);C代碼:

intprint(void);

//void必須寫C++代碼:

intprint();

//void可省略6.內聯函數C代碼: 沒有。C++代碼:

inline

intFunction();內聯函數與宏定義比較相同的地方:編譯時嵌入程式中。不同的地方:內聯函數的編寫與普通函數一樣,也可以跟蹤;但宏定義只是作替換,與函數不同,並不能跟蹤。7.引用ReferenceC語言中不存在,C++新加的概念。

inta=10;

int*pa=&a;

int&ra=a;//thereferenceof‘a’ra和a共用一個地址。

pa是指向a的指針;ra是a的一個別名。如果a=20則*pa與ra都為20。apa=&a12…&a…&pa…Addr:Value:pa&a

pa

&raa*para&ra7.引用Reference函數的調用方式:傳值調用:

voidFunction(inta){a=10;}傳指針調用:

voidFunction(int*pa){*pa=10;}傳地址調用:

voidFunction(int&ra){ra=10;}//傳值調用intsquareByValue(inta){

returna*=a;//不修改調用者的參數}//指針調用voidsquareByPointer(int*bPtr){ *bPtr*=*bPtr;//修改調用者的參數}//引用調用voidsquareByReference(int&cRef){ cRef*=cRef;//修改調用者的參數}引用的特點1)引用變數是被引用變數的“別名”。即共用一個地址。2)以引用作形參的函數的調用方式與傳值調用寫法相同,但傳值不會影響到外部,而引用則會影響參數在外部的值。3)在函數中,傳值調用傳的是參數的值;而用引用調用傳的是參數的地址。4)引用可以用指針代替,但指針不能完全被指針代替。比如鏈表、直接記憶體尋址、修改地址等。但指針不安全,而引用比較安全。JAVA和C#為保證安全性都禁止使用指針,只能用“引用”。8.const限定符C代碼: 沒有。C++代碼:const

floatPI=3.14159const

int*iPtr=&integer;1)常量必須初始化;(聲明時賦值)2)常量不能修改。與宏定義不同,const修飾的是變數;而宏僅僅作替代而已。9.動態分配記憶體C代碼: typeName*ptr;intnum=10;ptr=malloc(sizeof(typeName)*num);//申請free(ptr);//釋放C++代碼:ptr=

new

typeName[num];//申請delete

ptr;//釋放C語言中是調用函數,C++中是運算符。初始化新分配的記憶體float*tingPtr=new

float(3.14159);deletetingPtr;動態建立數組int*arrayPtr=new

int[100];delete[]arrayPtr;10.默認參數inlineintboxVolume(intlength=3,intwidth=2,intheight=1){returnlength*width*height;}調用該函數時,可以有以下幾種方法:1) boxVolume();

//length=3,width=2,height=12) boxVolume(10);

//length=10,width=2,height=13) boxVolume(10,5);

//length=10,width=5,height=14)boxVolume(10,5,2);

//length=10,width=5,height=211.單目作用域運算符

floatvalue=1.2345;intFunction(){intvalue=7;

floatf=::value;//取外部的值

intv=value;//取內部的值}則f=1.2345v=7;對象的概念對象是現實世界的實體,是由一組狀態和行為組成的集合。面向對象的方法:把問題看作成由許多彼此互相聯繫的對象組成。面向對象的程式設計OOP:ObjectOrientedProgramming;把數據和函數封裝在稱為對象的包中,公佈對象的介面,而將實現的細節隱蔽起來。

對象是現實世界的實體,是由一組狀態和行為組成的集合。例1:圖書館狀態:共有多少類圖書;每類圖書有多少冊;讀者人數;館內庫存有多少本;正在閱讀的有多少本;外借多少本;……行為:辦圖書證;圖書檢索;閱覽室閱讀;外借閱讀;……例2:學校狀態:總人數;教師人數;本科生人數;研究生人數;科研成果;……行為:招生;畢業;授課;實驗;考試;科研;……面向對象的方法:把問題看作成由許多彼此互相聯繫的對象組成。例:學校管理學校管理工作:學籍管理、教務管理、教師管理、住宿管理、伙食管理、科研管理、……學籍管理:入學、成績、獎懲、畢業……教務管理:課程設置、排課、品質監督……住宿管理:宿舍安排、打掃衛生、安全保衛……伙食管理:飯卡管理、承包管理、衛生監督……科研管理:專案申請、設備採購、專案鑒定……作為校長不必每件事都去具體管理,他只要設置一個部門去管理就行了。這些部門就是對象!!!

大的單位的管理必須劃分不同的職能部門(Object)。結構的定義

structTime{inthour;intminute;intsecond;};Time就是一個數據類型

TimetimeObject,timeArray[10],*timePtr;訪問結構的成員cout<<timeObject.hour;cout<<timePtr->hour;用結構實現用戶定義的類型Time結構建立數據類型的缺陷:無初始化,可讀性差,可維護性差。voidShowTime(inthr,intmin,intsec);main(){ ShowTime(9,30,0);return0;}voidShowTime(inthr,intmin,intsec){cout<<(hr<10?“0”:“”)<<hr<<“:”<<(min<10?“0”:“”)<<min<<“:”<<(sec<10?“0”:“”)<<sec;}09:30:00structClock{inthour;intminute;intsecond;};voidShowTime(constClock&);main(){ClockmyClock={9,30,0};ShowTime(myClock);return0;}voidShowTime(constClock&c){cout<<(c.hour<10?“0”:“”)<<c.hour<<“:”<<(c.minute<10?“0”:“”)<<c.minute<<“:”<<(c.second<10?“0”:“”)<<c.second<<endl;}09:30:00classClock{public:Clock();

voidSetTime(int,int,int);

voidShowTime();private:

inthour;intminute;intsecond;};1)以關鍵字:class開始;2)構造函數:constructor//自動執行初始化3)公有函數:public //供外部調用4)私有函數:private //外部不能訪問(有一個例外,以後再介紹)構造函數行為:公有函數狀態:私有函數類和對象Clock::Clock()//constructor{hour=0;minute=0;second=0;}voidClock::SetTime(inthr,intmin,intsec){hour=(hr>=0&&hr<24)?hr:0; minute=(min>=0&&min<60)?min:0; second=(sec>=0&&sec<60)?sec:0;}voidClock::ShowTime(){cout<<(hour<10?“0”:“”)<<hour<<“:”<<(minute<10?“0”:“”)<<minute<<“:”<<(second<10?“0”:“”)<<second<<endl;}voidmain(){Clockc;c.SetTime(8,30,30);c.ShowTime();c.hour=9;}

結構與類的比較結構好比是一個無人管理的開放的閱覽室,所有的報刊雜誌都放在那裏,讀者可自主挑選。類則好比是有管理員的圖書館,看書借書必須通過管理員許可。C語言只能建一個閱覽室,C++可以建一個圖書館。類的作用域和訪問類的成員

關於作用域檔作用域:在本工程(project)的所有檔範圍內。類的作用域:在類的定義範圍內,即所有數據成員和成員函數內。在檔作用域內定義變數或函數,即全局變數或函數。在類的作用域內定義變數或函數,即數據成員和成員函數。

構造函數classClock{public:Clock();Clock(intNewH,intNewM,intNewS);

voidSetTime(int,int,int);

voidShowTime();private:

inthour;intminute;intsecond;};Clock::Clock(){hour=minute=second=0;}Clock::Clock(intNewH,intNewM,intNewS){hour=NewH;minute=NewM;second=NewS;}classPoint{public:Point(intxx=0,intyy=0){X=xx;Y=yy;}Point(Point&p);//拷貝構造函數

intGetX(){returnX;}

intGetY(){returnY;}

private:

intX,Y;};Point::Point(Point&p){X=p.X;Y=p.Y;

cout<<“拷貝構造函數被調用”<<endl;}intmain(){PointA(1,2);PointB(A);//用對象A初試化對象B,拷貝構造函數被調用

cout<<B.GetX()<<endl;

return0;}當用類的一個對象去初始化該類的另一個對象時系統自動調用拷貝構造函數實現拷貝賦值。拷貝構造函數voidf(Pointp){cout<<p.GetX()<<endl;}intmain(){PointA(1,2);f(A);//調用拷貝構造函數

return0;}Pointg(){PointA(1,2);

returnA;//調用拷貝構造函數}intmain(){PointB;B=g();

return0;}若函數的形參為類對象,調用函數時,實參賦值給形參,系統自動調用拷貝構造函數。當函數的返回值是類對象時,系統自動調用拷貝構造函數。訪問函數和工具函數將類的函數分為兩大類,訪問函數和工具函數。訪問函數是供客戶調用的,一般為public。工具函數是為實現訪問函數的某些功能而需要的函數,一般為private。初始化類的對象:構造函數構造函數可使每個對象都有正確的初始值。在構造函數中使用默認參數classTime{public:Time(int=0,int=0,int=0);……析構函數classClock{public:Clock();voidSetTime(int,int,int);

voidShowTime();

~Clock();//析構函數private:

inthour;intminute;intsecond;

char*pbuf;};Clock::Clock(){pbuf=newchar[128];}Clock::~Clock(){delete[]pbuf;}對象被刪除的時刻自動調用main(){Clockc;//構造

c.SetTime(9,30,30);}//析構析構函數的使用一個類只能有一個析構函數,不允許重載!調用析構函數和構造函數的時機結論:最先析構的是自動變數;靜態對象的生命期一直到程式結束;(static)全局對象是最後被析構的。數據成員和成員函數的使用數據一般設為私有成員,便於保護;需要用戶設置的私有數據成員用get和set提供給用戶;要保證私有數據成員在任何時候都是有效的。介面與實現的分離

軟體工程的一個最基本的原則:介面與實現分離.h檔與.cpp檔分離類的定義與類的實現分離但是Java中類的定義與實現是在一起的,Why?因為Java中有一個專門管介面的類叫Interface。這個類是公開的,而其他類則被遮罩起來。這種方式稱為對象的“包裝”或稱“封裝”。public:,private:(protected:)都是用來控制成員函數的作用。類的客戶可通過公有成員(public)知道類提供什麼樣的服務。類的客戶不能直接訪問類的私有成員(private),它們只能通過成員函數(或友元)來訪問。C++提倡編寫與實現無關的程式。在類定義中儘量避免寫函數實現的代碼。(也不是絕對的,只要覺得可以公開,並以後不會改動,則可以將實現寫到類的定義中)[注意]在理論上public:,private:

protected:

只使用一次。但現在C++編譯器(如VC++)可支持多次。而在Java中每一個函數前面都要求加上這個說明符。

§控制對成員的訪問構造函數classClock{public:Clock():hour(0),minute(0),second(0){}Clock(intNewH,intNewM=0,intNewS=0);Clock(Clock&c);private:

inthour;intminute;intsecond;};Clock::Clock(intNewH,intNewM,intNewS){hour=NewH;minute=NewM;second=NewS;}Clock::Clock(Clock&c){hour=c.hour;minute=c.minute;second=c.second;}相當於:Clock::Clock(){hour=minute=second=0;}拷貝構造函數默認參數構造函數析構函數classClock{public:Clock();voidSetTime(int,int,int);

voidShowTime();

~Clock();//析構函數private:

inthour;intminute;intsecond;

char*pbuf;};Clock::Clock(){pbuf=newchar[128];}Clock::~Clock(){delete[]pbuf;}對象被刪除的時刻自動調用main(){Clockc;//構造

c.SetTime(9,30,30);}//析構構造函數可使每個對象都有正確的初始值析構函數可使每個對象在結束時自動進行清理工作析構函數的使用一個類只能有一個析構函數,不允許重載!最先析構的是自動變數;靜態對象的生命期一直到程式結束;(static)全局對象是最後被析構的。訪問函數和工具函數將類的函數分為兩大類,訪問函數和工具函數。訪問函數是供客戶調用的,一般為public。工具函數是為實現訪問函數的某些功能而需要的函數,一般為private。數據成員和成員函數的使用數據一般設為私有成員,便於保護;需要用戶設置的私有數據成員用get和set提供給用戶;要保證私有數據成員在任何時候都是有效的。介面與實現的分離

軟體工程的一個最基本的原則:介面與實現分離.h檔與.cpp檔分離類的定義與類的實現分離但是Java中類的定義與實現是在一起的,Why?因為Java中有一個專門管介面的類叫Interface。這個類是公開的,而其他類則被遮罩起來。這種方式稱為對象的“包裝”或稱“封裝”。public:,private:(protected:)都是用來控制成員函數的作用。類的客戶可通過公有成員(public)知道類提供什麼樣的服務。類的客戶不能直接訪問類的私有成員(private),它們只能通過成員函數(或友元)來訪問。C++提倡編寫與實現無關的程式。在類定義中儘量避免寫函數實現的代碼。(也不是絕對的,只要覺得可以公開,並以後不會改動,則可以將實現寫到類的定義中)[注意]在理論上public:,private:

protected:

只使用一次。但現在C++編譯器(如VC++)可支持多次。而在Java中每一個函數前面都要求加上這個說明符。

§控制對成員的訪問§

軟體的可重用性面向對象的程式設計的一個重要目標就是軟體的可重用性。可重用性意味著以前的代碼可以部分加以利用,並對其餘部分改寫,以免整個程式重新編寫。要實現可重用性,程式必須設計良好、具有較好的可讀性,並預先把需要擴展部分考慮好。函數原型(prototype)的作用域函數原型中的參數,其作用域僅限於聲明中。例如,設有下列原型聲明:doubleArea(doubleradius);radius的作用域僅在於此,不能用於程式正文其他地方,因而可有可無。可以寫成:

doubleArea(double);doubleArea(doubleradius=5);可簡化成doubleArea(double=5);塊作用域在塊中聲明的識別字,其作用域自聲明處起,限於塊中,例如:voidfun(inta){intb(a);

cin

>>

b;

if(b>0){

intc;......}}a

的作用域b

的作用域c

的作用域類作用域類X的成員M具有類作用域,對M的訪問方式如下:如果在X的成員函數中沒有聲明同名的局部作用域識別字,那麼在該函數內可以訪問成員M。classX{intM;

public:voidfun();}voidX::fun(){M=10;{intM=20;……}

cout<<M;}局部自動變數類的成員變數?檔作用域不在前述各個作用域中出現的聲明,具有檔作用域,這樣聲明的識別字的作用域開始於聲明點,結束於檔尾。全局變數!inti;

//全局變數,檔作用域voidmain(){i=5;{inti;

//局部變數,塊作用域

i=7;

cout<<“i=“<<i<<endl;

//輸出7

}

cout<<“i=“<<i<<endl;

//輸出5}例5-2:變數的生存期與可見性#include<iostream.h>voidother();int

i=1;//i為全局變數,具有靜態生存期。intmain(){staticint

a;//靜態局部變數,有全局壽命,局部可見。

int

b

=-10;//b,c為局部變數,具有動態生存期。

int

c

=0;

cout<<"---MAIN---\n";

cout<<"i:"<<i

<<"a:"<<a

<<"b:"<<b

<<"c:"

<<

c

<<

endl;

c=c+8;other();

cout<<"---MAIN---\n";

cout<<"i:"<<i<<"a:"<<a

<<"b:"<<b

<<"c:" <<c

<<endl;

i=i+10;other();}voidother(){

static

int

a=2;

static

int

b=0;

//a,b為靜態局部變數,具有全局壽命,局部可見。

//只第一次進入函數時被初始化。

int

c=10;//C為局部變數,具有動態生存期,

//每次進入函數時都初始化。

a=a+2;i=i+32;c=c+5;

cout<<"---OTHER---\n";

cout<<"i:"<<i

<<"a:"<<a

<<"b:"<<b

<<"c:"<<c

<<endl;

b=a;}運行結果:---MAIN---

i:1

a:0b:-10c:0---OTHER---

i:33

a:4b:0c:15---MAIN---

i:33

a:0b:-10c:8---OTHER---

i:75

a:6b:4c:15例5-3:時鐘程式classClock //時鐘類聲明{public: //外部介面

Clock();

voidSetTime(intNewH,intNewM,intNewS);//三個形參均具有函數原型作用域

voidShowTime(); ~Clock(){}private: //私有數據成員

intHour,Minute,Second;};//時鐘類成員函數實現Clock::Clock()//構造函數{ Hour=0; Minute=0; Second=0;}voidClock::SetTime(intNewH,intNewM,intNewS){ Hour=NewH; Minute=NewM; Second=NewS;}voidClock::ShowTime(){

cout<<Hour<<":"<<Minute<<":"<<Second<<endl;}Clock

globClock;//聲明對象globClock,

//具有靜態生存期,檔作用域intmain() //主函數{

cout<<"Firsttimeoutput:"<<endl;

//引用具有檔作用域的對象:

globClock.ShowTime();//對象的成員函數具有類作用域

globClock.SetTime(8,30,30); ClockmyClock(globClock);

//聲明具有塊作用域的對象myClock

cout<<"Secondtimeoutput:"<<endl; myClock.ShowTime(); //引用具有塊作用域的對象}程式

温馨提示

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

评论

0/150

提交评论