




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、注明:以下及其后續(xù)內(nèi)容部分摘自Standard C+ Bible,所有程序代碼都在Visual Stdio 6.0中編譯運(yùn)行,操作系統(tǒng)為WinXP。本文不涉及VC6.0開發(fā)工具的使用,只講解C+語法知識(shí)。 C+和C的共同部分就不講解了(如 常量和變量,循環(huán)語句和循環(huán)控制,數(shù)組和指針等,這里面的一些區(qū)別會(huì)在本節(jié)和下節(jié)介紹一下),具體可看精華區(qū)->新手上路->C語言入門,本文著重介紹C+的特點(diǎn),如類、繼承和多重繼承、運(yùn)算符重載、類模板、C+標(biāo)準(zhǔn)庫、模板庫、等等。一、C+概述
2、60; (一) 發(fā)展歷史 1980年,Bjarne Stroustrup博士開始著手創(chuàng)建一種模擬語言,能夠具有面向?qū)ο蟮某绦蛟O(shè)計(jì)特色。在當(dāng)時(shí),面向?qū)ο缶幊踢€是一個(gè)比較新的理念,Stroustrup博士并不是從頭開始設(shè)計(jì)新語言,而是在C語言的基礎(chǔ)上進(jìn)行創(chuàng)建。這就是C+語言。 1985年,C+開始在外面慢慢流行。經(jīng)過多年的發(fā)展,C+已經(jīng)有了多個(gè)版本。為次,ANSI和ISO的聯(lián)合委員會(huì)于1989年著手為C+制定標(biāo)準(zhǔn)。1994年2月,該委員會(huì)出版了第一份非正式草案,19
3、98年正式推出了C+的國(guó)際標(biāo)準(zhǔn)。 (二) C和C+ C+是C的超集,也可以說C是C+的子集,因?yàn)镃先出現(xiàn)。按常理說,C+編譯器能夠編譯任何C程序,但是C和C+還是有一些小差別。 例如C+增加了C不具有的關(guān)鍵字。這些關(guān)鍵字能作為函數(shù)和變量的標(biāo)識(shí)符在C程序中使用,盡管C+包含了所有的C,但顯然沒有任何C+編譯器能編譯這樣的C程序。 C程序員可以省略函數(shù)原型,而C+不可以,一個(gè)不帶參數(shù)的C函數(shù)原型必須把voi
4、d寫出來。而C+可以使用空參數(shù)列表。 C+中new和delete是對(duì)內(nèi)存分配的運(yùn)算符,取代了C中的malloc和free。 標(biāo)準(zhǔn)C+中的字符串類取代了C標(biāo)準(zhǔn)C函數(shù)庫<cstring>頭文件中的字符數(shù)組處理函數(shù)。 C+中用來做控制態(tài)輸入輸出的iostream類庫替代了標(biāo)準(zhǔn)C中的stdio函數(shù)庫。 C+中的try/catch/throw異常處理機(jī)制取代了標(biāo)準(zhǔn)C中的setjmp()和longjmp()函數(shù)。
5、二、關(guān)鍵字和變量 C+相對(duì)與C增加了一些關(guān)鍵字,如下: typename bool dynamic_cast mutable namespace static_cast using
6、160; catch explicit new virtual operator false private t
7、emplate volatile const protected this wchar_t const_cast public
8、0;throw friend true reinterpret_cast try bitor xor_e
9、160; and_eq compl or_eq not_eq bitand 在C+中還增加了bool型變量和wchar_t型變量: 布爾型變量是有
10、兩種邏輯狀態(tài)的變量,它包含兩個(gè)值:真和假。如果在表達(dá)式中使用了布爾型變量,那么將根據(jù)變量值的真假而賦予整型值1或0。要把一個(gè)整型變量轉(zhuǎn)換成布爾型變量,如果整型值為0,則其布爾型值為假;反之如果整型值為非0,則其布爾型值為真。布兒型變量在運(yùn)行時(shí)通常用做標(biāo)志,比如進(jìn)行邏輯測(cè)試以改變程序流程。 #include iostream.h int main()
11、60; bool flag; flag=true; if(flag) cout<<true<<endl; &
12、#160; return 0; C+中還包括wchar_t數(shù)據(jù)類型,wchar_t也是字符類型,但是是那些寬度超過8位的數(shù)據(jù)類型。許多外文字符集所含的數(shù)目超過256個(gè),char字符類型無法完全囊括。wchar_t數(shù)據(jù)類型一般為16位。 標(biāo)準(zhǔn)C+的iostream類庫中包括了可以支持寬字符的類和對(duì)象。用wout替代cout即可。
13、160; #include iostream.h int main() wchar_t wc; &
14、#160; wc='b' wout<<wc; wc='y' wout<<wc;
15、60; wc='e' wout<<wc<<endl; return 0; 說明一下:某些編譯器無法編譯
16、該程序(不支持該數(shù)據(jù)類型)。三、強(qiáng)制類型轉(zhuǎn)換 有時(shí)候,根據(jù)表達(dá)式的需要,某個(gè)數(shù)據(jù)需要被當(dāng)成另外的數(shù)據(jù)類型來處理,這時(shí),就需要強(qiáng)制編譯器把變量或常數(shù)由聲明時(shí)的類型轉(zhuǎn)換成需要的類型。為此,就要使用強(qiáng)制類型轉(zhuǎn)換說明,格式如下: int* iptr=(int*) &table; 表達(dá)式的前綴(int*)就是傳統(tǒng)C風(fēng)格的強(qiáng)制類型轉(zhuǎn)換說明(typecast),又可稱為強(qiáng)制轉(zhuǎn)換說明(cast)。強(qiáng)制轉(zhuǎn)換說明告
17、訴編譯器把表達(dá)式轉(zhuǎn)換成指定的類型。有些情況下強(qiáng)制轉(zhuǎn)換是禁用的,例如不能把一個(gè)結(jié)構(gòu)類型轉(zhuǎn)換成其他任何類型。數(shù)字類型和數(shù)字類型、指針和指針之間可以相互轉(zhuǎn)換。當(dāng)然,數(shù)字類型和指針類型也可以相互轉(zhuǎn)換,但通常認(rèn)為這樣做是不安全而且也是沒必要的。強(qiáng)制類型轉(zhuǎn)換可以避免編譯器的警告。 long int el=123; short i=(int) el;
18、; float m=34.56; int i=(int) m; 上面兩個(gè)都是C風(fēng)格的強(qiáng)制類型轉(zhuǎn)換,C+還增加了一種轉(zhuǎn)換方式,比較一下上面和下面這個(gè)書寫方式的不同: long int el=123; short i=int
19、60;(el); float m=34.56; int i=int (m); 使用強(qiáng)制類型轉(zhuǎn)換的最大好處就是:禁止編譯器對(duì)你故意去做的事發(fā)出警告。但是,利用強(qiáng)制類型轉(zhuǎn)換說明使得編譯器的類型檢查機(jī)制失效,這不是明智的選擇。通常,是不提倡進(jìn)行強(qiáng)制類型轉(zhuǎn)換的。除非不可避免,如要調(diào)用malloc()函數(shù)時(shí)要用的void型指針轉(zhuǎn)換成指定類型指針。四、標(biāo)準(zhǔn)輸
20、入輸出流 在C語言中,輸入輸出是使用語句scanf()和printf()來實(shí)現(xiàn)的,而C+中是使用類來實(shí)現(xiàn)的。 #include iostream.h main() /C+中main()函數(shù)默認(rèn)為int型,而C語言中默認(rèn)為void型。
21、60; int a; cout<<input a number: cin>>a;
22、160; /*輸入一個(gè)數(shù)值*/ cout<<a<<endl; /輸出并回車換行 return 0;
23、0; cin,cout,endl對(duì)象,他們本身并不是C+語言的組成部分。雖然他們已經(jīng)是ANSI標(biāo)準(zhǔn)C+中被定義,但是他們不是語言的內(nèi)在組成部分。在C+中不提供內(nèi)在的輸入輸出運(yùn)算符,這與其他語言是不同的。輸入和輸出是通過C+類來實(shí)現(xiàn)的,cin和cout是這些類的實(shí)例,他們是在C+語言的外部實(shí)現(xiàn)。 在C+語言中,有了一種新的注釋方法,就是/,在該行/后的所有說明都被編譯器認(rèn)為是注釋,這種注釋不能換行。C+中仍然保留了傳統(tǒng)C語言的注釋風(fēng)格/*/。 C+也可采用格式
24、化輸出的方法: #include iostream.h int main() int a;
25、60; cout<<input a number: cin>>a; cout<<dec<<a<<' ' /輸出十進(jìn)制數(shù)
26、 <<oct<<a<<' ' /輸出八進(jìn)制數(shù) <<hex<<a<<endl;
27、/輸出十六進(jìn)制數(shù) return 0; 從上面也可以看出,dec,oct,hex也不可作為變量的標(biāo)識(shí)符在程序中出現(xiàn)。五、函數(shù)參數(shù)問題 (一) 無名的函數(shù)形參 聲明函數(shù)時(shí)可以包含一個(gè)或多個(gè)用不到的形式參數(shù)。這種情況多出現(xiàn)在用一個(gè)通用
28、的函數(shù)指針調(diào)用多個(gè)函數(shù)的場(chǎng)合,其中有些函數(shù)不需要函數(shù)指針聲明中的所有參數(shù)??聪旅娴睦樱?#160; int fun(int x,int y) return x*2; &
29、#160; 盡管這樣的用法是正確的,但大多數(shù)C和C+的編譯器都會(huì)給出一個(gè)警告,說參數(shù)y在程序中沒有被用到。為了避免這樣的警告,C+允許聲明一個(gè)無名形參,以告訴編譯器存在該參數(shù),且調(diào)用者需要為其傳遞一個(gè)實(shí)際參數(shù),但是函數(shù)不會(huì)用到這個(gè)參數(shù)。下面給出使用了無名參數(shù)的C+函數(shù)代碼: int fun(int x,int) /注意不同點(diǎn)
30、0; return x*2; (二) 函數(shù)的默認(rèn)參數(shù) C+函數(shù)的原型中可以聲明一個(gè)或多個(gè)帶有默認(rèn)值的參數(shù)。如果調(diào)用函數(shù)時(shí),省略了相應(yīng)的實(shí)際參數(shù),那么編譯器就會(huì)把默認(rèn)值作為實(shí)際參數(shù)??梢赃@樣來聲明具有默認(rèn)參數(shù)的C+函數(shù)原型:
31、160; #include iostream.h void show(int=1,float=2.3,long=6); int main() sh
32、ow(); show(2); show(4,5.6); show(8,12.34,50L);
33、; return 0; void show(int first,float second,long third) cout<<first=<&
34、lt;first <<second=<<second <<third=<<third<<endl; &
35、#160; 上面例子中,第一次調(diào)用show()函數(shù)時(shí),讓編譯器自動(dòng)提供函數(shù)原型中指定的所有默認(rèn)參數(shù),第二次調(diào)用提供了第一個(gè)參數(shù),而讓編譯器提供剩下的兩個(gè),第三次調(diào)用則提供了前面兩個(gè)參數(shù),編譯器只需提供最后一個(gè),最后一個(gè)調(diào)用則給出了所有三個(gè)參數(shù),沒有用到默認(rèn)參數(shù)六、函數(shù)重載 在C+中,允許有相同的函數(shù)名,不過它們的參數(shù)類型不能完全相同,這樣這些函數(shù)就可以相互區(qū)別開來。而這在C語言中是不允許的。 1.參數(shù)個(gè)數(shù)不同 &
36、#160; #include iostream.h void a(int,int); void a(int); int main()
37、160; a(5); a(6,7); return 0;
38、 void a(int i) cout<<i<<endl; /輸出5 &
39、#160; void a(int i,int j) cout<<i<<j<<endl; /輸出67
40、; 2.參數(shù)格式不同 #include iostream.h void a(int,int); void a(int,float); &
41、#160; int main() a(5,6); a(6,7.0);
42、 return 0; void a(int i,int j) cout&l
43、t;<i<<j<<endl; /輸出56 void a(int i,float j)
44、160; cout<<i<<j<<endl; /輸出67.0 七、變量作用域 C+語言中,允許變量定義語句在程序中的任何地方,只要在是使用它之前就可以;而C語言中,
45、必須要在函數(shù)開頭部分。而且C+允許重復(fù)定義變量,C語言也是做不到這一點(diǎn)的??聪旅娴某绦颍?#160; #include iostream.h int a; int main()
46、160; cin>>a; for(int i=1;i<=10;i+) /C語言中,不允許在這里定義變量
47、0; static int a=0; /C語言中,同一函數(shù)塊,不允許有同名變量 &
48、#160; a+=i; cout<<:a<< <<a<<endl;
49、 return 0; 八、new和delete運(yùn)算符 在C+語言中,仍然支持malloc()和free()來分配和釋放內(nèi)存,同時(shí)增加了new和delete來管理內(nèi)存。 1.為固定大小的數(shù)組分配內(nèi)存
50、60; #include iostream.h int main() int *birthday=new int3;
51、60; birthday0=6; birthday1=24; birthday2=1940; cout<<I was&
52、#160;born on <<birthday0<<'/'<<birthday1<<'/'<<birthday2<<endl; delete &
53、#160;birthday; /注意這兒 return 0; 在刪除數(shù)組時(shí),delete運(yùn)算符后要有一對(duì)方括號(hào)。 2.為動(dòng)態(tài)數(shù)組分配內(nèi)存
54、60; #include iostream.h #include stdlib.h int main()
55、160; int size; cin>>size; int *array=new intsize;
56、; for(int i=0;i<size;i+) arrayi=rand(); for(i=0;i<size;i+)
57、 cout<<'n'<<arrayi; delete array;
58、0;return 0; 九、引用型變量 在C+中,引用是一個(gè)經(jīng)常使用的概念。引用型變量是其他變量的一個(gè)別名,我們可以認(rèn)為他們只是名字不相同,其他都是相同的。 1.引用是一個(gè)別名 C+中的引用是其他變量的別名。聲明一個(gè)引用型變量,需要給他一個(gè)初始化值,在變量的生存周期內(nèi),該值不會(huì)改變。&
59、160;運(yùn)算符定義了一個(gè)引用型變量: int a; int& b=a; 先聲明一個(gè)名為a的變量,它還有一個(gè)別名b。我們可以認(rèn)為是一個(gè)人,有一個(gè)真名,一個(gè)外號(hào),以后不管是喊他a還是b,都是叫他這個(gè)
60、人。同樣,作為變量,以后對(duì)這兩個(gè)標(biāo)識(shí)符操作都會(huì)產(chǎn)生相同的效果。 #include iostream.h int main()
61、160; int a=123; int& b=a;
62、; cout<<a<<','<<b<<endl; /輸出123,123 a+;
63、0; cout<<a<<','<<b<<endl; /輸出124,124 b+;
64、60; cout<<a<<','<<b<<end; /輸出125,125 return 0;
65、0; 2.引用的初始化 和指針不同,引用變量的值不可改變。引用作為真實(shí)對(duì)象的別名,必須進(jìn)行初始化,除非滿足下列條件之一: (1) 引用變量被聲明為外部的,它可以在任何地方初始化 (2) 引用變量作為類的成員,在構(gòu)造函數(shù)里對(duì)它進(jìn)行初始化
66、60; (3) 引用變量作為函數(shù)聲明的形參,在函數(shù)調(diào)用時(shí),用調(diào)用者的實(shí)參來進(jìn)行初始化 3.作為函數(shù)形參的引用 引用常常被用作函數(shù)的形參。以引用代替拷貝作為形參的優(yōu)點(diǎn): 引用避免了傳遞大型數(shù)據(jù)結(jié)構(gòu)帶來的額外開銷
67、60; 引用無須象指針那樣需要使用*和->等運(yùn)算符 #include iostream.h void func1(s p); &
68、#160; void func2(s& p); struct s
69、; int n; char text10; i
70、nt main() static s str=123,China; &
71、#160; func1(str); func2(str); return 0; &
72、#160; void func1(s p) cout<<p.n<<e
73、ndl; cout<<p.text<<endl; void func2(s&
74、60;p) cout<<p.n<<endl; cou
75、t<<p.text<<endl; 從表面上看,這兩個(gè)函數(shù)沒有明顯區(qū)別,不過他們所花的時(shí)間卻有很大差異,func2()函數(shù)所用的時(shí)間開銷會(huì)比func2()函數(shù)少很多。它們還有一個(gè)差別,如果程序遞歸func1(),隨著遞歸的深入,會(huì)因?yàn)闂5暮谋M而崩潰,但func2()沒有這樣的擔(dān)憂。 4.以引用
76、方式調(diào)用 當(dāng)函數(shù)把引用作為參數(shù)傳遞給另一個(gè)函數(shù)時(shí),被調(diào)用函數(shù)將直接對(duì)參數(shù)在調(diào)用者中的拷貝進(jìn)行操作,而不是產(chǎn)生一個(gè)局部的拷貝(傳遞變量本身是這樣的)。這就稱為以引用方式調(diào)用。把參數(shù)的值傳遞到被調(diào)用函數(shù)內(nèi)部的拷貝中則稱為以傳值方式調(diào)用。 #include iostream.h
77、; void display(const Date&,const char*); void swapper(Date&,Date&); struct Date &
78、#160; int month,day,year; &
79、#160; int main() static Date now=2,23,90;
80、 static Date then=9,10,60; display(now,Now: ); display(then,
81、Then: ); swapper(now,then); display(now,Now: );
82、; display(then,Then: ); return 0; &
83、#160; void swapper(Date& dt1,Date& dt2) Date save;
84、160; save=dt1; dt1=dt2; dt2=save;
85、 void display(const Date& dt,const char *s) &
86、#160; cout<<s; cout<<dt.month<<'/'<<dt.day<<'/'<<dt.year<<endl; &
87、#160; 5.以引用作為返回值 #include iostream.h struct Date
88、; int month,day,year; Date birthdays= 12,12,60;
89、 10,25,85; 5,20,73; const Date& getdate(int
90、n) return birthdaysn-1; int main()
91、 int dt=1; while(dt!=0)
92、0; cout<<Enter date # (1-3,0 to quit)<<endl; cin>>dt;
93、160; if(dt>0 && dt<4) const Date&
94、amp; bd=getdate(dt); cout<<bd.month<<'/'<<bd.day<<'/'<<bd.year<<endl; &
95、#160; return 0; 程序都很簡(jiǎn)單,就不講解了。 類是編程
96、人員表達(dá)自定義數(shù)據(jù)類型的C+機(jī)制。它和C語言中的結(jié)構(gòu)類似,C+類支持?jǐn)?shù)據(jù)抽象和面向?qū)ο蟮某绦蛟O(shè)計(jì),從某種意義上說,也就是數(shù)據(jù)類型的設(shè)計(jì)和實(shí)現(xiàn)。一、類的設(shè)計(jì) 1.類的聲明 class 類名 private:
97、0; /私有 . public: /公有
98、160; . 2.類的成員 一般在C+類中,所有定義的變量和函數(shù)都是類的成員。如果是變量,我們就叫它數(shù)據(jù)成員如果是函數(shù),我們就叫它成員函數(shù)。 3.類成員的可見性
99、160; private和public訪問控制符決定了成員的可見性。由一個(gè)訪問控制符設(shè)定的可訪問狀態(tài)將一直持續(xù)到下一個(gè)訪問控制符出現(xiàn),或者類聲明的結(jié)束。私有成員僅能被同一個(gè)類中的成員函數(shù)訪問,公有成員既可以被同一類中的成員函數(shù)訪問,也可以被其他已經(jīng)實(shí)例化的類中函數(shù)訪問。當(dāng)然,這也有例外的情況,這是以后要討論的友元函數(shù)。 類中默認(rèn)的數(shù)據(jù)類型是private,結(jié)構(gòu)中的默認(rèn)類型是public。一般情況下,變量都作為私有成員出現(xiàn),函數(shù)都作為公有成員出現(xiàn)。
100、; 類中還有一種訪問控制符protected,叫保護(hù)成員,以后再說明。 4.初始化 在聲明一個(gè)類的對(duì)象時(shí),可以用圓括號(hào)()包含一個(gè)初始化表。 看下面一個(gè)例子:
101、60; #include iostream.h class Box private:
102、; int height,width,depth; /3個(gè)私有數(shù)據(jù)成員 public:
103、60; Box(int,int,int); Box();
104、0; int volume(); /成員函數(shù)
105、; Box:Box(int ht,int wd,int dp) height=ht;
106、; width=wd; depth=dp;
107、; Box:Box() /nothing
108、 int Box:volume() return height*width*depth;
109、160; int main() Box th
110、isbox(3,4,5); /聲明一個(gè)類對(duì)象并初始化 cout<<thisbox.volume()<<endl;
111、 return 0; 當(dāng)一個(gè)類中沒有private成員和protected成員時(shí),也沒有虛函數(shù),并且不是從其他類中派生出來的,可以用來初始化。(以后再講解) 5.內(nèi)聯(lián)函數(shù)
112、60; 內(nèi)聯(lián)函數(shù)和普通函數(shù)的區(qū)別是:內(nèi)聯(lián)函數(shù)是在編譯過程中展開的。通常內(nèi)聯(lián)函數(shù)必須簡(jiǎn)短。定義類的內(nèi)聯(lián)函數(shù)有兩種方法:一種和C語言一樣,在定義函數(shù)時(shí)使用關(guān)鍵字inline。如: inline int Box:volume() &
113、#160; return height*width*depth; 還有一種方法就是直接在類聲明的內(nèi)部定義函數(shù)體,而不是僅僅給出一個(gè)函數(shù)原型。我們把上面的函數(shù)簡(jiǎn)化一下:
114、0; #include iostream.h class Box
115、160; private: int height,width,depth; public: &
116、#160; Box(int ht,int wd,int dp)
117、60; height=ht; width=wd;
118、160; depth=dp;
119、; Box(); int volume()
120、 return height*width*depth;
121、; int main()
122、160; Box thisbox(3,4,5); /聲明一個(gè)類對(duì)象并初始化 cout<<thisbox.volume()<<endl;
123、60; return 0; 這樣,兩個(gè)函數(shù)都默認(rèn)為內(nèi)聯(lián)函數(shù)了。二、構(gòu)造函數(shù) 什么是構(gòu)造函數(shù)?通俗的講,在類中,函數(shù)名和類名相同的
124、函數(shù)稱為構(gòu)造函數(shù)。上面的Box()函數(shù)就是構(gòu)造函數(shù)。C+允許同名函數(shù),也就允許在一個(gè)類中有多個(gè)構(gòu)造函數(shù)。如果一個(gè)都沒有,編譯器將為該類產(chǎn)生一個(gè)默認(rèn)的構(gòu)造函數(shù),這個(gè)構(gòu)造函數(shù)可能會(huì)完成一些工作,也可能什么都不做。 絕對(duì)不能指定構(gòu)造函數(shù)的類型,即使是void型都不可以。實(shí)際上構(gòu)造函數(shù)默認(rèn)為void型。 當(dāng)一個(gè)類的對(duì)象進(jìn)入作用域時(shí),系統(tǒng)會(huì)為其數(shù)據(jù)成員分配足夠的內(nèi)存,但是系統(tǒng)不一定將其初始化。和內(nèi)部數(shù)據(jù)類型對(duì)象一樣,外部對(duì)象的數(shù)據(jù)成員總是初始化為0。局部對(duì)象不會(huì)被初始化。構(gòu)造函數(shù)就是被用來進(jìn)行初始化工作的。當(dāng)自動(dòng)
125、類型的類對(duì)象離開其作用域時(shí),所站用的內(nèi)存將釋放回系統(tǒng)。 看上面的例子,構(gòu)造函數(shù)Box()函數(shù)接受三個(gè)整型擦黑素,并把他們賦值給立方體對(duì)象的數(shù)據(jù)成員。 如果構(gòu)造函數(shù)沒有參數(shù),那么聲明對(duì)象時(shí)也不需要括號(hào)。 1.使用默認(rèn)參數(shù)的構(gòu)造函數(shù) 當(dāng)在聲明類對(duì)象時(shí),如果沒有指定參數(shù),則使用默認(rèn)參數(shù)來初始化對(duì)象。 &
126、#160; #include iostream.h class Box
127、; private: int height,width,depth; public:
128、0; Box(int ht=2,int wd=3,int dp=4)
129、 height=ht; width=wd;
130、; depth=dp;
131、160; Box(); int volume()
132、60; return height*width*depth;
133、160; int main()
134、; Box thisbox(3,4,5); /初始化 Box defaulbox;
135、 /使用默認(rèn)參數(shù) cout<<thisbox.volume()<<endl; /輸出60 &
136、#160; cout<<defaulbox.volume()<<endl; /輸出24 return 0;
137、; 2.默認(rèn)構(gòu)造函數(shù) 沒有參數(shù)或者參數(shù)都是默認(rèn)值的構(gòu)造函數(shù)稱為默認(rèn)構(gòu)造函數(shù)。如果你不提供構(gòu)造函數(shù),編譯器會(huì)自動(dòng)產(chǎn)生一個(gè)公共的默認(rèn)構(gòu)造函數(shù),這個(gè)構(gòu)造函數(shù)什么都不做。如果至少提供一個(gè)構(gòu)造函數(shù),則編譯器就不會(huì)產(chǎn)生默認(rèn)構(gòu)造函數(shù)。 3.重載構(gòu)造函數(shù) 一個(gè)類中可以有多個(gè)構(gòu)造函數(shù)。這些構(gòu)造函數(shù)必須具有不同的參數(shù)表。在一個(gè)類中需要接受不同初始化值
138、時(shí),就需要編寫多個(gè)構(gòu)造函數(shù),但有時(shí)候只需要一個(gè)不帶初始值的空的Box對(duì)象。 #include iostream.h class Box
139、60; private: int height,width,depth;
140、60; public: Box() /nothing &
141、#160; Box(int ht=2,int wd=3,int dp=4)
142、60; height=ht; width=wd;
143、160; depth=dp; Box();
144、; int volume()
145、 return height*width*depth;
146、; int main() Box thisbox(3,4,5);
147、160; /初始化 Box otherbox; otherbox=t
148、hisbox; cout<<otherbox.volume();<<endl; return 0;
149、160; 這兩個(gè)構(gòu)造函數(shù)一個(gè)沒有初始化值,一個(gè)有。當(dāng)沒有初始化值時(shí),程序使用默認(rèn)值,即2,3,4。 但是這樣的程序是不好的。它允許使用初始化過的和沒有初始化過的Box對(duì)象,但它沒有考慮當(dāng)thisbox給otherbox賦值失敗后,volume()該返回什么。較好的方法是,沒有參數(shù)表的構(gòu)造函數(shù)也把默認(rèn)值賦值給對(duì)象。 &
150、#160; class Box int height,width,depth; &
151、#160; public: Box() &
152、#160; height=0;width=0;depth=0;
153、 Box(int ht,int wd,int dp)
154、160; height=ht;width=wd;depth=dp;
155、0; int volume()
156、; return height*width*depth;
157、0; 這還不是最好的方法,更好的方法是使用默認(rèn)參數(shù),根本不需要不帶參數(shù)的構(gòu)造函數(shù)。 class Box
158、 int height,width,depth; public: &
159、#160; Box(int ht=0,int wd=0,int dp=0)
160、60; height=ht;width=wd;depth=dp;
161、; int volume() return
162、height*width*depth; 三、析構(gòu)函數(shù) 當(dāng)一個(gè)類的對(duì)象離開作用域時(shí),析構(gòu)函數(shù)將被調(diào)用(系統(tǒng)自動(dòng)調(diào)用)。析構(gòu)函數(shù)的名字和類名一樣,不過要在前面加上 &
163、#160;。對(duì)一個(gè)類來說,只能允許一個(gè)析構(gòu)函數(shù),析構(gòu)函數(shù)不能有參數(shù),并且也沒有返回值。析構(gòu)函數(shù)的作用是完成一個(gè)清理工作,如釋放從堆中分配的內(nèi)存。 我們也可以只給出析構(gòu)函數(shù)的形式,而不給出起具體函數(shù)體,其效果是一樣的,如上面的例子。但在有些情況下,析構(gòu)函數(shù)又是必需的。如在類中從堆中分配了內(nèi)存,則必須在析構(gòu)函數(shù)中釋放 C+的內(nèi)部數(shù)據(jù)類型遵循隱式類型轉(zhuǎn)換規(guī)則。假設(shè)某個(gè)表達(dá)市中使用了一個(gè)短整型變量,而編譯器根據(jù)上下文認(rèn)為這兒需要是的長(zhǎng)整型,則編譯器就會(huì)根據(jù)類型轉(zhuǎn)換規(guī)則自動(dòng)把它轉(zhuǎn)換成長(zhǎng)整型,這種隱式轉(zhuǎn)換出現(xiàn)在賦值、參數(shù)傳遞、返回值、初始化和表達(dá)式中。我們也可以為類提供相應(yīng)的轉(zhuǎn)換規(guī)則。 對(duì)一個(gè)類建立隱式轉(zhuǎn)換規(guī)則需要構(gòu)造一個(gè)轉(zhuǎn)換函數(shù),該函數(shù)作為類的成員,可以把該類的對(duì)象和其他數(shù)據(jù)類型的對(duì)象進(jìn)行相互轉(zhuǎn)換。聲明了轉(zhuǎn)換函數(shù),就告訴了編譯器,當(dāng)根據(jù)句法判定需要類型轉(zhuǎn)換時(shí),就調(diào)用函數(shù)。 有兩種轉(zhuǎn)換函數(shù)。一種是轉(zhuǎn)換構(gòu)造函數(shù);另一種是成員轉(zhuǎn)換函數(shù)。需要采用哪種轉(zhuǎn)換函數(shù)取決于轉(zhuǎn)換的方向。一、轉(zhuǎn)換構(gòu)造函數(shù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年 二手房產(chǎn)買賣合同
- 2025年4個(gè)兄弟分家協(xié)議書模板
- 三年級(jí)上冊(cè)數(shù)學(xué)教案-8.1 分?jǐn)?shù)的初步認(rèn)識(shí) ︳西師大版
- 2025年固始縣再就業(yè)小額擔(dān)保貸款協(xié)議
- 2025年廣東理工職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫及答案一套
- 2025年河南機(jī)電職業(yè)學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫必考題
- 2025云南省建筑安全員-C證考試題庫
- 健身中心鏈家居間服務(wù)合同
- 2025年度中小企業(yè)擔(dān)保合同解除協(xié)議書
- 2025年度文化創(chuàng)意產(chǎn)品采購合同甲方責(zé)任與市場(chǎng)推廣
- 質(zhì)量管理小組活動(dòng)準(zhǔn)則TCAQ10201-2020
- 扶梯人行道檢驗(yàn)驗(yàn)收作業(yè)指導(dǎo)書
- GB/T 41855-2022小型游樂設(shè)施轉(zhuǎn)椅
- 2023年蘇州衛(wèi)生職業(yè)技術(shù)學(xué)院高職單招(英語)試題庫含答案解析
- GB/T 20308-2020產(chǎn)品幾何技術(shù)規(guī)范(GPS)矩陣模型
- 男孩女孩動(dòng)起來健康運(yùn)動(dòng)知識(shí)PPT模板
- 鐵路道岔知識(shí)課件
- 自考公共關(guān)系學(xué)課件
- 森林害蟲防治方法課件
- 各種el34名膽電子管評(píng)測(cè)
- 超分子化學(xué)-杯芳烴課件
評(píng)論
0/150
提交評(píng)論