C++ 語言入門參考模板_第1頁
C++ 語言入門參考模板_第2頁
C++ 語言入門參考模板_第3頁
C++ 語言入門參考模板_第4頁
C++ 語言入門參考模板_第5頁
已閱讀5頁,還剩194頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1 / 199注明:以下及其后續(xù)內容部分摘自Standard C+ Bible,所有程序代碼都在Visual Stdio 6.0中編譯運行,操作系統(tǒng)為WinXP。本文不涉及VC6.0開發(fā)工具的使用,只講解C+語法知識。    C+和C的共同部分就不講解了(如 常量和變量,循環(huán)語句和循環(huán)控制,數組和指針等,這里面的一些區(qū)別會在本節(jié)和下節(jié)介紹一下),具體可看精華區(qū)->新手上路->C語言入門,本文著重介紹C+的特點,如類、繼承和多重繼承、運算符重載、類模板、C+標準庫、模板庫、等等。一、C+概述&#

2、160;   (一) 發(fā)展歷史    1980年,Bjarne Stroustrup博士開始著手創(chuàng)建一種模擬語言,能夠具有面向對象的程序設計特色。在當時,面向對象編程還是一個比較新的理念,Stroustrup博士并不是從頭開始設計新語言,而是在C語言的基礎上進行創(chuàng)建。這就是C+語言。    1985年,C+開始在外面慢慢流行。經過多年的發(fā)展,C+已經有了多個版本。為次,ANSI和ISO的聯(lián)合委員會于1989年著手為C+制定標準。1994年2月,該委員會出版了第一份非

3、正式草案,1998年正式推出了C+的國際標準。    (二) C和C+    C+是C的超集,也可以說C是C+的子集,因為C先出現。按常理說,C+編譯器能夠編譯任何C程序,但是C和C+還是有一些小差別。    例如C+增加了C不具有的關鍵字。這些關鍵字能作為函數和變量的標識符在C程序中使用,盡管C+包含了所有的C,但顯然沒有任何C+編譯器能編譯這樣的C程序。    C程序員可以省略函數原型,而C+不可以,一個不帶參數的C函數原

4、型必須把void寫出來。而C+可以使用空參數列表。    C+中new和delete是對內存分配的運算符,取代了C中的malloc和free。    標準C+中的字符串類取代了C標準C函數庫<cstring>頭文件中的字符數組處理函數。    C+中用來做控制態(tài)輸入輸出的iostream類庫替代了標準C中的stdio函數庫。    C+中的try/catch/throw異常處理機制取代了標準C中的setjmp()和longj

5、mp()函數。二、關鍵字和變量    C+相對與C增加了一些關鍵字,如下:       typename     bool     dynamic_cast  mutable    namespace       static_cast  

6、using    catch         explicit   new       virtual      operator false         private   

7、 template       volatile     const    protected     this       wchar_t       const_cast   public 

8、60; throw         friend     true       reinterpret_cast      try       bitor        

9、xor_e    and_eq        compl      or_eq       not_eq       bitand    在C+中還增加了bool型變量和wchar_t型變量:    

10、布爾型變量是有兩種邏輯狀態(tài)的變量,它包含兩個值:真和假。如果在表達式中使用了布爾型變量,那么將根據變量值的真假而賦予整型值1或0。要把一個整型變量轉換成布爾型變量,如果整型值為0,則其布爾型值為假;反之如果整型值為非0,則其布爾型值為真。布兒型變量在運行時通常用做標志,比如進行邏輯測試以改變程序流程。       #include iostream.h       int main()    &#

11、160;             bool flag;           flag=true;           if(flag)  cout<<true<<endl;  

12、         return 0;           C+中還包括wchar_t數據類型,wchar_t也是字符類型,但是是那些寬度超過8位的數據類型。許多外文字符集所含的數目超過256個,char字符類型無法完全囊括。wchar_t數據類型一般為16位。    標準C+的iostream類庫中包括了可以支持寬字符的類和對象。用wout替代co

13、ut即可。       #include iostream.h       int main()                  wchar_t wc;        

14、   wc='b'           wout<<wc;           wc='y'           wout<<wc;    &#

15、160;      wc='e'           wout<<wc<<endl;           return 0;           說明一下:某些

16、編譯器無法編譯該程序(不支持該數據類型)。三、強制類型轉換    有時候,根據表達式的需要,某個數據需要被當成另外的數據類型來處理,這時,就需要強制編譯器把變量或常數由聲明時的類型轉換成需要的類型。為此,就要使用強制類型轉換說明,格式如下:       int* iptr=(int*) &table;    表達式的前綴(int*)就是傳統(tǒng)C風格的強制類型轉換說明(typecast),又可稱為強制轉換說明(cast)。

17、強制轉換說明告訴編譯器把表達式轉換成指定的類型。有些情況下強制轉換是禁用的,例如不能把一個結構類型轉換成其他任何類型。數字類型和數字類型、指針和指針之間可以相互轉換。當然,數字類型和指針類型也可以相互轉換,但通常認為這樣做是不安全而且也是沒必要的。強制類型轉換可以避免編譯器的警告。       long int el=123;       short i=(int) el;   

18、0;   float m=34.56;       int i=(int) m;    上面兩個都是C風格的強制類型轉換,C+還增加了一種轉換方式,比較一下上面和下面這個書寫方式的不同:       long int el=123;       short i

19、=int (el);       float m=34.56;       int i=int (m);     使用強制類型轉換的最大好處就是:禁止編譯器對你故意去做的事發(fā)出警告。但是,利用強制類型轉換說明使得編譯器的類型檢查機制失效,這不是明智的選擇。通常,是不提倡進行強制類型轉換的。除非不可避免,如要調用malloc()函數時要用的void型指針轉換成指定類型指

20、針。四、標準輸入輸出流    在C語言中,輸入輸出是使用語句scanf()和printf()來實現的,而C+中是使用類來實現的。       #include iostream.h       main()    /C+中main()函數默認為int型,而C語言中默認為void型。       &#

21、160;          int a;           cout<<input a number:            cin>>a;      &

22、#160;      /*輸入一個數值*/           cout<<a<<endl;      /輸出并回車換行           return 0;     

23、60;     cin,cout,endl對象,他們本身并不是C+語言的組成部分。雖然他們已經是ANSI標準C+中被定義,但是他們不是語言的內在組成部分。在C+中不提供內在的輸入輸出運算符,這與其他語言是不同的。輸入和輸出是通過C+類來實現的,cin和cout是這些類的實例,他們是在C+語言的外部實現。    在C+語言中,有了一種新的注釋方法,就是/,在該行/后的所有說明都被編譯器認為是注釋,這種注釋不能換行。C+中仍然保留了傳統(tǒng)C語言的注釋風格/*/。    C

24、+也可采用格式化輸出的方法:       #include iostream.h       int main()                  int a;       &#

25、160;   cout<<input a number:            cin>>a;           cout<<dec<<a<<' '     /輸出十進制數 

26、;              <<oct<<a<<' '     /輸出八進制數               <<hex<<a<<endl;  

27、; /輸出十六進制數           return 0;           從上面也可以看出,dec,oct,hex也不可作為變量的標識符在程序中出現。五、函數參數問題    (一) 無名的函數形參    聲明函數時可以包含一個或多個用不到的形式參數。這種情況多出

28、現在用一個通用的函數指針調用多個函數的場合,其中有些函數不需要函數指針聲明中的所有參數??聪旅娴睦樱?#160;      int fun(int x,int y)                  return x*2;        

29、   盡管這樣的用法是正確的,但大多數C和C+的編譯器都會給出一個警告,說參數y在程序中沒有被用到。為了避免這樣的警告,C+允許聲明一個無名形參,以告訴編譯器存在該參數,且調用者需要為其傳遞一個實際參數,但是函數不會用到這個參數。下面給出使用了無名參數的C+函數代碼:       int fun(int x,int)         /注意不同點   

30、60;              return x*2;           (二) 函數的默認參數    C+函數的原型中可以聲明一個或多個帶有默認值的參數。如果調用函數時,省略了相應的實際參數,那么編譯器就會把默認值作為實際參數??梢赃@樣來聲明具有默認參數的C+函數原型: &

31、#160;     #include iostream.h       void show(int=1,float=2.3,long=6);       int main()                 &

32、#160;show();           show(2);           show(4,5.6);           show(8,12.34,50L);        

33、0;  return 0;              void show(int first,float second,long third)                  cout<<firs

34、t=<<first               <<second=<<second               <<third=<<third<<endl;      

35、     上面例子中,第一次調用show()函數時,讓編譯器自動提供函數原型中指定的所有默認參數,第二次調用提供了第一個參數,而讓編譯器提供剩下的兩個,第三次調用則提供了前面兩個參數,編譯器只需提供最后一個,最后一個調用則給出了所有三個參數,沒有用到默認參數六、函數重載    在C+中,允許有相同的函數名,不過它們的參數類型不能完全相同,這樣這些函數就可以相互區(qū)別開來。而這在C語言中是不允許的。    1.參數個數不同    

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;       /輸出

40、67            2.參數格式不同        #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)                    

43、;cout<<i<<j<<endl;          /輸出56                 void a(int i,float j)          &

44、#160;         cout<<i<<j<<endl;          /輸出67.0        七、變量作用域        C+語言中,允許變量定義語句在程序中的任何地方,只要在是使用它之前就可以

45、;而C語言中,必須要在函數開頭部分。而且C+允許重復定義變量,C語言也是做不到這一點的??聪旅娴某绦颍?#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語言中,同一函數塊,不允許有同名變量     

48、           a+=i;                cout<<:a<<   <<a<<endl;            

49、;            return 0;        八、new和delete運算符    在C+語言中,仍然支持malloc()和free()來分配和釋放內存,同時增加了new和delete來管理內存。    1.為固定大小的數組分配內存     &#

50、160;  #include iostream.h        int main()                    int *birthday=new int3;       &#

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

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

53、  birthday;      /注意這兒            return 0;             在刪除數組時,delete運算符后要有一對方括號。     2.為動態(tà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+中,引用是一個經常使用的概念。引用型變量是其他變量的一個別名,我們可以認為他們只是名字不相同,其他都是相同的。    1.引用是一個別名        C+中的引用是其他變量的別名。聲明一個引用型變量,需要給他一個初始化值,在變量的生存周期內,該值不會改變。

59、& 運算符定義了一個引用型變量:            int a;            int& b=a;        先聲明一個名為a的變量,它還有一個別名b。我們可以認為是一個人,有一個真名,一個外號,以后不管是喊他a還是b

60、,都是叫他這個人。同樣,作為變量,以后對這兩個標識符操作都會產生相同的效果。            #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.引用的初始化        和指針不同,引用變量的值不可改變。引用作為真實對象的別名,必須進行初始化,除非滿足下列條件之一:        (1) 引用變量被聲明為外部的,它可以在任何地方初始化        (2) 引用變量作為類的成員,在構造函數里對它進行初始化&#

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

67、160;          引用無須象指針那樣需要使用*和->等運算符            #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&l

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

74、amp; p)                            cout<<p.n<<endl;               &#

75、160;cout<<p.text<<endl;                    從表面上看,這兩個函數沒有明顯區(qū)別,不過他們所花的時間卻有很大差異,func2()函數所用的時間開銷會比func2()函數少很多。它們還有一個差別,如果程序遞歸func1(),隨著遞歸的深入,會因為棧的耗盡而崩潰,但func2()沒有這樣的擔憂。   

76、0;4.以引用方式調用        當函數把引用作為參數傳遞給另一個函數時,被調用函數將直接對參數在調用者中的拷貝進行操作,而不是產生一個局部的拷貝(傳遞變量本身是這樣的)。這就稱為以引用方式調用。把參數的值傳遞到被調用函數內部的拷貝中則稱為以傳值方式調用。            #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: );                displa

81、y(then,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)                 

86、           cout<<s;                cout<<dt.month<<'/'<<dt.day<<'/'<<dt.year<<endl;    

87、            5.以引用作為返回值        #include iostream.h        struct Date             

88、0;      int month,day,year;                Date birthdays=                    12

89、,12,60;            10,25,85;            5,20,73;                const Date& getdate(in

90、t n)                    return birthdaysn-1;                int main()      

91、;              int dt=1;            while(dt!=0)                   

92、60;        cout<<Enter date # (1-3,0 to quit)<<endl;                cin>>dt;          &

93、#160;     if(dt>0 && dt<4)                                    const

94、0;Date& bd=getdate(dt);                    cout<<bd.month<<'/'<<bd.day<<'/'<<bd.year<<endl;        

95、                                return 0;            程序都很簡單,就不講解了。 

96、60;類是編程人員表達自定義數據類型的C+機制。它和C語言中的結構類似,C+類支持數據抽象和面向對象的程序設計,從某種意義上說,也就是數據類型的設計和實現。一、類的設計    1.類的聲明        class 類名                    priva

97、te:       /私有                .            public:        /公有    &

98、#160;           .            2.類的成員        一般在C+類中,所有定義的變量和函數都是類的成員。如果是變量,我們就叫它數據成員如果是函數,我們就叫它成員函數。    3.類成員的可見性  &

99、#160;     private和public訪問控制符決定了成員的可見性。由一個訪問控制符設定的可訪問狀態(tài)將一直持續(xù)到下一個訪問控制符出現,或者類聲明的結束。私有成員僅能被同一個類中的成員函數訪問,公有成員既可以被同一類中的成員函數訪問,也可以被其他已經實例化的類中函數訪問。當然,這也有例外的情況,這是以后要討論的友元函數。        類中默認的數據類型是private,結構中的默認類型是public。一般情況下,變量都作為私有成員出現,函數都作為公有成員出

100、現。        類中還有一種訪問控制符protected,叫保護成員,以后再說明。    4.初始化        在聲明一個類的對象時,可以用圓括號()包含一個初始化表。        看下面一個例子:         &#

101、160;  #include iostream.h            class Box                            privat

102、e:                    int height,width,depth;      /3個私有數據成員                public:&#

103、160;                   Box(int,int,int);                    Box();      

104、60;             int volume();                /成員函數                

105、0;       Box:Box(int ht,int wd,int dp)                            height=ht;     

106、0;          width=wd;                depth=dp;                    

107、0;   Box:Box()                            /nothing                

108、;        int Box:volume()                            return height*width*depth;     &

109、#160;                  int main()                            Box&

110、#160;thisbox(3,4,5);             /聲明一個類對象并初始化                cout<<thisbox.volume()<<endl;         

111、;       return 0;                    當一個類中沒有private成員和protected成員時,也沒有虛函數,并且不是從其他類中派生出來的,可以用來初始化。(以后再講解)    5.內聯(lián)函數    &#

112、160;   內聯(lián)函數和普通函數的區(qū)別是:內聯(lián)函數是在編譯過程中展開的。通常內聯(lián)函數必須簡短。定義類的內聯(lián)函數有兩種方法:一種和C語言一樣,在定義函數時使用關鍵字inline。如:            inline int Box:volume()               

113、             return height*width*depth;                    還有一種方法就是直接在類聲明的內部定義函數體,而不是僅僅給出一個函數原型。我們把上面的函數簡化一下:   

114、60;        #include iostream.h            class Box                       &

115、#160;    private:                    int height,width,depth;                public:  

116、                  Box(int ht,int wd,int dp)                         &#

117、160;                  height=ht;                        width=wd;    &

118、#160;                   depth=dp;                            

119、0;           Box();                    int volume()               

120、;                             return height*width*depth;               

121、0;                            int main()                   &

122、#160;        Box thisbox(3,4,5);             /聲明一個類對象并初始化                cout<<thisbox.volume()<<e

123、ndl;                return 0;                    這樣,兩個函數都默認為內聯(lián)函數了。二、構造函數    什么是構造函數?通俗的講,在類中,函數

124、名和類名相同的函數稱為構造函數。上面的Box()函數就是構造函數。C+允許同名函數,也就允許在一個類中有多個構造函數。如果一個都沒有,編譯器將為該類產生一個默認的構造函數,這個構造函數可能會完成一些工作,也可能什么都不做。    絕對不能指定構造函數的類型,即使是void型都不可以。實際上構造函數默認為void型。    當一個類的對象進入作用域時,系統(tǒng)會為其數據成員分配足夠的內存,但是系統(tǒng)不一定將其初始化。和內部數據類型對象一樣,外部對象的數據成員總是初始化為0。局部對象不會被初始化。構造函數就是被用來進行初始化

125、工作的。當自動類型的類對象離開其作用域時,所站用的內存將釋放回系統(tǒng)。    看上面的例子,構造函數Box()函數接受三個整型擦黑素,并把他們賦值給立方體對象的數據成員。    如果構造函數沒有參數,那么聲明對象時也不需要括號。    1.使用默認參數的構造函數        當在聲明類對象時,如果沒有指定參數,則使用默認參數來初始化對象。     

126、       #include iostream.h            class Box                        

127、0;   private:                    int height,width,depth;                public:   

128、60;                Box(int ht=2,int wd=3,int dp=4)                          

129、;                  height=ht;                        width=wd;    

130、0;                   depth=dp;                             &

131、#160;          Box();                    int volume()               &#

132、160;                            return height*width*depth;                &

133、#160;                           int main()                   

134、0;        Box thisbox(3,4,5);             /初始化                Box defaulbox;     

135、;             /使用默認參數                cout<<thisbox.volume()<<endl;     /輸出60       

136、         cout<<defaulbox.volume()<<endl;   /輸出24                return 0;           

137、0;    2.默認構造函數        沒有參數或者參數都是默認值的構造函數稱為默認構造函數。如果你不提供構造函數,編譯器會自動產生一個公共的默認構造函數,這個構造函數什么都不做。如果至少提供一個構造函數,則編譯器就不會產生默認構造函數。    3.重載構造函數        一個類中可以有多個構造函數。這些構造函數必須具有不同的參數表。在一個類中需要接

138、受不同初始化值時,就需要編寫多個構造函數,但有時候只需要一個不帶初始值的空的Box對象。            #include iostream.h            class Box            &#

139、160;               private:                    int height,width,depth;        &#

140、160;       public:                    Box()  /nothing                 

141、    Box(int ht=2,int wd=3,int dp=4)                                      &#

142、160;     height=ht;                        width=wd;                 &

143、#160;      depth=dp;                                        Box();

144、0;                   int volume()                            

145、;                return height*width*depth;                            

146、0;               int main()                            Box thisbox(3,4,5);&

147、#160;            /初始化                Box otherbox;                 oth

148、erbox=thisbox;                cout<<otherbox.volume();<<endl;                return 0;      &

149、#160;             這兩個構造函數一個沒有初始化值,一個有。當沒有初始化值時,程序使用默認值,即2,3,4。        但是這樣的程序是不好的。它允許使用初始化過的和沒有初始化過的Box對象,但它沒有考慮當thisbox給otherbox賦值失敗后,volume()該返回什么。較好的方法是,沒有參數表的構造函數也把默認值賦值給對象。   

150、         class Box                                int height,width,depth;  

151、              public:                    Box()              

152、                              height=0;width=0;depth=0;                

153、;                        Box(int ht,int wd,int dp)                   &

154、#160;                        height=ht;width=wd;depth=dp;                    

155、60;                   int volume()                           

156、0;                return height*width*depth;                            

157、60;           這還不是最好的方法,更好的方法是使用默認參數,根本不需要不帶參數的構造函數。            class Box                  

158、;              int height,width,depth;                public:              

159、      Box(int ht=0,int wd=0,int dp=0)                                    &#

160、160;       height=ht;width=wd;depth=dp;                                     

161、0;  int volume()                                            retur

162、n height*width*depth;                                三、析構函數    當一個類的對象離開作用域時,析構函數將被調用(系統(tǒng)自動調用)。析構函數的名字和類名一樣,不過要在前面加上

163、  。對一個類來說,只能允許一個析構函數,析構函數不能有參數,并且也沒有返回值。析構函數的作用是完成一個清理工作,如釋放從堆中分配的內存。    我們也可以只給出析構函數的形式,而不給出起具體函數體,其效果是一樣的,如上面的例子。但在有些情況下,析構函數又是必需的。如在類中從堆中分配了內存,則必須在析構函數中釋放   C+的內部數據類型遵循隱式類型轉換規(guī)則。假設某個表達市中使用了一個短整型變量,而編譯器根據上下文認為這兒需要是的長整型,則編譯器就會根據類型轉換規(guī)則自動把它轉換成長整型,這種隱式轉換出現在賦值、參數傳遞、返回值、初始化和表達式中。我們也可以為類提供相應的轉換規(guī)則。    對一個類建立隱式轉換規(guī)則需要構造一個轉換函數,該函數作為類的成員,可以把該類的對象和其他數據類型的對象進行相互轉換。聲明了轉換函數,就告訴了編譯器,當根據句法判定需要類型轉換時,就調用函數。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論