C++和C的區(qū)別_第1頁
C++和C的區(qū)別_第2頁
C++和C的區(qū)別_第3頁
C++和C的區(qū)別_第4頁
C++和C的區(qū)別_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、注明:以下及其后續(xù)內(nèi)容部分摘自Standard C+ Bible,所有程序代碼都在Visual Stdio 6.0中編譯運(yùn)行,操作系統(tǒng)為WinXP。本文不涉及VC6.0開發(fā)工具的使用,只講解C+語法知識。    C+和C的共同部分就不講解了(如 常量和變量,循環(huán)語句和循環(huán)控制,數(shù)組和指針等,這里面的一些區(qū)別會在本節(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)合委員會于1989年著手為C+制定標(biāo)準(zhǔn)。1994年2月,該委員會出版了第一份非正式草案,19

3、98年正式推出了C+的國際標(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)識符在C程序中使用,盡管C+包含了所有的C,但顯然沒有任何C+編譯器能編譯這樣的C程序。    C程序員可以省略函數(shù)原型,而C+不可以,一個(gè)不帶參數(shù)的C函數(shù)原型必須把voi

4、d寫出來。而C+可以使用空參數(shù)列表。    C+中new和delete是對內(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+相對與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)行邏輯測試以改變程序流程。       #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類庫中包括了可以支持寬字符的類和對象。用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)換的最大好處就是:禁止編譯器對你故意去做的事發(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對象,他們本身并不是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)識符在程序中出現(xiàn)。五、函數(shù)參數(shù)問題    (一) 無名的函數(shù)形參    聲明函數(shù)時(shí)可以包含一個(gè)或多個(gè)用不到的形式參數(shù)。這種情況多出現(xiàn)在用一個(gè)通用

28、的函數(shù)指針調(diào)用多個(gè)函數(shù)的場合,其中有些函數(shù)不需要函數(shù)指針聲明中的所有參數(shù)??聪旅娴睦樱?#160;      int fun(int x,int y)                  return x*2;         &

29、#160; 盡管這樣的用法是正確的,但大多數(shù)C和C+的編譯器都會給出一個(gè)警告,說參數(shù)y在程序中沒有被用到。為了避免這樣的警告,C+允許聲明一個(gè)無名形參,以告訴編譯器存在該參數(shù),且調(diào)用者需要為其傳遞一個(gè)實(shí)際參數(shù),但是函數(shù)不會用到這個(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ù),那么編譯器就會把默認(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、   #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、          void a(int i,int j)                    cout<<i<<j<<endl;       /輸出67

40、0;           2.參數(shù)格式不同        #include iostream.h        void a(int,int);        void a(int,float);  

41、      int main()                    a(5,6);            a(6,7.0);       

42、;     return 0;                void a(int i,int j)                    cout&

43、lt;<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、60;                         static int a=0;           /C語言中,同一函數(shù)塊,不允許有同名變量      

48、          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、160; #include iostream.h        int main()                    int *birthday=new int3;        &#

51、160;   birthday0=6;            birthday1=24;            birthday2=1940;            cout<<I was

52、 born on                <<birthday0<<'/'<<birthday1<<'/'<<birthday2<<endl;            delete 

53、 birthday;      /注意這兒            return 0;             在刪除數(shù)組時(shí),delete運(yùn)算符后要有一對方括號。     2.為動(dòng)態(tài)數(shù)組分配內(nèi)存  &#

54、160;      #include iostream.h         #include stdlib.h         int main()               &

55、#160;      int size;             cin>>size;             int *array=new intsize;      

56、0;      for(int i=0;i<size;i+)                 arrayi=rand();             for(i=0;i<size;i+)   

57、;              cout<<'n'<<arrayi;             delete  array;            

58、60;return 0;         九、引用型變量    在C+中,引用是一個(gè)經(jīng)常使用的概念。引用型變量是其他變量的一個(gè)別名,我們可以認(rèn)為他們只是名字不相同,其他都是相同的。    1.引用是一個(gè)別名        C+中的引用是其他變量的別名。聲明一個(gè)引用型變量,需要給他一個(gè)初始化值,在變量的生存周期內(nèi),該值不會改變。&&

59、#160;運(yùn)算符定義了一個(gè)引用型變量:            int a;            int& b=a;        先聲明一個(gè)名為a的變量,它還有一個(gè)別名b。我們可以認(rèn)為是一個(gè)人,有一個(gè)真名,一個(gè)外號,以后不管是喊他a還是b,都是叫他這

60、個(gè)人。同樣,作為變量,以后對這兩個(gè)標(biāo)識符操作都會產(chǎn)生相同的效果。            #include iostream.h            int main()              &

61、#160;             int a=123;                int& b=a;              

62、0; cout<<a<<','<<b<<endl;       /輸出123,123                a+;              

63、60; cout<<a<<','<<b<<endl;       /輸出124,124                b+;              &#

64、160; cout<<a<<','<<b<<end;        /輸出125,125                return 0;           

65、60;    2.引用的初始化        和指針不同,引用變量的值不可改變。引用作為真實(shí)對象的別名,必須進(jìn)行初始化,除非滿足下列條件之一:        (1) 引用變量被聲明為外部的,它可以在任何地方初始化        (2) 引用變量作為類的成員,在構(gòu)造函數(shù)里對它進(jìn)行初始化 &#

66、160;      (3) 引用變量作為函數(shù)聲明的形參,在函數(shù)調(diào)用時(shí),用調(diào)用者的實(shí)參來進(jìn)行初始化    3.作為函數(shù)形參的引用        引用常常被用作函數(shù)的形參。以引用代替拷貝作為形參的優(yōu)點(diǎn):            引用避免了傳遞大型數(shù)據(jù)結(jié)構(gòu)帶來的額外開銷  &#

67、160;         引用無須象指針那樣需要使用*和->等運(yùn)算符            #include iostream.h            void func1(s p);    

68、        void func2(s& p);            struct s                      

69、0;     int n;                char text10;                        

70、int main()                            static s str=123,China;              

71、  func1(str);                func2(str);                return 0;          

72、              void func1(s p)                            cout<<p.n<<

73、endl;                cout<<p.text<<endl;                        void func2(s&&#

74、160;p)                            cout<<p.n<<endl;                co

75、ut<<p.text<<endl;                    從表面上看,這兩個(gè)函數(shù)沒有明顯區(qū)別,不過他們所花的時(shí)間卻有很大差異,func2()函數(shù)所用的時(shí)間開銷會比func2()函數(shù)少很多。它們還有一個(gè)差別,如果程序遞歸func1(),隨著遞歸的深入,會因?yàn)闂5暮谋M而崩潰,但func2()沒有這樣的擔(dān)憂。    4.以引

76、用方式調(diào)用        當(dāng)函數(shù)把引用作為參數(shù)傳遞給另一個(gè)函數(shù)時(shí),被調(diào)用函數(shù)將直接對參數(shù)在調(diào)用者中的拷貝進(jìn)行操作,而不是產(chǎn)生一個(gè)局部的拷貝(傳遞變量本身是這樣的)。這就稱為以引用方式調(diào)用。把參數(shù)的值傳遞到被調(diào)用函數(shù)內(nèi)部的拷貝中則稱為以傳值方式調(diào)用。            #include iostream.h      

77、0;     void display(const Date&,const char*);            void swapper(Date&,Date&);            struct Date  

78、                          int month,day,year;                    

79、    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、0;       display(then,Then: );                return 0;                    

83、    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)                            cout<<s;          

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論