版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
C++的面向?qū)ο蠡A(chǔ)知識
11.1傳統(tǒng)的程序設(shè)計方法
一.程序設(shè)計方法的進步
在20世紀(jì)60年代,軟件曾出現(xiàn)過嚴(yán)重危機,由軟件錯誤而引起的信息丟失、系統(tǒng)報廢事件屢有發(fā)生。為此1968年,荷蘭學(xué)者提出了程序設(shè)計中常用的GOTO語句的三大危害:破壞了程序的靜動一致性;程序不易測試;限制代碼化。此舉引起了軟件界長達數(shù)年的論戰(zhàn),并由此產(chǎn)生了結(jié)構(gòu)化程設(shè)計方法,同時誕生了基于這一設(shè)計方法的程序設(shè)計Pascal.Pascal一經(jīng)推出,它的簡潔明了以及豐富的數(shù)據(jù)結(jié)構(gòu)和控制結(jié)構(gòu),為程序員提供了極大的方便性與靈活性,同時它特別適合計算機系統(tǒng),因此大受歡迎。結(jié)構(gòu)化程序設(shè)計思想在整個20世紀(jì)70的軟件開發(fā)中占絕對統(tǒng)治地位。二.什么是結(jié)構(gòu)化程序設(shè)計(StructureProgramming)
結(jié)構(gòu)化程序設(shè)計是上個世紀(jì)60年代誕生的,在70年代到80年代已遍及全球,結(jié)構(gòu)化程序設(shè)計的設(shè)計思路是:自頂向下、逐步求精;其程序結(jié)構(gòu)是按功能劃分若干個基本模塊,這些模塊形成一個樹狀結(jié)構(gòu);各模塊之間的關(guān)系盡可能簡單,在功能上相對獨立;每一模塊內(nèi)部均是由順序、選擇和循環(huán)三種基本結(jié)構(gòu)組成;結(jié)構(gòu)化程序設(shè)計方法的四條原則是:1.自頂向下;2.逐步求精;3.模塊化;4.限制使用goto語句。
當(dāng)數(shù)據(jù)和過程相互獨立時,總存在著用錯誤的數(shù)據(jù)調(diào)用正確的程序模塊或用正確的數(shù)據(jù)調(diào)用了錯誤的程序模塊的可能性。因此,要使數(shù)據(jù)與程序始終保持相容,已經(jīng)成為程序員的一個沉重負擔(dān)。上述這些問題,結(jié)構(gòu)化程序設(shè)計方法本身是解決不了的,到了70年代末期,結(jié)構(gòu)化程序設(shè)計語言和結(jié)構(gòu)化分析與設(shè)計已無法滿足用戶需求的變化,于是面向?qū)ο蠹夹g(shù)開始浮出水面。11.1.2面向?qū)ο蟮某绦蛟O(shè)計方法
一.面向?qū)ο蟮挠蓙砗桶l(fā)展
面向?qū)ο蠓椒ㄆ鹪从诿嫦驅(qū)ο笳Z言,編程語言得到應(yīng)用和發(fā)展的同時,面向?qū)ο蟮姆椒ǖ玫搅税l(fā)展。和任何事物一樣,面向?qū)ο笳Z言也經(jīng)歷了它的發(fā)生、發(fā)展階段,走向成熟。1.在60年代初期,Algo語言使封裝思想誕生。2.在60年代后期,Simula引入對象和消息機制,對象和對象之間可以通過發(fā)送消息來進行相互通信,這就是導(dǎo)致了數(shù)據(jù)封裝與通信思想的產(chǎn)生。
3.到了70年代,都許多語言如CLU、Ads、Modula-2等都開始支持數(shù)據(jù)與封裝,這導(dǎo)致了抽象數(shù)據(jù)類型發(fā)展。4.1980年,出現(xiàn)Smalltalk-80商品化的面向?qū)ο笳Z言,它是純粹的面向?qū)ο缶幊陶Z言。5.80年代中期到90年代,出現(xiàn)了大批面向?qū)ο笳Z言,面向?qū)ο笳Z言趨于成熟,從此面向?qū)ο蠓椒ㄗ呦驅(qū)嵱?。二.面向?qū)ο蟮幕舅枷?/p>
其基本思想是使用對象、類、繼承、封裝、消息等基本概念來進行程序設(shè)計。從現(xiàn)實世界中客觀存在的事物(即對象)出發(fā)來構(gòu)造軟件系統(tǒng),并且在系統(tǒng)構(gòu)造中盡可能運用人類的自然思維方式。三.面向?qū)ο蟮幕靖拍?/p>
1.對象:特性+行為
第一個面向?qū)ο蟮某绦蛟O(shè)計語言是60年代開發(fā)的Simula—67。其目的是為了解決模擬問題。典型的模擬問題是銀行出納業(yè)務(wù),包括出納部門、顧客、業(yè)務(wù)、貨幣的單位等大量的“對象”。把那些在程序執(zhí)行期間除了狀態(tài)之外其他方面都一樣的對象歸在一起,構(gòu)成對象的“類”,這就是“類”一詞的來源。類描述了一組有相同特性(數(shù)據(jù)元素)和相同行為(函數(shù))的對象。2.繼承:類型關(guān)系
特殊類的對象擁有其一般類的全部屬性與服務(wù),稱作特殊類對一般類的繼承。一個類可以是多個一般類的特殊類,它從多個一般類中繼承了屬性與服務(wù),這稱為多繼承。例如,客輪是輪船和客運工具的特殊類。在java語言中,通常我們稱一般類為父類,特殊類為子類。3.封裝性
封裝性就是把對象的屬性和服務(wù)結(jié)合成一個獨立的相同單位,并盡可能隱蔽對象的內(nèi)部細節(jié),包含兩個含義:把對象的全部屬性和全部服務(wù)結(jié)合在一起,形成一個不可分割的獨立單位(即對象)。信息隱蔽,即盡可能隱蔽對象的內(nèi)部細節(jié),對外形成一個邊界,只保留有限的對外接口使之與外部發(fā)生聯(lián)系。4.多態(tài)性
對象的多態(tài)性是指在一般類中定義的屬性或服務(wù)被特殊類繼承之后,可以具有不同的數(shù)據(jù)類型或表現(xiàn)出不同的行為。11.2C++對C的擴充
11.2.1C++語言源程序的編譯
為了解C++語言源程序的編譯過程首先介紹一些基本術(shù)語:
1.源程序:用源語言寫的有待翻譯的程序,稱為“源程序”。源程序可以是匯編語言,也可以是高級程序設(shè)計語言,所以用它們寫出的程序都是源程序。
2.目標(biāo)程序:是源程序通過翻譯加工以后所生成的程序。目標(biāo)程序可以用機器語言表示,也可以用匯編語言或其他中間語言表示。
3.翻譯程序:是指用來把源程序翻譯為目標(biāo)程序的程序。對翻譯程序來說,源程序是它的輸入,而目標(biāo)程序則是其輸出。11.2.2基本數(shù)據(jù)類型
1.C++類型分類C++的數(shù)據(jù)類型有基本數(shù)據(jù)類型和非基本數(shù)據(jù)類型。基本數(shù)據(jù)類型是C++內(nèi)部預(yù)先定義的數(shù)據(jù)類型。主要有整型、字符型、實型、布爾型這四種基本類型。非基本數(shù)據(jù)類型包括指針、數(shù)組、結(jié)構(gòu)、類等。2.整型標(biāo)準(zhǔn)C++中6種整型short、int、long、unsignedshort、unsignedint、unsignedlong。以在十六位計算機中表示為例它們的范圍如下表11.2-1:類型說明長度(字節(jié))范圍short短整型2-32768~32767int整型2-32768~32767llong長整型4-2147483648~2147483647unsignedshort無符號短整型20~65535unsignedint無符號整型20~65535unsignedlong無符號長整型40~42949672953.字符型字符文字由單引號‘限定,字符值以整型的方式存儲?!纠?1.1】字符變量intmain(){//打印字符和已在內(nèi)部存儲的整型值charc=ˊAˊ;cout<<"c="<<c<<",int(c)="<<int(c)<<endl;c=ˊtˊ;cout<<"c="<<c<<",int(c)="<<int(c)<<endl;}運行結(jié)果:c=A,int(c)=65c=t,int(c)=116由于字符值被用于輸入和輸出,因此它們表現(xiàn)為字符的形式而不是整型的形式:字符A是以字母A的形式而不是以它的內(nèi)部表示的整數(shù)值65的形式被打印出來。程序中用類型轉(zhuǎn)換運算符int()將其內(nèi)部對應(yīng)的整型值展示出來。這就是字母的ASCII碼。字符型的范圍如下表11.2-2:類型說明長度(字節(jié))范圍char字符型1-128~127unsignedchar無符號字符型10~2554.實型C++支持3種實數(shù)型:float、double、longdouble。在大多數(shù)系統(tǒng)中,double使用float兩倍的字節(jié)數(shù)。典型的是float使用4字節(jié),double使用8字節(jié),longdouble使用8、10、12或16字節(jié)。實型的范圍如下表11.2-3:類型說明長度(字節(jié))float浮點型4double雙精度型8Longdouble長雙精度型105.布爾型
布爾型變量只能取兩個值:false和true。這兩個值被存為0和1。標(biāo)準(zhǔn)C++中,布爾型被稱為bool?!纠?1.3】布爾類型變量
intmain(){//打印布爾變量的值
boolflag=false;
cout<<"flag="<<flag<<endl;
flag=true;
cout<<"flag="<<flag<<endl;
}運行結(jié)果:flag=0flag=1注意false值被打印成整數(shù)0而true值被打印成整數(shù)1。6.?dāng)?shù)據(jù)類型轉(zhuǎn)換c++中數(shù)據(jù)類型轉(zhuǎn)換有兩種,即隱式類型轉(zhuǎn)換和顯式類型轉(zhuǎn)換。隱式類型轉(zhuǎn)換由編譯器自動完成,當(dāng)編譯器遇到不同類型的數(shù)據(jù)參與同一運算時,會自動將它們轉(zhuǎn)換成相同類型后在進行運算。隱式類型轉(zhuǎn)換按從低到高的順序進行。顯式類型轉(zhuǎn)換它是程序員顯式指出的類型轉(zhuǎn)換,轉(zhuǎn)換形式有兩種:〈類型名〉(表達式)(〈類型名〉)表達式通過類型的顯式轉(zhuǎn)換可以將“表達式”轉(zhuǎn)換成適當(dāng)?shù)念愋汀?1.2.3變量的定義
變量名要遵守以下規(guī)則:1)不能是C++保留字。
2)第一個字符必須是字母或下劃線。
3)中間不能有空格。
變量就是值可變的量,每個變量由一個變量名唯一標(biāo)識,同時,每個變量又具有一個特定的數(shù)據(jù)類型。類型標(biāo)志著這個變量將來的用法以及它將保存哪種類型的數(shù)據(jù)值。命名變量名
可以在一個語句里建立多個同一類型的變量,方法是在類型后寫上多個變量名,中間用逗開。例如:
unsignedmyage,myweight;
longarea,width,length;
在同一語句里不能混合定義不同類型的變量
3.變量賦值與初始化
用賦值運算符“=”給變量賦值。例如:intdepth;depth=5;也可在定義時直接給變量賦值。在定義的同時,賦給變量一個初始值,稱為變量的初始化。例如:intdepth=5;//初始化
在定義時也可以初始化多個變量。例如:intdepth=5,length=6;不是所有的變量在定義時都需要初始化。例如:doublearea,radius=15;該變量定義并不是將15同時賦給這兩個變量,而是變量radius初始化為15,area只是定義,沒有被初始化。4.用typedef定義自己的變量類型
在C++中可以利用typedef定義自己的變量類型,其形式為:typedef〈類型說明〉;〈類型說明〉類似于變量說明,只是變量名用類型名代替了,實際上,這等于定義了一個同義詞,這種方式與創(chuàng)建一個新的類型是不同的。Typedef沒有實際地定義一個新的數(shù)據(jù)類型,在建立一個typedef類型時沒有分配內(nèi)存空間。例如:
typedef
intdepth;
typedefcharstring[8];
使用自定義類型有幾點好處:一是可以更好地表達程序員的意思,如用depth來表示將要定義的標(biāo)識符是屬于深度一類的數(shù)據(jù),用string表示程序員想要定義的是一個字符串,這比直接用系統(tǒng)預(yù)定義的類型清晰得多;二是簡單方便,一些數(shù)據(jù)類型可以用簡單的類型標(biāo)識符來表示,不用每次都麻煩地寫復(fù)雜的定義。1.4.4C++的函數(shù)原型
函數(shù)原型是一條程序語句,它由函數(shù)返回類型﹑函數(shù)名和參數(shù)表構(gòu)成,形式為:返回類型函數(shù)名(參數(shù)表);在C++中,函數(shù)聲明就是函數(shù)原型。在C++中,函數(shù)的聲明可以在主程序以前,也可以在主程序之後。程序:使用函數(shù)C++版本(函數(shù)的聲明在主程序以前)如果函數(shù)在主程序之后聲明,在主程序以前必須有一個叫做函數(shù)原型的語句。函數(shù)原型告訴C++編譯程序參數(shù)的數(shù)據(jù)類型、參數(shù)的數(shù)目及函數(shù)回傳的數(shù)據(jù)類型,這些資料必須和函數(shù)的聲明一致。在數(shù)據(jù)原型中,參數(shù)名稱是不需要的,就算有也不一定要和函數(shù)聲明的一樣。例如,函數(shù)原型
floatpower(floatbase,intn);
可以寫成
floatpower(float,int);
11.2.5常量說明
一.常類型const
常數(shù)型是指使用類型修飾符const說明的類型,常類型的變量或?qū)ο蟮闹凳遣荒鼙桓碌?。因此,定義或說明常類型時必須進行初始化.
二.常量分類
1.一般常量
2.常對象
3.常指針1.一般常量一般常量是指簡單類型的常量。
定義或說明一個常數(shù)組可采用如下格式:
<類型說明符>
const
<數(shù)組名>[大小]或者const
<類型說明符>
<數(shù)組名>[大小]例如:int
const
a[5]={1,2,3,4,5};2.常對象
常對象是指對象常量,定義格式如下:<類名>
const
<對象名>或者const
<類名>
<對象名>
定義常對象時,同樣要進行初始化,并且該對象不能再被更新,修飾符const可以放在類名后面,也可以放在類名前面.
3.常指針
下面定義的一個指向字符串的常量指針:char
*
const
prt1
=stringprt1;其中,ptr1是一個常量指針.下面賦值是非法的:ptr1=stringprt2;而下面的賦值是合法的:*ptr1="m";因為指針ptr1所指向的變量是可以更新的,不可更新的是常量指針ptr1所指的方向(別的字符串).11.2.6C++的注釋語句一.什么是注釋注釋是程序員為讀者作的說明,是提高程序可讀性的一種手段.一般可將其分為兩種:序言注釋和注解性注釋.前者用于程序開頭,說明程序或文件的名稱,用途,編寫時間,編寫人及輸入輸出說明等,后者用于程序中難懂的地方.二.二.注釋的書寫
1.C++風(fēng)格的注釋為"//"之后的內(nèi)容,直到換行.注釋僅供閱讀程序使用,是程序的可選部分.在生成可執(zhí)行程序之前,C++忽略注釋,并把每個注釋都視為一個空格.2.另外,C++還兼容了C語言風(fēng)格的注釋,是指符號"/*"與"*/"之間的任何字符串,這些字符可以跨過多行.
11.2.7C++的標(biāo)準(zhǔn)I/O操作
所有用到標(biāo)準(zhǔn)輸入輸出的C++程序都必須包含iostream這個預(yù)處理偽指令.標(biāo)識符iostream是標(biāo)準(zhǔn)C++庫中一個文件的名字.格式為:include<iostream.h>.
iostream.h是系統(tǒng)定義的一個頭文件,它設(shè)置了C++的I/O相關(guān)環(huán)境,定義輸入輸出流對象cout與cin等.
一.輸出
二.輸入
一.輸出:C++還提供了一些操縱符,可以直接嵌入到輸入/輸出語句中來實現(xiàn)I/O格式控制.在使用setprecision和setw操縱符時要在程序開頭包含iomanip.h.
操縱符名含義
dec
數(shù)值數(shù)據(jù)采用十進制表示
hex
數(shù)值數(shù)據(jù)采用十六進制表示
oct
數(shù)值數(shù)據(jù)采用十進制表示
ws
提取空白字符
endl
插入換行符,并刷新流
ends插入空字符setprecision(int)
設(shè)置浮點數(shù)的小數(shù)位數(shù)(包括小數(shù)點)
setw(int)
設(shè)置域?qū)?/p>
1.
輸出常數(shù)用cout可以顯示數(shù)字和字符,可以輸出常數(shù).例.#include<iostream.h>voidmain(){intn=50;floatf=20.3;
cout<<"n="<<n<<endl;
cout<<"f="<<f<<endl;}
運行結(jié)果為:
n=0f=20.3000三個常用的控制符是hex,oct和dec,它們分別對應(yīng)16進制數(shù),8進制數(shù)和十進制數(shù)的顯示.這三個控制符在iostream.h頭文件中定義.
#include<iostream.h>voidmain(){intnumber=1001;
cout<<"decimal:"<<dec<<number<<endl<<"hexadecimal:"<<hex<<number<<endl<<"octal:"<<oct<<number<<endl;}
運行結(jié)果為:
decimal:1001hexadecimal:3e9octal:1751
2.輸出八進制和十六進制數(shù)
3.設(shè)置值的輸出寬度
除了使用空格來強行控制輸出間隔外,還可以用setw(n)控制符.如果一個值需要比setw(n)確定的字符數(shù)更多的字符,則該值將使用它所需要的所有字符.例.Floatamount=3.14159;
cout<<setw(4)<<amount<<endl;
其運行結(jié)果為:3.14159.它并不按4位寬度,而是按實際寬度輸出.如果一個值的字符數(shù)比setw(n)確定的字符數(shù)個數(shù)更少,則在數(shù)字字符前顯示空白.不同于其他控制符,setw(n)僅僅影響下一個數(shù)值輸出,換句話說,使用setw設(shè)置的間隔方式并不保留其效力.4.控制浮點數(shù)值顯示使用setprecision(n)可控制輸出流顯示浮點數(shù)的數(shù)字個數(shù).C++默認的流輸出數(shù)值有效位為6.二.輸入
當(dāng)程序需要執(zhí)行從鍵盤輸入時,可以使用抽取操作符">>"從cin輸入流中抽取字符.例.Int
myage;cin>>myage;
不管把什么基本數(shù)據(jù)類型的名字或值傳給流,它都能懂.Cin可以調(diào)整行,自動識別變量位置和類型.它能夠知道抽取變量的類型.
11.2.8函數(shù)參數(shù)的缺省在C++中函數(shù)可以使用缺省參數(shù),例:voidPutHzxy(char*str,intx=-1,inty=-1){if(x==-1)x=wherex();if(y==-1)y=wherey();
moveto(x,y)
PutHz(str);}
可以有兩種方式調(diào)用函數(shù)PutHzxy(),例如:
PutHzxy("C++語言");//使用缺省參數(shù),在當(dāng)前位置輸出
PutHzxy("C++語言",10,10);//沒有使用缺省參數(shù)
11.3C++程序結(jié)構(gòu)
我們從最簡單的程序例子來分析C++的程序組成。例:下面是一個完整的輸出程序。
#include<iostream.h>voidmain(){cout<<"hello,world!"<<endl;}
運行結(jié)果為:hello,world!C++的程序結(jié)構(gòu)由注釋,編譯預(yù)處理和程序主體組成.
一.注釋注釋是程序員為讀者作的說明,是提高程序可讀性的一種手段.二.編譯預(yù)處理每個以符號“#”開頭的行,稱為編譯預(yù)處理行.如“#include”稱為文件包含預(yù)處理命令.編譯預(yù)處理是C++組織程序的工具.三.程序主體main()表示主函數(shù),每一個C++程序都必須有一個main()函數(shù).Main()作為程序的入口.Main()前面的void表示該main()函數(shù)沒有返回值.函數(shù)體用花括號{
}括起來.描述一個函數(shù)所執(zhí)行算法的過程稱為函數(shù)定義.例如,這里的main()函數(shù)頭和函數(shù)體構(gòu)成了一個完整的函數(shù)定義.例如,下面的程序求一個表達式的值.#include<iostream.h>voidmain(){inta,b,result;
cout<<"pleaseinputtwonumber:\n";
cin>>a>>b;result=3*a-2*b+1;
cout<<"resultis"<<result<<endl;}運行結(jié)果為:
pleaseinputtwonumber:8612resultis235
11.4面向?qū)ο蟮某绦蛟O(shè)計的重要特征
11.4.1類
類是一種復(fù)雜的數(shù)據(jù)類型,構(gòu)成了實現(xiàn)C++面向?qū)ο蟪绦蛟O(shè)計的基礎(chǔ),它是將不同類型的數(shù)據(jù)和與這些數(shù)據(jù)相關(guān)的操作封裝在一起的集合體。因此,在面向?qū)ο笾蓄惥哂懈叩某橄笮?,類中的?shù)據(jù)具有隱藏性,類還具有封裝性(Inheritance)。類是面向?qū)ο蟪绦蛟O(shè)計的核心,它實際上是一種新的數(shù)據(jù)類型,也是抽象類型的工具,因為類是通過抽象數(shù)據(jù)類型的方法來實現(xiàn)的一種新的數(shù)據(jù)類型。類是對某一類對象的抽象。類的定義類(Class)是C++的精華,是進行封裝和數(shù)據(jù)隱藏的工具。這是面向?qū)ο蟪绦蛟O(shè)計的一個重要機制。封裝是描述把一個數(shù)據(jù)結(jié)構(gòu)同操作數(shù)據(jù)的函數(shù)銜接在一起構(gòu)成一個具有類類型的對象的術(shù)語。在C++中,封裝借助于類來達到的。封裝要求一個對象應(yīng)具備明確功能,并有一個接口以便和其它對象相互作用。函數(shù)是將邏輯上有關(guān)的語句和數(shù)據(jù)集合在一起,主要用于執(zhí)行;而類則是邏輯上有關(guān)的函數(shù)及其數(shù)據(jù)的集合,它主要不是用于執(zhí)行,而是提供所需要的資源。在使用一個類之前必須先定義類。定義一個類的語法格式如下所示:class<類名>{private:<私有成員數(shù)據(jù)及函數(shù);>protected:<保護成員數(shù)據(jù)及函數(shù);>public:<公共成員數(shù)據(jù)及函數(shù);>};
其中,class是定義類的關(guān)鍵字。<類名>是一種標(biāo)識符,一對花括號內(nèi)是說明部分(包括前面的類頭)說明該類的成員。類的成員包含數(shù)據(jù)成員和成員函數(shù)兩部分。一個類含有私有(private)成員、保護成員(protected)和公有成員(public)三部分。它們在類體內(nèi)(即一隊花括號內(nèi))出現(xiàn)的先后順序無關(guān),并且允許多次出現(xiàn),用它們來說明類成員的訪問權(quán)限。默認時在類中定義的項都是私有的。私有變量和函數(shù)只能被該類本身的成員函數(shù)存取或調(diào)用;保護成員除可以被本類中的成員函數(shù)訪問外,還可以被本類派生的類的成員函數(shù)訪問,因此用于類的繼承;公有成員可以被本類以外的函數(shù)訪問,是類與外部的接口。
類是面向?qū)ο蟪绦蛟O(shè)計最基本的單元,在設(shè)計面向?qū)ο蟪绦驎r,首先要以類的方式描述實際待解決的問題,也就是將問題所要處理的數(shù)據(jù)定義成類的私有或公共類型的數(shù)據(jù),同時將處理問題的方法定義成類的私有或公有的成員函數(shù)。其中,<各個成員函數(shù)的實現(xiàn)>是類定義中的實現(xiàn)部分,這部分包含所有在類體內(nèi)說明的函數(shù)的定義。如果一個成員函數(shù)在類體內(nèi)定義了,實現(xiàn)部分將不出現(xiàn)。如果所有的成員函數(shù)都在類體內(nèi)定義,則實現(xiàn)部分可以省略。例如,下面給出一個關(guān)于日期的類的定義,該類的對象將是某一個具體的日期。classTDate{private:
intyear,month,day;public:int
IsLeapYear();voidPrint();};定義類時的注意事項在類體中不允許對所定義的數(shù)據(jù)成員進行初始化。類中的數(shù)據(jù)成員類型可以是任意的,包含整型、浮點型、字符型、數(shù)組、指針和引用等,也可以是對象。當(dāng)一個類的對象作為這個類的成員時,如果另一個類的定義在后,需要提前說明。一般,在類體先說明公有成員,它們是用戶不感興趣的。在說明數(shù)據(jù)成員時,一般按數(shù)據(jù)成員的類型大小,由小到大說明,這樣可提高時空利用率。經(jīng)常習(xí)慣地將類定義的說明部分或者整個定義部分(包含實現(xiàn)部分)放到一個頭文件中。11.4.2對象在C++中,對象是聲明為類類型的一個數(shù)據(jù)項,是類的實際變量。程序員也可以定義類的變量。這個定義的類的變量在C++中就被稱為對象。對象有時也稱為類的實例(Instance)。由此可見,類是程序中的一個靜態(tài)的概念,而對象是程序中的一個動態(tài)的概念。對象是類的實例。對象是屬于某個已知的類。在創(chuàng)建對象中,類被用作模板,類和對象的關(guān)系就如同整型int與整型變量之間的關(guān)系。因此,定義對象之前,一定要先定義好該對象的類。對象的定義在C++中有兩種方法可以定義類的對象:第一種是在定義好類后,再定義類的對象,也是最常用的一種對象的定義方法,其一般格式如下:類名對象1[,對象2,...];
例如:TDatedate1,data2;
其中,Tdate
為日期類的類名,date1和date2是一般的對象名。除此之外,還可以是指向?qū)ο蟮闹羔樆蛞妹?,也可以是對象?shù)組名。當(dāng)有多個對象名時,多個對象名之間有逗號分隔。例如:Tdate*Pdate,data[31];
還有一種是在定義類的同時直接定義類的對象,即在定義類的右大括號“}”后直接寫出屬于該類的對象名表列,即:
class類名
{
成員變量表列;
成員函數(shù)表列;}對象名表列;對象成員的表示方法一個對象的成員就是該對象的類所定義的成員。對象成員有數(shù)據(jù)成員和成員函數(shù)。一般對象的成員表示如下:<對象名>.<成員名>或者<對象名>.<成員名>(<參數(shù)表>)前者用來表示數(shù)據(jù)成員的,后者用來表示成員函數(shù)的。例如,date1的成員表示為:
date1.year,date1.month,date1.day
分別表示Tdate類的date1對象的year成員,month成員和day成員。
Date1.SetDate(inty,intm,intd)
表示Tdate類的date1對象的成員函數(shù)SetDate()。
這里,.是一個運算符,該運算符的功能是表示對象的成員,用法同上。
指向?qū)ο蟮闹羔樀某蓡T表示如下:
<對象指針名>-><成員名>
或者
<對象指針名>-><成員名>(<參數(shù)表>)
這里的->是一個表示成員的運算符,它用來表示指向?qū)ο蟮闹羔樀某蓡T。下面的兩種表示是等價的:
<對象指針名>-><成員名>與(*<對象指針名>).<成員名>這對于成員函數(shù)也適用。
由同一個類所創(chuàng)建的對象的數(shù)據(jù)結(jié)構(gòu)是相同的,類中的成員函數(shù)是共享的。兩個不同的對象的名字是不同的,它們的數(shù)據(jù)結(jié)構(gòu)的內(nèi)容(即數(shù)據(jù)成員的值)是不同的。因此,系統(tǒng)對已經(jīng)定義的對象僅僅給它分配數(shù)據(jù)成員變量,而一般數(shù)據(jù)成員又都為私有成員,不同對象的數(shù)據(jù)成員的值可以是不同的。例如:分析下列程序的輸出結(jié)果。#include<iostream.h>#include"tdate.h"voidmain(){Tdatedate1,date2;date1.SetDate(1996,9,1);date2.SetDate(1998,10,10);cout<<leap<<endl;date1.Print();date2.Print();}執(zhí)行該程序后,輸出結(jié)果如下:11996.9.11998.10.10
該程序的主函數(shù)中,定義了兩個對象date1和date2,并通過成員函數(shù)SetDate()個對象date1和date2賦值。程序中,通過成員函數(shù)IsLeapYear()判斷對象date1的年份(1996)是否是閏年,本例輸出為1表示1996年是閏年。最后,通過調(diào)用成員函數(shù)Print()輸出顯示對象date1和date2的數(shù)據(jù)成員的值,即年、月和日。11.4.3構(gòu)造函數(shù)和析構(gòu)函數(shù)對象的意義表達了現(xiàn)實世界的實體,因此,一旦建立對象,必須有一個有意義的初始值。C++規(guī)定與類同名的成員函數(shù)是構(gòu)造函數(shù)。建立和初始化對象的過程專門由該類的構(gòu)造函數(shù)來完成。構(gòu)造函數(shù)的功能是在創(chuàng)建對象時,使用給定的值來將對象初始化。這個構(gòu)造函數(shù)很特殊,只要對象建立,它馬上被調(diào)用,給對象分配空間和初始化。C++另有一種析構(gòu)函數(shù),它也是類的成員函數(shù),它的功能是用來釋放一個對象的。在對象刪除前,用它來做一些清理工作,它與構(gòu)造函數(shù)的功能正好相反。例如,一張桌子要扔掉,必須將桌子里面的東西拿來這些東西可能有用,不能隨捉系一起扔。類似這些事就由析構(gòu)函數(shù)來完成。構(gòu)造函數(shù)的特點如下:構(gòu)造函數(shù)是成員函數(shù),函數(shù)體可寫在類體內(nèi),也可以寫在類體外。構(gòu)造函數(shù)是一個特殊的函數(shù),該函數(shù)的名字與類相同,該函數(shù)不指定類型說明,它有隱含的返回值,該值由系統(tǒng)內(nèi)部使用。該函數(shù)可以有一個參數(shù),也可以有多個參數(shù)。構(gòu)造函數(shù)可以重載,即可以定義多個參數(shù)個數(shù)不同的函數(shù)。程序中不能直接調(diào)用構(gòu)造函數(shù),在創(chuàng)建對象時系統(tǒng)自動調(diào)用構(gòu)造函數(shù)。析構(gòu)函數(shù)的特點如下:析構(gòu)函數(shù)是成員函數(shù),函數(shù)體可以寫在類體內(nèi),也可以寫在類體外。析構(gòu)函數(shù)也是一個特殊的函數(shù),它的名字同類名,并在前面加“~”字符,用來與構(gòu)造函數(shù)加以區(qū)別。析構(gòu)函數(shù)不指定數(shù)據(jù)類型,并且沒沒有參數(shù)。一個類中只可能定義一個析構(gòu)函數(shù)。析構(gòu)函數(shù)可以被調(diào)用,也可以調(diào)用。兩種情況下,析構(gòu)函數(shù)被自動調(diào)用。若一個對象被定義在一個函數(shù)體內(nèi),則當(dāng)這個函數(shù)結(jié)束時,該對象的析構(gòu)函數(shù)被自動調(diào)用;當(dāng)一個對象用new運算符被動態(tài)創(chuàng)建,在用delete運算符釋放它時,delete會自動調(diào)用析構(gòu)函數(shù)。
在類定義時沒有定義任何構(gòu)造函數(shù)時,則編譯器自動生成一個不帶參數(shù)的缺省構(gòu)造函數(shù),其格式如下:<類名>::<缺省構(gòu)造函數(shù)名>(){}
按構(gòu)造函數(shù)的規(guī)定,缺省構(gòu)造函數(shù)名同類名。缺省構(gòu)造函數(shù)的怎樣格式也可以由程序定義在類體中。在程序中定義一個對象而沒有指明初始化時,則編譯器便按缺省構(gòu)造函數(shù)來初始化該對象。
用缺省構(gòu)造函數(shù)對對象初始化時,則將對象的所有數(shù)據(jù)成員都初始化為零或空。同理,如果一個類中沒有定義析構(gòu)函數(shù)時,則編譯系統(tǒng)也生成一個稱為缺省析構(gòu)函數(shù),其格式如下:<類名>::~<缺省析構(gòu)函數(shù)名>{}<缺省析構(gòu)函數(shù)名>即為該類的類名。缺省析構(gòu)函數(shù)是一個空函數(shù)。11.4.4繼承性繼承是面向?qū)ο蟪绦蛟O(shè)計中最重要的機制。這種機制改變了過去傳統(tǒng)的非面向?qū)ο蟪绦蛟O(shè)計中那種對不適合要求的用戶定義數(shù)據(jù)類型進行改寫甚至重寫的法克服了傳統(tǒng)程序設(shè)計方法對編寫出來的程序無法重復(fù)利用程序資源的浪費的缺點。面向?qū)ο蟪绦蛟O(shè)計的繼承機制給我們提供了無限重復(fù)利用程序資源的一種途徑。
通過繼承機制,可以利用已有的數(shù)據(jù)類型來定義新的數(shù)據(jù)類型。所定義的的新的數(shù)據(jù)類型不僅擁有新定義的成員,而且還同時擁有舊的成員。我們稱已存在的用來派生新類的類為基類,又稱父類。由已存在的類派生出的新類稱為派生類,又稱為子類。
在C++語言中,一個派生類可以從一個基類派生,也可以從多個基類派生。從一個基類派生的繼承稱為單繼承;從多個基類派生第一張幻燈片的繼承稱為多繼承。單繼承形成了類的層次,如圖(a)和(b)所示。ABCXYZ(a)單繼承(b)多繼承派生類的定義格式:單繼承的定義格式如下:
class<派生類名>:<繼承方式><基類名>{<派生類新定義成員>};其中,<派生類名>是新定義的一個類的名字,它是從<基類名>中派生的,并且按指定的<繼承方式>派生的。<繼承方式>常使用如下三種關(guān)鍵字給予表示:
public表示公有基類;
private表示私有基類;
protected表示保護基類。多繼承的定義格式如下:
class<派生類名>:<繼承方式1><基類名1>,<繼承方式2><基類名2>,…{<派生類新定義的成員>};
派生類的三種繼承方式公有繼承(public)、私有繼承(private)和保護繼承(protected)是常用的三種繼承方式。1.公有繼承(public)
公有繼承的特點是基類的公有成員和保護成員作為派生類的成員時,它們都保持原有的狀態(tài),而基類的私有成員仍然是私有的。2.私有繼承(private)
私有繼承的特點是基類的公有成員和保護成員都作為派生類的私有成員,并且不能被這個派生類的子類所訪問。3.保護繼承(protected)
保護繼承的特點是基類的所有公有成員和保護成員都成為派生類的保護成員,并且只能被它的派生類成員函數(shù)或友元所訪問,基類的私有成員仍然是私有的。將上述三種不同繼承方式的基類特性與派生類特性見表11.5。
繼承方式基類特性派生類特性公有繼承publicprotectedprivatepublicprotected不可訪問私有繼承publicprotectedprivateprivateprivate不可訪問保護繼承publicprotectedprivateprotectedprotected不可訪問對于公有繼承方式:(1)基類成員對其對象的可見性:公有成員可見,其他不可見。這里保護成員同于私有成員。(2)基類成員對派生類的可見性:公有成員和保護成員可見,而私有成員不可見。這里保護成員同于公有成員。(3)基類成員對派生類對象的可見性:公有成員可見,其他成員不可見。對于私有繼承方式:(1)基類成員對其對象的可見性:公有成員可見,其他成員是不可見。(2)基類成員對派生類的可見性:公有成員和保護成員是可見的,而私有成員是不可見的?;惓蓡T對派生類對象的可見性:所有成員都是不可見的。對于保護繼承方式:該繼承方式與私有繼承方式的情況相同。兩者區(qū)別僅在于對派生類成員而言,對基類成員有不同的可見性。11.4.5作用域運算符類的方法的具體實現(xiàn)和普通函數(shù)的具體實現(xiàn)只是在函數(shù)的頭部有略微不同的格式。一般來說,如果類的方定義是在類的外部實現(xiàn)的,則在定義方法時必須把類名放在方法名之前,中間用作用域運算符(“::”)隔開,其一般形式如下所示:類名::方法名
這樣,即使幾個類中的方法名相同,也可以用這種形式把它們區(qū)分開來。和普通函數(shù)一樣,類的方法也應(yīng)該既有返回值類型,也有參數(shù)表列(當(dāng)然也可以沒有參數(shù))。一個方法的頭部各部分如下所示:訪問控制:函數(shù)返回值函數(shù)名(參數(shù)表列);
運算符::用來連接類名和成員名,以告知編譯程序這個成員屬于哪個類。但作用域運算符還有其它的用途:它允許在一個封閉的作用域里村區(qū)與局部說明相同的名字。例如:inti;//全局變量voidf(){inti;//局部變量i=10;//使用局部變量}
但是,如果函數(shù)f()要存取全局變量i,只需要將運算符::置于i之前即可。如下所示:inti;//全局變量voidf(){inti;//局部變量::i=10;//全局變量}11.4.6動態(tài)內(nèi)存分配在C語言里,動態(tài)內(nèi)存分配是通過使用函數(shù)malloc()和free()實現(xiàn)的。為
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《教育型非營利組織》課件
- 2025屆安徽省淮南一中等四校重點中學(xué)高考適應(yīng)性考試數(shù)學(xué)試卷含解析
- 江西省撫州市臨川區(qū)二中2025屆高考沖刺英語模擬試題含解析
- 2025屆新疆阿克蘇市農(nóng)一師中學(xué)高三適應(yīng)性調(diào)研考試語文試題含解析
- 2025屆安徽省合肥市高升學(xué)校高考英語必刷試卷含解析
- 《solidworks 機械設(shè)計實例教程》 課件 任務(wù)10.2 閥體工程圖的設(shè)計
- 山東省日照實驗高級中學(xué)2025屆高三下學(xué)期第六次檢測語文試卷含解析
- 《solidworks 機械設(shè)計實例教程》 課件 任務(wù)5.2 套筒的設(shè)計
- 北京2025屆高考英語五模試卷含解析
- 湖北省恩施州三校聯(lián)盟2025屆高三最后一卷語文試卷含解析
- 安徽省水利工程資料表格
- 留守兒童一生一檔、聯(lián)系卡
- GB/T 2007.2-1987散裝礦產(chǎn)品取樣、制樣通則手工制樣方法
- GB/T 19068.1-2017小型風(fēng)力發(fā)電機組第1部分:技術(shù)條件
- GB/T 1354-2018大米
- GB/T 10322.5-2016鐵礦石交貨批水分含量的測定
- 高三英語寫作專項道歉信 感謝信 投訴信課件
- 高中數(shù)學(xué)高級教師職稱評審答辯題目
- 項目學(xué)習(xí)《動物的類群復(fù)習(xí)課》教學(xué)設(shè)計
- 超材料(metamaterials)教學(xué)講解課件
- 高凈值個人財富管理稅務(wù)風(fēng)險與應(yīng)對課件講義
評論
0/150
提交評論