ch3 C++類和對象_第1頁
ch3 C++類和對象_第2頁
ch3 C++類和對象_第3頁
ch3 C++類和對象_第4頁
ch3 C++類和對象_第5頁
已閱讀5頁,還剩91頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Class and Object,從下面三個例子中,注意結(jié)構(gòu)如何轉(zhuǎn)換到類的發(fā)展過程 一、結(jié)構(gòu) (1)一個簡單的結(jié)構(gòu):Time struct Time int hour; int minute; int second; ; 一個例子: int main(int argc, char* argv) char c; struct Time int hour; int minute; int second; ;,/結(jié)構(gòu)的定義 Time timeObject,timeArray10,*timePtr,cout時間4為:timeRef.hour:timeRef.minute: timeRef.second

2、 endl; cout時間4為:timeObject.hour:timeObject.minute: timeObject. secondendl; cout時間4為:(*timePtr).hour:“ (*timePtr).minute:(*timePtr). secondendl; ,(2)、一個帶有處理方法的結(jié)構(gòu):Time 例子二: struct Time / structure definition int hour; / 0-23 int minute; / 0-59 int second; / 0-59 ; void printMilitary( const Time ,dinne

3、rTime.second = 0; cout Dinner will be held at ; printMilitary( dinnerTime ); /注意:對象作為參數(shù);函數(shù)不附屬于對象 cout military time,nwhich is ; printStandard( dinnerTime ); /張三用可以自己的方法取李四的銀子 cout standard time.n; / set members to invalid values dinnerTime.hour = 29; dinnerTime.minute = 73; cout nTime with invalid v

4、alues: ; printMilitary( dinnerTime ); cout endl; return 0; ,void printMilitary( const Time ,方法和數(shù)據(jù)同屬于結(jié)構(gòu),(3)、一個實現(xiàn)數(shù)據(jù)與處理封裝在一起的結(jié)構(gòu):Time 例子三:例子二的改進(jìn):數(shù)據(jù)和方法的封裝 struct Time int hour; int minute; int second; void printMilitary() cout ( hour 10 ? 0 : ) hour :“ ( minute 10 ? 0 : ) minute; void printStandard() cou

5、t ( ( hour = 0 | hour = 12 ) ? 12 : hour % 12 ) : ( minute 10 ? 0 : ) minute : ( second 10 ? 0 : ) second ( hour 12 ? AM : PM ); ; /end of struct time,int main() Time dinnerTime; dinnerTime.hour = 18; dinnerTime.minute = 30; dinnerTime.second = 0; cout Dinner will be held at ; dinnerTime.printMilita

6、ry(); cout military time,nwhich is ; dinnerTime.printStandard(); /函數(shù)附屬于對象,注意沒有了參數(shù) cout “ standard time.n”; /張三取錢(肯定取自己的錢) dinnerTime.hour = 29; dinnerTime.minute = 73; cout nTime with invalid values: ; dinnerTime.printMilitary(); cout endl; return 0; /注意:在缺省情況下,結(jié)構(gòu)中的成員是公有的。,(4)、訪問結(jié)構(gòu)成員 訪問結(jié)構(gòu)成員或(類成員)時,使

7、用成員訪問運(yùn)算符,包括圓點(diǎn)運(yùn)算符(.)和箭頭運(yùn)算符(-)。圓點(diǎn)運(yùn)算符通過對象的變量名或?qū)ο蟮囊迷L問結(jié)構(gòu)(或類成員)。箭頭運(yùn)算符通過對象指針訪問結(jié)構(gòu)或類成員。,類的特性: 1、數(shù)據(jù)數(shù)據(jù)成員; 2、操作成員函數(shù);,3、一個類的定義實現(xiàn)了數(shù)據(jù)封裝: (1)類外不可見:(即封裝起來的部分) 私有段數(shù)據(jù) 私有段函數(shù)原型 私有段函數(shù)和公有段函數(shù)的實現(xiàn) (2)類外可見: (即一個類向外提供的部份) 公有段數(shù)據(jù) 公有段函數(shù)原型,注意:數(shù)據(jù)封裝是一個相對概念,只是對于類外而言;而對于類內(nèi),所有成員都是互相可見的。,4、一個類的成員函數(shù)的實現(xiàn),可以在類內(nèi)完成,也可以在類外實現(xiàn),但函數(shù)本身仍然是類內(nèi)的函數(shù)。 5、

8、類的實例對象 一個類可以定義多個對象,每個對象都包含類中定義的各個數(shù)據(jù)成員的存儲空間,共享類中定義的成員函數(shù)。 6、類外訪問成員的方法: (1)對象名.公有段的成員函數(shù)名() (2)對象名.公有段的數(shù)據(jù) (3)還可以說明一個指向?qū)ο蟮闹羔榿碓L問公有段成員函數(shù),如: 指向?qū)ο蟮闹羔樄卸蔚某蓡T函數(shù)名() 指向?qū)ο蟮闹羔樄卸蔚臄?shù)據(jù),二、類 注意:OOP(面向?qū)ο蟮脑O(shè)計)將數(shù)據(jù)(屬性)和函數(shù)(行為)封裝到稱為類的軟件包 中。一個類可以多次復(fù)用,建立多個類對象。 類具有信息隱藏特性,即類對象只知道如何通過定義良好的接口與其他類對象通 信,而不需知道其他類的實現(xiàn)方法。信息隱藏是良好的軟件工程的一個重要

9、環(huán)節(jié)。 (1)、類的聲明格式: class 類名 private: 私有數(shù)據(jù)成員和成員函數(shù) public: 公有數(shù)據(jù)成員和成員函數(shù) protected: 保護(hù)數(shù)據(jù)成員和成員函數(shù) ;,表示缺省設(shè)置,在C+中,新的數(shù)據(jù)類型可以用class來構(gòu)造,class聲明的語法與C語言中的 struct聲明相似,只是class中還包含函數(shù)聲明(實際上struct也可以包含函數(shù))。 例: class point int x,y; public: void setpoint(int,int) 在上例中聲明一個名為Point的類,它所包含的數(shù)據(jù)內(nèi)容(屬性)為x、y,它所包 含的函數(shù)操作為setpoint,此函數(shù)是對

10、其數(shù)據(jù)內(nèi)容x,y的操作。,(2)、用類來實現(xiàn)Time結(jié)構(gòu) 例一: class Time public: Time(); / constructor/構(gòu)造函數(shù) void setTime( int, int, int ); void printMilitary(); void printStandard(); private: int hour; / 0 - 23 int minute; / 0 - 59 int second; / 0 - 59 ;,Time:Time() hour = minute = second = 0; /注意,該函數(shù)與類同名 void Time:setTime( int

11、 h, int m, int s ) hour = ( h = 0 ,int main() Time t; cout The initial military time is ; t.printMilitary(); cout nThe initial standard time is ; t.printStandard(); t.setTime( 13, 27, 6 ); cout nnMilitary time after setTime is ; t.printMilitary(); cout nStandard time after setTime is ; t.printStanda

12、rd(); t.setTime( 99, 99, 99 ); cout nnAfter attempting invalid settings: nMilitary time: ; t.printMilitary(); cout nStandard time: ; t.printStandard(); cout endl; return 0; ,(3)、數(shù)據(jù)成員/函數(shù)成員、公有/私有/保護(hù) 數(shù)據(jù)成員可以是任何數(shù)據(jù)類型,除了register、extern 不能在類的聲明中給類賦初值(區(qū)別缺省值),只有在對象定義后才可以,why? 缺省表示是私有的,private private:私有成員只能被該

13、類的成員函數(shù)訪問 public:公有成員可以被程序中的其他函數(shù)(包括main)訪問,它們是類的接口, 通過接口為外部提供類操作的方法。 protected:保護(hù)成員可以被該類的派生類的成員函數(shù)訪問,但對其它類是隱蔽的, 不可訪問的。 以Time為例,說明private與public t.hour=5; 如何設(shè)置t的hour,問題:引用和private數(shù)據(jù)成員 如何破壞封裝性? #include class Time public: Time( int = 0, int = 0, int = 0 ); void setTime( int, int, int ); int getHour(); i

14、nt ,Time:Time( int hr, int min, int sec ) setTime( hr, min, sec ); void Time:setTime( int h, int m, int s ) hour = ( h = 0 / DANGEROUS reference return ,int main() Time t; int ,(4)、成員函數(shù)的定義 成員函數(shù)的聲明有兩種: 一種是在類聲明中只給出函數(shù)原型,然后在類的外部定義。要使用到域運(yùn)算符:。 如上面的例子。 另一種定義在類的內(nèi)部(包括顯式與隱式) 其中顯式用inline嵌入到類內(nèi) 隱式直接寫在類內(nèi),第二種的隱式:

15、class Time / structure definition int hour; / 0-23 int minute; / 0-59 int second; / 0-59 void printMilitary() cout ( hour 10 ? 0 : ) hour : ( minute 10 ? 0 : ) minute; void printStandard() cout ( ( hour = 0 | hour = 12 ) ? 12 : hour % 12 ) : ( minute 10 ? 0 : ) minute : ( second 10 ? 0 : ) second (

16、hour 12 ? AM : PM ); ;,第二種顯式: 在外部定義的方法前加inline關(guān)鍵詞限定,從而在編譯時將其轉(zhuǎn)換為內(nèi)部。 class Time public: Time(); void setTime( int, int, int ); private: int hour; / 0 - 23 int minute; / 0 - 59 int second; / 0 - 59 ; inline Time:Time() hour = minute = second = 0; /下面一句是否等價?構(gòu)造函數(shù)無返回值 /inline void Time:Time() hour = minut

17、e = second = 0; inline void Time:setTime( int h, int m, int s ) hour = ( h = 0 ,(5)、類和對象的關(guān)系 類和對象之間的關(guān)系,可以用整型int和整型變量i之間的關(guān)系來類比。 C+把類的變量稱為類的對象,對象是類的實例化如同i是int的變量。 聲明了一個類便聲明了一個新的類型,類本身不接受和存儲具體的值,只作為生 成具體對象的一種“樣板”,只有定義了對象后,系統(tǒng)才為對象分配存儲空間。 如果在函數(shù)外,在聲明類的同時定義的對象是一個全局的對象。如: class point op1,op2; main() ,(6)、對象的定

18、義和使用 定義方法1: class point private: int x,y; public: void setpoint(int,int) ; op1,op2; 定義方法2: class point private: int x,y; public: void setpoint(int,int) ; ; point p1,p2;,對象的引用 對象名.數(shù)據(jù)成員名 對象名.成員函數(shù)名(參數(shù)表) 對象指針名-數(shù)據(jù)成員名 對象指針名-成員函數(shù)名(參數(shù)表) 如: point p1,*p2; couty; 不能直接引用x,y,對象賦值: point p1,p2; p2=p1; 等同于: p2.x=p

19、1.x; p2.y=p1.y; 即將數(shù)據(jù)值復(fù)制過去,對象空間仍然是獨(dú)立的。 如果類中存在指針,可能會產(chǎn)生錯誤。Why? class sample public: int i,j; int *ip; s1,s2;,類的作用域 一個類的成員函數(shù)可以不受限制地引用該類的數(shù)據(jù)成員,而在該類作用域之外,對該類的數(shù)據(jù)成員和成員函數(shù)的引用要受到一定的限制。 class abc public: int i; void iinc(); void jset(int); void jprint(); private: int j; void jinc(); ; void abc:iinc() i+; void ab

20、c:jinc()j+; void abc:jset(int sj) j=sj; jinc(); void abc:jprint() coutj=jendl; ,int main() int i; abc t1; t1.i=5; t1.iinc(); coutt1.iendl; /下面兩句是否正確 /t1.j=6; t1.jinc(); t1.jset(11); t1.jprint(); ,一個建議: 一般應(yīng)將數(shù)據(jù)成員全部定義成private,而將對這些數(shù)據(jù)成員操作的成員函數(shù)設(shè)置為public,這樣對數(shù)據(jù)的操作只能通過調(diào)用這些函數(shù)來完成(接口)。 為什麼?如: private: int x,y;

21、 public: void setX(int); int getX();,三、Construct and Destruct of Class 類的構(gòu)造與析構(gòu)分別由類的構(gòu)造函數(shù)和析構(gòu)函數(shù)來實現(xiàn),其中構(gòu)造函數(shù)與析構(gòu)函數(shù)與類同名,只是析構(gòu)函數(shù)前多了一個 符號。,1、為什麼要構(gòu)造和析構(gòu)函數(shù)? 對象的運(yùn)行與存在需要分配存儲空間和初始化,構(gòu)造函數(shù)則是用來為該類的對象 實例分配內(nèi)存空間和初始化數(shù)據(jù),而析構(gòu)與構(gòu)造相反,它在對象運(yùn)行完畢時釋放 對象實例所占用的內(nèi)存空間。 2、構(gòu)造函數(shù)與析構(gòu)函數(shù)的運(yùn)行: 在每次生成類對象(對象實例化)時自動調(diào)用構(gòu)造函數(shù)。 在刪除對象實例時,及程序執(zhí)行離開類對象的作用域范圍時自動調(diào)

22、用析構(gòu)函數(shù)。 3、構(gòu)造函數(shù)性質(zhì) (1)函數(shù)名與類名同 (2)不能有返回值,包括void (3)定義對象時,系統(tǒng)自動調(diào)用構(gòu)造函數(shù),4、構(gòu)造函數(shù)的定義 如果用戶不定義構(gòu)造函數(shù),則系統(tǒng)自動生成類的構(gòu)造函數(shù)和析構(gòu)函數(shù),只是這時 只能分配和釋放對象實例的存儲空間,而不進(jìn)行初始化或其他工作。 class point private: int x,y; public: setpoint(int,int); ; main() func1() point p1,p2; /定義類point的對象x1,x2時調(diào)用構(gòu)造函數(shù) . . p1=p2; /什麼時候析構(gòu) 注意:跟蹤調(diào)試構(gòu)造與析構(gòu) ,5、帶缺省參數(shù)的構(gòu)造函數(shù) c

23、lass complex private: double real; double imag; public: complex(double r=0.0,double i=0.0); 這時: complex s1; /全部用缺省值 complex s2(1.1); /只傳遞一個參數(shù) complex s3(1.1,2.2); /傳遞二個參數(shù) 在上面定義了三個對象sl,s2,s3,它們都是定義合法的對象,傳遞不同的參數(shù),使它們的私有成員real,imag取得不同的值。,缺省參數(shù)并不只用于構(gòu)造函數(shù),一般的成員函數(shù),甚至于一般的全局函數(shù)都可以使用缺省參數(shù)。 前面所介紹的缺省參數(shù)的用法,不管是單個參數(shù)缺

24、省,還是多個參數(shù)缺省,都是全缺省的情況,也就是說在函數(shù)中所帶的參數(shù)都是可缺省的。在許多應(yīng)用中,經(jīng)常會遇到這樣的情況,在函數(shù)所帶的參數(shù)中,有一部分可以缺省,而有一部分不可缺省。此時所采取的規(guī)則是,所有取缺省值的參數(shù)必須出現(xiàn)在不取缺省值的參數(shù)的右邊。也就是說所有的缺省參數(shù)必須是參數(shù)表中最后的參數(shù)。下面的例子非常清楚地描述了這個原則:,缺省參數(shù)并不只用于構(gòu)造函數(shù),一般的成員函數(shù),甚至于一般的全局函數(shù)都可以使用缺省參數(shù)。 前面所介紹的缺省參數(shù)的用法,不管是單個參數(shù)缺省,還是多個參數(shù)缺省,都是全缺省的情況,也就是說在函數(shù)中所帶的參數(shù)都是可缺省的。在許多應(yīng)用中,經(jīng)常會遇到這樣的情況,在函數(shù)所帶的參數(shù)中,有

25、一部分可以缺省,而有一部分不可缺省。此時所采取的規(guī)則是,所有取缺省值的參數(shù)必須出現(xiàn)在不取缺省值的參數(shù)的右邊。也就是說所有的缺省參數(shù)必須是參數(shù)表中最后的參數(shù)。下面的例子非常清楚地描述了這個原則:,問題:對于帶有參數(shù)而不具有默認(rèn)值的構(gòu)造函數(shù),如果在定義類對象時沒有帶參數(shù),會出現(xiàn)怎樣情況? (參數(shù)列表必須對應(yīng)) #include iostream.h class complex private: double real; double imag; public: complex(double,double); ; complex:complex(double r,double i) real=r;

26、imag=i; void main() complex s1; complex s2(1.1); complex s3(1.1,2.2); ,6、析構(gòu)函數(shù) 類的析構(gòu)函數(shù)不接受參數(shù)也不返回數(shù)值,類只有一個析構(gòu)函數(shù),不能進(jìn)行析構(gòu)函數(shù)的重載。 每個類必須有一個析構(gòu)函數(shù),若沒有顯式地為一個類定義析構(gòu)函數(shù),則編譯系統(tǒng)會自動地生成一個缺省的析構(gòu)函數(shù)。對于多數(shù)類而言,缺省的析構(gòu)函數(shù)就能滿足要求.如果在某個對象在析構(gòu)以前要進(jìn)行一些內(nèi)部處理,則要顯式地定義析構(gòu)函數(shù)。,7、重載構(gòu)造函數(shù) 類sample有三個構(gòu)造函數(shù),則這三個構(gòu)造函數(shù)要符合函數(shù)重載的要求,不能造成 二義性。 class sample public:

27、 sample(); sample(int,int); sample(double); 比較下面3個: sample(int,int); sample(double,int); sample(int,double);,例子: #include iostream.h #include string.h class sample public: int i; sample()i=1; sample(int j1=0,int j2=0)i=j1; sample(double d)i=int(d); ; void main(int argc, char* argv) sample s,s1(1,1),

28、s2(1.1); ,注意:二義性問題討論: 在定義構(gòu)造函數(shù)時,一定要注意,所定義的多個構(gòu)造函數(shù)之間,在參數(shù)的個 數(shù)或類型上必須存在差異,否則在系統(tǒng)調(diào)用時就會出現(xiàn)二義性。 我們在上一節(jié)講了函數(shù)的缺省參數(shù),在定義多個構(gòu)造函數(shù),又使用缺省參數(shù) 時,特別要注意防止出現(xiàn)二義性。 通過下面的例子,可以看出二義性出現(xiàn)的可能性: 在這個類的定義中,我們看出:在類中定義了兩個構(gòu)造函數(shù),一個是不帶參數(shù)的 構(gòu)造函數(shù),一個是帶一個整型參數(shù)的構(gòu)造函數(shù)。這兩個構(gòu)造函數(shù)無論是在所帶參 數(shù)的個數(shù)上,還是在所帶參數(shù)的類型上都不同,是不應(yīng)該產(chǎn)生二義性的。,下面我們用一個main()函數(shù)來使用這個類: main() / X one

29、(10); /定義x類的兩個對象 X two; / 上面定義了兩個對象: 對象one,在定義過程中,傳遞了一個整型參量10,它與x(int)相匹配,因 此在創(chuàng)建對象one的同時,調(diào)用構(gòu)造函數(shù)x(int i)對對象one初始化。 對象two,在定義過程中,沒有傳遞參數(shù),此時有兩種可能的情況:第一種是 在創(chuàng)建對象時調(diào)用不帶參數(shù)的構(gòu)造函數(shù)x()來對對象初始化;另一種情況是在創(chuàng)建 對象時調(diào)用帶缺省參數(shù)的構(gòu)造函數(shù)x(int i=0)來對對象進(jìn)行初始化,參數(shù)取缺省 值0。這兩種情況的存在使系統(tǒng)無法確定到底調(diào)用哪個構(gòu)造函數(shù),這就出現(xiàn)了二義 性。,8、構(gòu)造與析構(gòu)的順序 class CreateAndDestr

30、oy public: CreateAndDestroy( int,string ); / constructor CreateAndDestroy(); / destructor private: int data; string memo; zero(0, zero ); CreateAndDestroy : CreateAndDestroy( int value, string str) data = value; memo=str; cout Object memo constructorendl; CreateAndDestroy : CreateAndDestroy() cout O

31、bject memo destructor endl; void create( void ); / prototype CreateAndDestroy first( 1, first ); / global object,void main() cout (global created before main) endl; CreateAndDestroy second( 2, second ); / local object cout (local automatic in main) endl; static CreateAndDestroy third( 3, third ); /

32、local object cout (local static in main) endl; create(); / call function to create objects CreateAndDestroy fourth( 4, fourth ); / local object cout (local automatic in main) endl; ,/ Function to create objects void create( void ) CreateAndDestroy fifth( 5, fifth ); cout (local automatic in create)

33、endl; static CreateAndDestroy sixth( 6, sixth ); cout (local static in create) endl; CreateAndDestroy seventh( 7, seventh ); cout (local automatic in create) endl; ,9、拷貝構(gòu)造函數(shù) 拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),用來將一個已存在對象的值賦給一個新對 象(當(dāng)新對象建立時)。首先,它是一個構(gòu)造函數(shù),當(dāng)創(chuàng)建一個新對象時系統(tǒng)自動 調(diào)用它;其次,它的特殊功能是將參數(shù)代表的對象逐域拷貝到新創(chuàng)建的對象中。 (1)缺省的拷貝構(gòu)造函數(shù) 同其他構(gòu)

34、造函數(shù)一樣,如果沒有用戶自定義的拷貝構(gòu)造函數(shù),系統(tǒng)將提供一個缺 省的拷貝構(gòu)造函數(shù): 拷貝構(gòu)造函數(shù)的定義與使用有兩種: point p1(30,40); point p2(p1); /顯式調(diào)用 point p3=p1; /復(fù)制式調(diào)用,筆試題:C+中的空類,默認(rèn)產(chǎn)生哪些類成員函數(shù)? class Empty public: Empty(); / 缺省構(gòu)造函數(shù) Empty( const Empty,例子: class point int x,y; public: point(int a,int b) x=a;y=b; void print() coutx yendl; void setx(int i)

35、 x=i; ; void main(int argc, char* argv) point p1(30,40); point p2(p1); point p3=p1; p3.setx(9); p1.print(); p2.print(); p3.print(); ,30 40 30 40 9 40 Press any key to continue,(2)用戶自定義拷貝構(gòu)造函數(shù) 自定義拷貝構(gòu)造函數(shù)的一般形式:point (const point ,void main() point p1(30,40); point p2(p1); point p3=p1; p3.setx(9); p1.pri

36、nt(); p2.print(); p3.print(); ,淺 拷 貝,#include #include class Person public: Person(char* pN) coutconstruct pNendl; pName = new charstrlen(pN)+1; if(pName) strcpy(pName,pN); Person() coutdestruct pNameendl; pName0=0; delete pName; private: char* pName; ;,int main() Person p1(Randy); Person p2=p1; 淺拷貝

37、:僅復(fù)制了對象,沒有復(fù)制資源,多個對象指向同一資源,深 拷 貝,加入拷貝構(gòu)造函數(shù) Person(const Person 深拷貝:不僅復(fù)制了對象,并且復(fù)制了資源,四、對象數(shù)組與對象指針 1、對象數(shù)組 例子: class exam int x; public: void set_x(int n) x=n; int get_x() return x; ; void main(int argc, char* argv) exam ob4; int j; for (j=0;j4;j+) coutobj.get_x() ; coutendl; ,例子:帶有自定義構(gòu)造函數(shù) #include iostrea

38、m.h class exam int x; public: exam(int n) x=n; void set_x(int n) x=n; int get_x() return x; ; int main(int argc, char* argv) exam ob4=11,22,33,44; /初始化數(shù)據(jù), 構(gòu)造函數(shù)是哪一個? /exam bb(1,2); /找不到對應(yīng)的構(gòu)造函數(shù) /exam oo; int j; for (j=0;j4;j+) coutobj.get_x() ; coutendl; ,例子三: class exam int x,y; public: exam() x=5;y=

39、5; exam(int n,int m) x=n;y=m; void set_x(int n) x=n; int get_x() return x; int get_y() return y; ; void main(int argc, char* argv) exam ob0(4,4); exam ob15; /exam ob15=exam(4,4),exam(3,3),exam(2,2),exam(1,1),exam(0,0); coutob0.get_x() ob0.get_y()endl; int j; for (j=0;j5;j+) coutob1j.get_x() ob1j.get

40、_y()endl; ,2、對象指針 如上例中: exam ob0, *obp; 注意:如何使用obp? 對象指針與構(gòu)造函數(shù)怎樣關(guān)系? #include iostream.h class exam public: int x,y; exam() x=5;y=5; exam(int n,int m) x=n;y=m; void set_x(int n) x=n; int get_x() return x; int get_y() return y; ;,2、對象指針 如上例中: exam ob0, *obp; 注意:如何使用obp? 對象指針與構(gòu)造函數(shù)怎樣關(guān)系? #include iostream

41、.h class exam public: int x,y; exam() x=5;y=5; exam(int n,int m) x=n;y=m; void set_x(int n) x=n; int get_x() return x; int get_y() return y; ;,void main(int argc, char* argv) exam ob0(4,4); exam ob15; exam *ob2; /有沒有調(diào)用構(gòu)造函數(shù)? coutxx=99; ob2-y=98; coutxyendl; 需要: ob2=new exam(); delete ob2;,3、this指針:th

42、is指針是指向當(dāng)前對象的指針 #include iostream.h class exam int i; public: void load(int val) this-i=val; /等同于i=val; int get() return this-i; ; void main(int argc, char* argv) exam ob1,ob2; ob1.load(100); coutob1.get()endl; ob2.load(99); coutob2.get()endl; ,五、函數(shù)中對象參數(shù)的傳遞 1、傳值=對象(或普通變量)為參數(shù) #include iostream.h class

43、 exam int i; public: void load(int val) i=val; int get() return this-i; ; void printval(exam ob) cout“byval:; coutob.get()endl; ,void main() exam ob1,ob2; ob1.load(100); printval(ob1); ob2.load(99); printval(ob2); ,2、傳地址=對象指針(或普通變量指針)為參數(shù) 問題:是否會影響參數(shù)對象本身? class exam int i; public: void load(int val) i

44、=val; int get() return this-i; ; void setval(exam *ob) ob-load(77); ,void main() exam ob1,ob2; ob1.load(100); setval( ,七、常類型 1. 一般常量 一般常量是指簡單類型的常量。這種常量在定義時,修飾符const可以用在類型 說明符前,也可以用在類型說明符后。如: int const x=2; 或 const int x=2; 定義或說明一個常數(shù)組可采用如下格式: const 或者 const 例如: int const a5=1, 2, 3, 4, 5;,2. 常指針 使用co

45、nst修飾指針時,由于const的位置不同,而含意不同。下面舉兩個例子, 說明它們的區(qū)別。 下面定義的一個指向字符串的常量指針:char * const prt1 = stringprt1; 其中,ptr1是一個常量指針。因此,下面賦值是非法的。 ptr1 = stringprt2; 而下面的賦值是合法的: *ptr1 = m; 因為指針ptr1所指向的變量是可以更新的,不可更新的是常量指針ptr1所指的 方向(別的字符串)。 下面定義了一個指向字符串常量的指針:const char * ptr2 = stringprt1; 其中,ptr2是一個指向字符串常量的指針。ptr2所指向的字符串不能

46、更新的,而ptr2是可以更新的。因此, *ptr2 = x; 是非法的,而: ptr2 = stringptr2; 是合法的。 所以,在使用const修飾指針時,應(yīng)該注意const的位置。定義一個指向字符串 的指針常量和定義一個指向字符串常量的指針時,const修飾符的位置不同,前者 const放在*和指針名之間,后者const放在類型說明符前。,3. 常引用 使用const修飾符也可以說明引用,被說明的引用為常引用,該引用所引用的對 象不能被更新。其定義格式如下: const ,void main() int arrayN; for (int i=0; iarrayi; print(arra

47、y, N); void print(const int *p, int n) cout*p; for (int i=1; iN;i+) cout,*(p+i); cout ,4、常對象 常對象是指對象常量,定義格式如下: class A; const A a; A const a; 定義常對象時,同樣要進(jìn)行初始化,并且該對象不能再被更新,修飾符 const可以放在類名后面,也可以放在類名前面。,例子: class sample public: int x,y; sample(int x=0,int y=0) sample:x=x; sample:y=y; void disp()coutx y;

48、 ; void main() const sample s(5,6); s.disp(); s.x=5; ,5、常對象成員和常數(shù)據(jù)成員 類型修飾符可以說明數(shù)據(jù)成員。 由于const類型對象必須被初始化,并且不能更新,因此,在類中說明了const 數(shù)據(jù)成員時,只能通過成員初始化列表的方式來生成構(gòu)造函數(shù)對數(shù)據(jù)成員初始化。 下面通過一個例子講述使用成員初始化列表來生成構(gòu)造函數(shù)。 class A public: A(int i); void print(); const int ,在該程序中,說明了如下三個常類型數(shù)據(jù)成員: const int 其中,r是常int型引用,a是常int型變量,b是靜態(tài)常i

49、nt型變量。 程序中對靜態(tài)數(shù)據(jù)成員b進(jìn)行初始化。 值得注意的是構(gòu)造函數(shù)的格式如下所示: A(int i):a(i),r(a) 其中,冒號后邊是一個數(shù)據(jù)成員初始化列表,它包含兩個初始化項,用逗號進(jìn)行 了分隔,因為數(shù)據(jù)成員a和r都是常類型的,需要采用初始化格式。,6、常成員函數(shù) 使用const關(guān)鍵字進(jìn)行說明的成員函數(shù),稱為常成員函數(shù)。只有常成員 函數(shù)才有資格操作常量或常對象,沒有使用const關(guān)鍵字說明的成員函數(shù)不 能用來操作常對象。常成員函數(shù)說明格式如下: () const; 其中,const是加在函數(shù)說明后面的類型修飾符,它是函數(shù)類型的一個組成 部分,因此,在函數(shù)實現(xiàn)部分也要帶const關(guān)鍵字

50、。下面舉一例子說明常成 員函數(shù)的特征。 class R public: R(int r1, int r2) R1=r1; R2=r2; void print(); void print() const; private: int R1, R2; ;,void R:print() coutR1“,”R2endl; void R:print() const coutconst:R1 “,” R2endl; /R1=5; void main() R a(5, 4); a.print(); const R b(20, 52); b.print(); 該例子的輸出結(jié)果為: 5,4 const:20;52

51、 該程序的類聲明了兩個成員函數(shù),其類型是不同的(其實就是重載成員函數(shù))。 有帶const修飾符的成員函數(shù)處理const常量,這也體現(xiàn)出函數(shù)重載的特點(diǎn)。,說明: 1)如果將一個對象說明為常對象,則通過該對象只能調(diào)用它的常成員函數(shù),而不能 調(diào)用普通的成員函數(shù)。常成員函數(shù)是常對象唯一的對外接口。 2)常成員函數(shù)不能更新對象的數(shù)據(jù)成員,也不能調(diào)用該類中的普通成員函數(shù)。 以上紅色部分在不同的編譯中可能為警告或錯誤 但普通函數(shù)可以調(diào)用常成員函數(shù).,六、靜態(tài)成員 在類定義中,它的成員(包括數(shù)據(jù)成員和函數(shù)成員)可以聲明成靜態(tài)的,即用關(guān)鍵字static,這些成員就被稱為靜態(tài)成員。它的特征是不管這個類創(chuàng)建了多少個

52、對象,而其靜態(tài)成員只有一個副本,這個副本被所有的對象(屬于這個類的)共享。 靜態(tài)成員在類中有兩種情況,即靜態(tài)數(shù)據(jù)成員和靜態(tài)函數(shù)成員. 1、 靜態(tài)的數(shù)據(jù)成員: 在一個類中,若將一個數(shù)據(jù)成員說明成static,這種成員稱為靜態(tài)數(shù)據(jù)成員。無論建立多少個該類的對象,都只有一個靜態(tài)數(shù)據(jù)的拷貝。當(dāng)這個類的第一個對象被建立時,所有static數(shù)據(jù)都被初始化,并且,以后再建立對象時,就不需再對其做初始化。 注意:靜態(tài)成員的初始化方法與位置:應(yīng)在該類的任何對象建立之前就存在。 所有對象使用同一個靜態(tài)成員(所有對象的靜態(tài)成員只有一個拷貝),即同一個內(nèi)存空間。,class student static int co

53、unt; int studentno; public: student() count+; studentno=count; void print() coutstudentstudentno ; coutcount=countendl; ;,int student:count=0; void main() student s1; s1.print(); coutprint(); /delete ss; student s2; s1.print(); cout-endl; student s3; s1.print(); cout-endl; ,注意: (1)靜態(tài)數(shù)據(jù)成員屬于類,而不是屬于某一個

54、對象實例,因此可以用。 “類名:靜態(tài)成員”來訪問。如上例中可以: coutstudent:countendl; 注意要將student:count設(shè)為public (2)靜態(tài)成員不能在類中進(jìn)行初始化,是在編譯創(chuàng)建時初始化的。 (3)靜態(tài)成員應(yīng)該在該類的任何對象被建立之前就存在。 (4)使用靜態(tài)成員可以使程序員不必使用全局變量,有利于面向?qū)ο蟮姆庋b。 注意:全局變量與類靜態(tài)成員的區(qū)別,2、靜態(tài)的成員函數(shù) 例子:主要用于對靜態(tài)數(shù)據(jù)成員或全局變量的訪問 class student static int count; int studentno; public: student() count+;st

55、udentno=count; static void init()count=1; static void print() /coutstudentno ; /靜態(tài)成員函數(shù)中有this指針? coutcount=countendl; ;,int student:count=0; void main() /student:init(); student s1; s1.print(); cout-endl; student s2; s1.print(); cout-endl; student s3; s1.print(); cout-endl; student:print(); ,注意: (1)靜態(tài)成員函數(shù)可以在類內(nèi)定義,也可以在類外定義,在類外定義時不用也不能加static前綴。 (2)靜態(tài)成員函數(shù)可以在建立任何對象之前處理靜態(tài)數(shù)據(jù)成員,這是普通成員函數(shù)不能實現(xiàn)的。student:init(); (3)以下兩個是不會產(chǎn)生沖突,因為前者是類的靜態(tài)成員函數(shù)(注意前沒有static,1中要求),后者是類外的普通函數(shù)(全局函數(shù))。 void student:init() count=1; static void init() student:count=1; (4)靜態(tài)成員函數(shù)沒有this指針,因為它不與特定的對象聯(lián)系。 (5)一般

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論