C++講義Word版_第1頁
C++講義Word版_第2頁
C++講義Word版_第3頁
C++講義Word版_第4頁
C++講義Word版_第5頁
已閱讀5頁,還剩71頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、目 錄第1章C+對C與類無關(guān)的擴(kuò)展(1)61.1C+的基本知識61.1.1命名空間61.1.2C+輸入輸出簡介61.2C+對C語言與類無關(guān)的性能擴(kuò)充71.2.1新增const常量定義符71.2.2功能71.2.3定義71.2.4C+中為什么要提供const71.2.5正確區(qū)分const在修飾指針時的兩種不同用法71.2.6正確區(qū)分符號名之前有無const修飾時的不同81.2.7正確區(qū)分C語言中的#define與C+中的const的不同:81.3bool類型81.4string 類型91.4.1定義string類型的變量91.4.2轉(zhuǎn)換為C風(fēng)格的字符串91.4.3string 的使用91.5枚舉

2、類型101.5.1枚舉類型的聲明和定義101.5.2匿名枚舉類型101.6變量的塊內(nèi)定義101.6.1正確理解C中變量的定義要求101.6.2C+中的變量定義的規(guī)則101.6.3正確理解C+中的變量的各種作用域。111.7變量的引用操作符 &111.7.1引用111.7.2定義的語法111.7.3引用調(diào)用的優(yōu)點121.7.4正確區(qū)分引用在如下兩種不同的應(yīng)用場合時的差別:131.7.5函數(shù)形參定義為引用參數(shù)時的調(diào)用要求131.7.6函數(shù)形參定義為引用參數(shù)時的的編程效果13第2章C+對C與類無關(guān)的擴(kuò)展(2)152.1函數(shù)152.1.1函數(shù)原型152.2函數(shù)返回一個引用152.2.1引用的返

3、回152.3內(nèi)聯(lián)函數(shù)162.3.1含義162.3.2為什么內(nèi)聯(lián)函數(shù)優(yōu)越于宏替換162.3.3內(nèi)聯(lián)函數(shù)的定義172.3.4不適宜定義為內(nèi)聯(lián)函數(shù)的場合172.4函數(shù)默認(rèn)參數(shù)172.4.1函數(shù)重載172.5函數(shù)模板182.5.1函數(shù)模板182.6定義語法182.6.1應(yīng)用實例182.7new 和 delete 操作符19第3章C+對C語言與類有關(guān)的性能擴(kuò)充203.1基本知識203.2面向?qū)ο螅∣bject Oriented)203.2.1面向?qū)ο螅∣O):203.2.2面向?qū)ο蟪绦蛟O(shè)計方法(OOP):203.2.3應(yīng)用實例213.2.4OOP的優(yōu)點:223.3抽象223.3.1如何實現(xiàn)抽象223.4

4、封裝223.5繼承與派生233.6多態(tài)性233.7類和對象233.7.1C+中的類:233.7.2如何正確定義出類的成員243.7.3類中成員的訪問控制項253.8類中成員之間的訪問方式:25第4章C+類和對象的編程264.1對象的含義264.2對象定義語法264.3客觀對象264.4C+中的對象264.5使用對象264.6類中的各種特殊成員函數(shù)274.6.1內(nèi)聯(lián)成員函數(shù)274.6.2允許帶有缺省形參值的函數(shù)274.6.3類中的函數(shù)重載274.6.4構(gòu)造函數(shù)274.6.5析構(gòu)函數(shù)294.6.6拷貝構(gòu)造函數(shù)304.7異常處理324.7.1異常處理的方法324.7.2異常規(guī)格說明32第5章C+中的

5、對象的各種編程335.1對象賦值335.1.1方法335.1.2應(yīng)用目的335.1.3實現(xiàn)規(guī)則335.2對象數(shù)組335.2.1定義的語法345.2.2訪問方法345.2.3對象數(shù)組的初始化345.2.4對象數(shù)組編程時的構(gòu)造函數(shù)設(shè)計345.2.5對象數(shù)組編程時的析構(gòu)函數(shù)設(shè)計345.3對象指針355.3.1C/C+語言中的指針355.3.2C+中的對象指針355.4對象可以作為函數(shù)的形參和返回值的定義365.5類中包含有對象成員(類的聚集,對象內(nèi)嵌,包容法使用類的資源)375.6類中的靜態(tài)成員375.6.1靜態(tài)成員的編程375.6.2靜態(tài)成員的訪問方法:385.6.3靜態(tài)成員函數(shù)與非靜態(tài)成員函數(shù)之

6、間的訪問:385.7C+中的this指針39第6章友員函數(shù)與運(yùn)算符重載416.1友員函數(shù)416.1.1友員函數(shù)416.1.2為什么需要友員函數(shù):426.1.3友員函數(shù)與成員函數(shù)在編程方面的不同點426.1.4友員函數(shù)與一般函數(shù)(非成員函數(shù))在編程方面的不同點426.2友員類:426.2.1含義426.2.2友員類的定義426.2.3應(yīng)用目的436.3類的引用性前向說明436.4運(yùn)算符重載436.4.1運(yùn)算符重載的實現(xiàn)436.4.2使用類的成員函數(shù)實現(xiàn)重載446.4.3使用友員函數(shù)實現(xiàn)重載466.4.4自動類型轉(zhuǎn)換466.4.5運(yùn)算符重載編程的進(jìn)一步說明47第7章C+類的繼承與派生487.1入門

7、知識487.1.1 繼承487.1.2 派生487.1.3 為什么需要繼承與派生487.1.4 應(yīng)用的目的487.1.5 繼承的可行性487.2如何實現(xiàn)繼承與派生497.2.1基類和派生類497.2.2派生類的定義語法497.2.3如何設(shè)計派生類成員497.3繼承的方式507.3.1三種繼承的方式差別507.3.2public 和 private繼承方式的區(qū)別507.4繼承的多重性527.4.1 含義527.4.2 對象的多重相關(guān)性527.4.3 多重繼承時的派生類的定義語法527.4.4 應(yīng)用場合527.5繼承時的構(gòu)造函數(shù)527.5.1設(shè)計原則527.5.2定義的格式537.6繼承時的析構(gòu)函

8、數(shù)547.6.1設(shè)計原則547.6.2定義格式547.6.3原因547.6.4調(diào)用次序54第8章多重多級繼承及虛基類568.1多重多級繼承時訪問二義性568.1.1訪問時的二義性568.1.2在多重繼承時的二義性568.1.3同名支配(覆蓋)原則578.1.4在多級繼承時的二義性578.2虛基類578.2.1定義語法578.2.2作用588.2.3如何判斷是否為虛基類的問題588.2.4處理的方法588.2.5帶有虛基類的最遠(yuǎn)的派生類的構(gòu)造函數(shù)58第9章多態(tài)性和虛函數(shù)609.1多態(tài)性609.1.1多態(tài)性609.1.2作用609.1.3賦值兼容原則609.1.4指向派生類及基類對象的指針619.

9、2虛函數(shù)619.2.1定義語法619.2.2虛函數(shù)的特點629.2.3為什么需要虛函數(shù)629.2.4靜態(tài)聯(lián)編639.2.5動態(tài)聯(lián)編的應(yīng)用639.2.6如何實現(xiàn)動態(tài)聯(lián)編639.3虛析構(gòu)函數(shù)649.3.1原因649.3.2應(yīng)用場合649.4純虛函數(shù)和抽象基類659.4.1純虛函數(shù)659.4.2定義語法659.4.3抽象基類的編程規(guī)則659.4.4抽象基類的用途65第10章綜合應(yīng)用6810.1類模板6810.1.1模板的聲明6810.1.2模板的使用68第1章 C+對C與類無關(guān)的擴(kuò)展(1)【本章中的知識要點】 正確理解C語言與C+語言的差別 C+對C語言擴(kuò)充體現(xiàn)的幾個方面 【重點難點】 const用

10、法 string用法 引用1.1 C+的基本知識1.1.1 命名空間C+提供名字空間來防止命名的沖突。例如,如果兩個庫都定義了cout,當(dāng)一個應(yīng)用程序使用這兩個庫時,將導(dǎo)致命名沖突。大型應(yīng)用系統(tǒng)由許多人來完成,命名沖突是一種潛在的危險,程序員必須細(xì)心的定義標(biāo)志符以保證名字的唯一性。名字空間std涵蓋了標(biāo)準(zhǔn)C+的定義和聲明,例如:std:cout。q 命名空間的聲明:namespace ttlint x; q 命名空間的使用(兩種方式):1) 先引用再訪問例如:using ttl:x; 或者 using namespace ttl;x=6; x=6;2) 直接訪問如:ttl:x=34;1.1.2

11、 C+輸入輸出簡介C+的基本輸出包括cin和cout。1.2 C+對C語言與類無關(guān)的性能擴(kuò)充1.2.1 新增const常量定義符1.2.2 功能它用來凍結(jié)一個變量的值,使其值在程序中不能被進(jìn)一步改變(置成只讀屬性,即變?yōu)槌A浚?.2.3 定義const 類型定義符 變量名=初值; 如: const int sumValue=10; /常量定義 const int *ptr; /限定指針 void Function(const int & X) /限定函數(shù)的形參 1.2.4 C+中為什么要提供const其目的是替代C語言中的編譯預(yù)處理命令#define(常量定義),但比它更加語義精確因

12、為#define無法準(zhǔn)確地反映常量的數(shù)據(jù)類型。如: #define sumValue 10 /此時的sumValue是char型還是int型?對變量一經(jīng)const 修飾后,必須給它賦初值(但用于函數(shù)的形參時不需賦初值),一經(jīng)const修飾后便不能修改此符號名之值。q const int x=12;x=54; /errorq void Display(const int *ptr, const int n) cout<< ptr0;/=*(ptr+0),顯示數(shù)組中的第一個元素之值ptr0=1; /錯誤,不能修改其值(不能通過指針來改變目標(biāo)單元之值)*ptr=1; /錯誤,不能修改其值

13、(不能通過指針來改變目標(biāo)單元之值)1.2.5 正確區(qū)分const在修飾指針時的兩種不同用法q const int *ptr=&X; 此時不能通過指針來訪問改變目標(biāo)單元之值,即*ptr=1 是錯誤的,但是ptr本身可以被改變 ptr=&Y;此種用法常見于函數(shù)的形參。 void fun(const int * ptr) *ptr=1; /錯誤的 q int * const ptr=&X;此時ptr本身不可以被改變( ptr=&Y是錯誤的);但ptr所指向的目標(biāo)的單元之值是可以被改變的(如 *ptr=2; 即 X=2);此時ptr類似于數(shù)組名(常量指針)。 int p

14、tr10; ptr0=2;1.2.6 正確區(qū)分符號名之前有無const修飾時的不同q int sum=1; /無const修飾時 此時 sum為變量,意味著其值可以被改變(如:sum=2;);同時其內(nèi)存字節(jié)數(shù)為兩個字節(jié)(在PC下為16位)。q const int sum=1; /有const修飾時此時 sum為常量,意味著其值不可以被改變(如:sum=2;);同時不需要占用內(nèi)存空間。另外C+語言視經(jīng)const修飾的符號名為常量特性,因而它可以用于任何可能出現(xiàn)數(shù)字常量的場合(如數(shù)組的大小的說明等)。 const int ArraySize=10; char arrayArraySize;1.2.

15、7 正確區(qū)分C語言中的#define與C+中的const的不同:q 由#define所定義的符號名為全局性常量,因而在整個程序中應(yīng)保持符號名的唯一性;q const可以說明一個局部或全局性同名常量(據(jù)此可以改變const符號名之值)。q 另外在語法方面,#define為編譯預(yù)處理命令,而const為定義符,語句以“;”結(jié)束。#define Min 1const int Max=100;void main(void) #define Min 2 /錯誤,不能再定義同名常量 const int Max=200; /可以再定義同名局部常量要點Fconst也可以限定引用與函數(shù)(見后文介紹)。1.3 b

16、ool類型在C語言中真值用非零表示,假值用零表示。C+新增了數(shù)據(jù)類型bool(增加可讀性),可以取值true或false,用來表示真值或假值。bool依然支持非零和零的形式。例如:int val;cin>>val;if(val)也是合法的。如果val的值非零,條件判斷為真(true);如果val的值為零,條件判斷為假(false)。在默認(rèn)情況下,bool表達(dá)式輸出時,真值為1,假值為0。例如:bool flag;flag=(3<5);cout<<flag<<n;的輸出為:1可以用以下方式使其輸出結(jié)果為true:cout<< boolalph

17、a<<flag<<n;1.4 string 類型C+提供string類型來代替C語言的以null為結(jié)尾的char類型數(shù)組。使用string類型必須包含頭文件string。有了string類型,程序員不用需要關(guān)心存儲的分配,也無需處理繁雜的null結(jié)束字符,這些操作將由系統(tǒng)自動處理。1.4.1 定義string類型的變量方式如下: string s1; string s2="Hello" string s3=s2; string s4("Hello World");1.4.2 轉(zhuǎn)換為C風(fēng)格的字符串我們經(jīng)常會在程序設(shè)計中遇到需要C風(fēng)格

18、字符串的情況(如以null結(jié)尾的char數(shù)組)。例如,當(dāng)我們打開一個文件,而文件又要求必須為一個C風(fēng)格字符串時,則可用函數(shù)c_str如:string filename=”tt.txt”;ifstream if;if.open(filename.c_str();1.4.3 string 的使用【實例練習(xí)】#include <iostream>#include <string>using namespace std;void main()string str="Hello"cout<<"str="<<str&l

19、t;<" str長度為: "<<str.length()<<endl;string s(10,'*'); /s表示含有十個'*'的字符串cout<<s<<endl;string str1;cout<<"請輸入一個字符串: "cin>>str1; /注意:輸入的字符串以空格或回車代表輸入結(jié)束 cout<<"str1="<<str1<<endl; string s1="Hello&qu

20、ot;,s2="File"string s3=s1+s2;cout<<"s3="<<s3<<endl;if(s1=s2)cout<<"s1=s2"<<endl;elsecout<<"s1!=s2"<<endl;1.5 枚舉類型1.5.1 枚舉類型的聲明和定義在C語言中,我們?nèi)缦路绞铰暶饕粋€枚舉類型:enum COLORRED,GREEN,BLUE;然后可以定義一個類型為enum COLOR 枚舉類型變量:enum COLOR CL;

21、而在C+中可以不用關(guān)鍵字enum,如下:COLOR CL;1.5.2 匿名枚舉類型聲明形式:enum MAX=1000,MIN=1;在這里我們可以將MAX和MIN作為常量使用,例如,int arrMAX;實際上enum的主要用途就是定義常量。1.6 變量的塊內(nèi)定義 1.6.1 正確理解C中變量的定義要求一般應(yīng)該集中定義出。例如在C中:void main() int x=1; /正確 for(int i=0; i<10; i+) /錯誤 int y=2; printf(“%d”,y); int c=10; /錯誤 。 1.6.2 C+中的變量定義的規(guī)則可以采用“隨用隨定義”的方式定義出變量

22、,即變量的塊內(nèi)定義-C+中允許變量在使用之前的任一語句塊中定義出來,包括for循環(huán)中。void main(void) void main(void) int x=1; /局部變量 for(int loop=1;loop<10;loop+) int y; /塊內(nèi)變量 int z=1; /塊內(nèi)變量 x=3,y=4; 1.6.3 正確理解C+中的變量的各種作用域。q 文件域-全局變量(其作用域為從定義點到當(dāng)前文件結(jié)束有效)。q 函數(shù)域-局部變量(其作用域為本函數(shù)內(nèi)有效)。q 函數(shù)原型域-函數(shù)的形參,為局部變量,只在該函數(shù)體內(nèi)有效。q 塊內(nèi)域-塊內(nèi)定義的變量(比局部變量的作用域更?。?,塊內(nèi)定義的

23、變量的作用域為從定義點到當(dāng)前塊內(nèi)有效,語句塊執(zhí)行完畢,自動釋放。 【實例練習(xí)】 int X=1; /全局變量void Function(int a) /函數(shù)的形參 int b=a; /局部變量 X=b; /正確 Y=X; /錯誤void main() int Y=2; /局部變量 X=2; /正確 Function(X); for(int i=0;i<10;i+) /塊內(nèi)定義的變量 X=2; /正確 int C=0; /塊內(nèi)定義的變量 X=2,Y=3; /正確 C=X; /錯誤1.7 變量的引用操作符 & 1.7.1 引用C+利用“&”來產(chǎn)生一個變量的引用(該變量的別名,

24、同一內(nèi)存單元二種不同的變量名)。int X=1;int & NewX=X;NewX=3; /注意:改變的其實為變量Xprintf("%d",X); /X的值被改變?yōu)?,因為X與NewX其實為同一個變量。1.7.2 定義的語法 q 類型定義符&變量名原變量名; 如: int sumValue=1; int & sumData=sumValue;即sumData與sumValue為同一個變量,但在不同的應(yīng)用場合下以不同的變量名出現(xiàn)。q 為什么要提供引用操作符:C+中的引用主要是用來解決函數(shù)調(diào)用中形參為指針型的參數(shù)時編程其函數(shù)體時的不安全性(易出錯),操作

25、更加簡單、安全。如:int add(int *X, int * Y) 改進(jìn)為 int add(int &X, int &Y) *X=*X+*Y; X=X+Y; return *X; return X; void main() void main() int a=1, b=2; int a=1, b=2; add(&a, &b); add(a, b); 【藍(lán)夢提示】 在這兩種情況下,調(diào)用時都是采用傳地址方式調(diào)用,但采用引用調(diào)用時編程其函數(shù)體時較簡單、安全。1.7.3 引用調(diào)用的優(yōu)點通過引用調(diào)用可以提高調(diào)用速度,因為只需要傳送地址而不需要直接將大量數(shù)據(jù)拷貝,因而特別

26、適用于形參為大量數(shù)據(jù)的應(yīng)用場合。如:struct Data int a1000; AData; void fun(struct Data X) 這是采用傳值調(diào)用時的函數(shù)定義,但是在調(diào)用時的效率較低,因為需要進(jìn)行實參與形參之間的數(shù)據(jù)拷貝void fun(struct Data &X)這是采用引用調(diào)用時的函數(shù)定義,在調(diào)用時的效率較高,因為形參與實參之間本身是同一個變量。從而在調(diào)用fun(AData) 時,如果使用二種不同函數(shù)定義時,其調(diào)用效果不同。選學(xué)內(nèi)容$有關(guān)函數(shù)調(diào)用的兩種型式-傳值調(diào)用與傳地址調(diào)用q 傳值調(diào)用:當(dāng)函數(shù)的形參是以“值”的形式定義時,系統(tǒng)將以傳值拷貝方式被調(diào)用,在調(diào)用時實參

27、拷貝到形參,但在內(nèi)存中將同時存在實參和形參,調(diào)用時占用兩倍的內(nèi)存空間,同時調(diào)用時的效率較低。void add(int x, int y) return x+y ;void main() int a=1,b=2; add(a,b); /在調(diào)用時刻在內(nèi)存中同時存在 a,b與x,y變量。q 傳地址調(diào)用:當(dāng)函數(shù)的形參是以“地址”的形式定義時,它將以傳地址方式被調(diào)用,在調(diào)用時系統(tǒng)將實參的地址傳送到形參中,但在內(nèi)存中將僅有一份參數(shù)存在(此時實參和形參變?yōu)橥蛔兞浚?,調(diào)用時的效率較高。void add(int *x, int *y) void add(int &x, int &y) /C語言

28、的編程方法 /C+語言的編程方法 return *x+ *y; return x+y; void main() void main() int a=1, b=2; int a=1, b=2; add(&a, &b); add(a, b); 1.7.4 正確區(qū)分引用在如下兩種不同的應(yīng)用場合時的差別:q 對一般的變量進(jìn)行引用:如引用的變量不是用作函數(shù)的形參或返回值,則說明時必需加以初始化以指明它的同地址變量。void main(void) int X=3; int &refX=X; fun(refX); cout << X; /X的值被改變?yōu)? void fun

29、( int & a) a+; /a 為refX的引用q 函數(shù)的形參為引用:如引用的變量用作函數(shù)的形參或返回值,則說明時不必要加以初始化以指明它的同地址變量,此時形參為實參的引用。 int add(int &X, int &Y) /正確 int add(int &X=1, int &Y=2) /錯誤 X=X+Y; X=X+Y; return X; return X; 1.7.5 函數(shù)形參定義為引用參數(shù)時的調(diào)用要求調(diào)用時實參不能為常量而必須為賦已知值的變量。因為編譯器無法為常量(無內(nèi)存地址)建立內(nèi)存地址,從而無法產(chǎn)生引用。同時在函數(shù)調(diào)用時系統(tǒng)將實參地址拷貝到

30、形參,從而使形參即為實參,但在函數(shù)體內(nèi)采用形參名來訪問它。int add(int &a, int & b) void main() int X=1, Y=2; return a+ b; add(X,Y); /調(diào)用正確 add(1,2); /調(diào)用錯誤1.7.6 函數(shù)形參定義為引用參數(shù)時的的編程效果q 其一能在一個函數(shù)體內(nèi)訪問或修改另一個函數(shù)體內(nèi)定義的變量的值 ?!緦嵗毩?xí)】#include <iostream> using namespace std;void IncValue( int &X); /函數(shù)的原型說明或定義(在C+中必須強(qiáng)制說明)void mai

31、n() int A=1; IncValue(A);cout <<"The Value of A Is:"<<A<<endl; /注意C+中的標(biāo)準(zhǔn)輸出與C中的不同void IncValue(int &X) X=X+1; /表面上為改變 X的值,其實是改變了main()內(nèi)的A的值q 其二是能使某一函數(shù)間接實現(xiàn)“多個返回值”(因為在正常情況下,函數(shù)只能實現(xiàn)返回一個值)?!緦嵗毩?xí)】#include <iostream>using namespace std;void CalculateCircle(int R, float

32、&CircleLen, float &CircleArea);void main() int circleR =10; float Length, Area; /定義時未賦值 CalculateCircle (circleR, Length, Area); cout<<”Circle Length=”<<Length; /經(jīng)調(diào)用后它們被賦值 cout<<”Circle Area =”<<Area; void CalculateCircle (int R, float &CircleLen, float &Circl

33、eArea) CircleArea=3.1415*R*R; / CircleArea 引出到Area CircleLen=2*3.1415*R; / CircleLen 引出到Length 【藍(lán)夢提示】 C+語言中的函數(shù)在調(diào)用時不僅可以引入?yún)?shù)(利用形參),而且也能引出參數(shù)(單個參數(shù)時采用return語句,而多個參數(shù)時采用形參為引用定義的方式)?!颈菊驴偨Y(jié)】本章主要講解了C+的基本輸入輸出、命名空間的應(yīng)用以及const、string、bool類型的應(yīng)用引用的基本用法。第2章 C+對C與類無關(guān)的擴(kuò)展(2)【本章中的知識要點】 函數(shù)原型及帶默認(rèn)形參的函數(shù) 返回引用的函數(shù) 內(nèi)聯(lián)函數(shù)、函數(shù)重載、函數(shù)模

34、板 操作符new和delete用法【重點難點】 函數(shù)重載及函數(shù)模板的應(yīng)用2.1 函數(shù)2.1.1 函數(shù)原型在C語言或C+語言中,我們使用術(shù)語“定義“來表示一條變量分配存儲的語句,或表示函數(shù)頭和函數(shù)體。我們使用術(shù)語“聲明”來表示對某個數(shù)據(jù)類型的描述。函數(shù)原型體現(xiàn)了函數(shù)聲明的風(fēng)格,它指的是函數(shù)頭以及函數(shù)頭中包含的參數(shù)列表。例如:int f(int x,int y);便是對函數(shù)f的聲明。在C+中沒有參數(shù)的函數(shù)參數(shù)表可以為空,但在C中要有一個void參數(shù)如:int disp()函數(shù)體; /C+寫法int disp(void )函數(shù)體; /C語言寫法2.2 函數(shù)返回一個引用2.2.1 引用的返回C+中,默

35、認(rèn)情況下,當(dāng)函數(shù)返回一個值時:return expression;expression被求值,并將該值拷貝到臨時存儲空間,以便函數(shù)調(diào)用者訪問。我們將這總返回方式稱為傳值返回。當(dāng)調(diào)用如下函數(shù):int f() return i;時,i的值將拷貝到臨時存儲空間,調(diào)用者是i的一個副本,也就是說如果調(diào)用函數(shù)f: j=f();則i的值就拷貝到臨時存儲空間,然后在拷貝到j(luò),(見圖15) 臨時存儲空間i 拷貝到 拷貝到 j 8 => 8=> 8 圖 15 傳值返回函數(shù)返回值還有另外一種形式,即引用返回。在這種情況下返回值不再拷貝到臨時存儲空間,甚至連return語句所用的那個存儲單元對調(diào)用者都是可

36、訪問的。引用返回語法是在返回類型前加一個&標(biāo)記。int & f( )return i;此時再次調(diào)用f時即j=f( );i的值直接拷貝到j(luò)中(圖16)。i 拷貝到 j 8 => 8圖16注意:如果有這樣的函數(shù)定義:int & f( )int i;return i; /error:是錯誤的,當(dāng)f返回時i已經(jīng)不存在了。2.3 內(nèi)聯(lián)函數(shù)2.3.1 含義內(nèi)聯(lián)函數(shù)類似于宏擴(kuò)展。當(dāng)預(yù)處理器擴(kuò)展一個宏時,它將用宏定義替換每個宏。當(dāng)宏替換或函數(shù)擴(kuò)展完成后,再執(zhí)行程序,這樣避免了函數(shù)調(diào)用的開銷,程序可以更有效的執(zhí)行。使用宏或內(nèi)聯(lián)函數(shù)的缺點是,如果函數(shù)很大或很多地方都調(diào)用了這個函數(shù),程

37、序的可執(zhí)行碼變得很大。2.3.2 為什么內(nèi)聯(lián)函數(shù)優(yōu)越于宏替換與通過預(yù)處理器進(jìn)行宏闊展不一樣,內(nèi)聯(lián)函數(shù)的擴(kuò)展是通過編譯器完成的。當(dāng)預(yù)處理器擴(kuò)展一個宏時,它只是進(jìn)行簡單的文本替換,而不考慮代碼的語義。而編譯器擴(kuò)展內(nèi)聯(lián)函數(shù)時,就不得不考慮語義了,正因為這個原因,內(nèi)聯(lián)函數(shù)通常比宏更受歡迎。2.3.3 內(nèi)聯(lián)函數(shù)的定義【實例練習(xí)】#include <iostream>using namespace std;inline void swap(int &,int &); /函數(shù)聲明int main()int I=7,j=-3;swap(I,j);cout<<”I=”&l

38、t;<I<<endl<<”j=”<<j<<endl;return 0;void swap(int &a,int &b)int t;t=a;a=b;b=t;注意關(guān)鍵字inlilne出現(xiàn)在函數(shù)聲明而不是函數(shù)定義部分。2.3.4 不適宜定義為內(nèi)聯(lián)函數(shù)的場合如果函數(shù)體內(nèi)有循環(huán)語句、條件語句、switch等控制流語句時,不能定義為內(nèi)聯(lián)函數(shù),因為它們有改變程序流程的語句,系統(tǒng)無法正確地進(jìn)行宏替換2.4 函數(shù)默認(rèn)參數(shù)C+允許程序員在函數(shù)聲明中以常數(shù)形式為函數(shù)指定默認(rèn)值。如果在調(diào)用函數(shù)時不提供這個參數(shù),則將使用默認(rèn)值代替。void f(in

39、t x,int y=5,int k=6);/函數(shù)聲明對函數(shù)的有效調(diào)用方式是:f(12,32,123);f(12,32);f(23);這里要特別注意函數(shù)的聲明順序。例如:f(int x,int y=5,int z);/錯誤f(int x,int y=12,int z=34);/okf(int x=23,int y=3,int z);/錯誤函數(shù)參數(shù)初始化的順序是從右向左一次進(jìn)行的。2.4.1 函數(shù)重載C+允許在同一范圍內(nèi)使用相同名字的函數(shù),但要保證函數(shù)參數(shù)個數(shù)或參數(shù)類型不同。如果有多個明為f的函數(shù)被定義,就稱f被重載。編譯器通過實參類型與同名函數(shù)的參數(shù)表進(jìn)行匹配以決定調(diào)用哪個函數(shù)。例如:void

40、f(int x,int y);void f(int x);void f(float x,floaty); f(12,12); /調(diào)用f(int x,int y)f(13); /調(diào)用 f(int x)f(12.12f,12.432f); /調(diào)用 f(float x,float y)2.5 函數(shù)模板2.5.1 函數(shù)模板它是C+中實現(xiàn)靜態(tài)多態(tài)性的一種手段,可以用來創(chuàng)建一個通用功能的函數(shù)以支持多種不同形參,進(jìn)一步簡化重載函數(shù)的函數(shù)體設(shè)計(因為有些重載函數(shù)的函數(shù)體是相同的)。int add(int x, int y) x=x+y;/函數(shù)體是相同的只是不同類型的形參 return x;float add(

41、float x, float y) x=x+y ; /函數(shù)體是相同的只是不同類型的形參,為什么不可以只寫一個呢? return x;2.6 定義語法使用關(guān)鍵字template來定義說明一個函數(shù)模板template <class Type> /或者template <typename Type>Type add(Type X, Type Y) return X+Y; 要點F采用Type來代替某一數(shù)據(jù)類型定義符(占位符號),告訴編譯器此處可以用合適的數(shù)據(jù)類型替代。2.6.1 應(yīng)用實例求各種類型的兩數(shù)之和【實例練習(xí)】#include <iostream>using

42、 namespace std; template <class Type>Type add(Type X, Type Y) /定義兩數(shù)之和函數(shù)模板 return X+Y; template <class Type> /定義三數(shù)之和函數(shù)模板,但第二個數(shù)必須為整數(shù) Type add(Type X, int Y, Type Z) return X+Y+Z;template <class Type> /定義三數(shù)之和的函數(shù)模板,但第二個數(shù)必須為浮點數(shù) float add(Type X, float Y,Type Z) float f=X+Y+Z; return f;

43、void main(void) cout<<add(1,2)<<'n' cout<<add('!','#')<<'n' cout<<add(1.2, 3.4)<<'n' cout<<add(1,2,3)<<'n' cout<<add(1, 2.3f, 4)<<'n'【藍(lán)夢提示】 在函數(shù)模板調(diào)用時必須保證實參與形參相互匹配。2.7 new 和 delete 操作符含義

44、:new 和 delete 用于動態(tài)分配和釋放存儲空間。用法:new 和 delete 必須配套使用,由new 開辟的空間一定要由delete 來釋放。例如:int *p=new int;/new 進(jìn)行動態(tài)分配的時候會返回它所開辟的內(nèi)存的地址delete p; / 當(dāng)不再使用p時,一定要對它進(jìn)行釋放;也可以象這樣來創(chuàng)建:int *p=new int(5); /動態(tài)分配一個整型空間并將其初始化為5也可以用new 動態(tài)分配一個連續(xù)的存儲空間,例如:int *p=new int5;/動態(tài)分配5個整型空間delete p;【本章總結(jié)】熟練掌握函數(shù)重載及函數(shù)模板的應(yīng)用。第3章 C+對C語言與類有關(guān)的性能

45、擴(kuò)充【本章中的知識要點】 面向?qū)ο蟪绦蛟O(shè)計方法及編程思想 OOP的四個基本機(jī)制(抽象、封裝、繼承、多態(tài)) C+的源程序格式?!局攸c難點】 面向?qū)ο蟮奶攸c及如何實現(xiàn)對事務(wù)的抽象。3.1 基本知識1、OOP(Object Oriented Programming)是面向?qū)ο蟪绦蛟O(shè)計方法,是目前程序設(shè)計的主流方法。2、C+是混合編程語言:C+是在C的基礎(chǔ)上產(chǎn)生又保持與C相兼容,因而C+既可以實現(xiàn)面向?qū)ο缶幊逃挚梢詫崿F(xiàn)面向過程編程(兼容C)。3.2 面向?qū)ο螅∣bject Oriented)3.2.1 面向?qū)ο螅∣O):父母我兒女兄妹朋友它是一種解決問題的方法或者觀點,它認(rèn)為自然界是由一組彼此相關(guān)并能

46、相互通信的實體(Object,中文為“對象”)所組成的。如“人類”的相互關(guān)系如下:3.2.2 面向?qū)ο蟪绦蛟O(shè)計方法(OOP):q 含義:它要求程序員使用面向?qū)ο蟮挠^點來分析問題(即將所要解決的問題轉(zhuǎn)化為程序中的對象-任何問題在程序中都被映射為對象),以找出問題的屬性(通過數(shù)據(jù)來描述)與方法(通過函數(shù)來體現(xiàn)),然后用計算機(jī)語言來描述,最后在計算機(jī)中加以處理的一種程序設(shè)計方法。q 編程要求:程序員在描述或處理問題時應(yīng)具有高度的概括、分類并對它加以抽象的能力,才能準(zhǔn)確地描述出某一實體(待解決的問題)。q 應(yīng)用目的:實現(xiàn)軟件設(shè)計的產(chǎn)業(yè)化,變手工作坊式編程為軟件構(gòu)件式工業(yè)化,達(dá)到快速高效編程。實現(xiàn)可重用

47、的軟件組件。q 編程特點:根據(jù)所要解決的問題的各個相關(guān)性轉(zhuǎn)化為程序中的各個類相關(guān)性,然后將每個類具體化產(chǎn)生出對應(yīng)的問題對象,以消息傳遞的機(jī)制來組織對象之間的相互作用。程序組成形式-對象+消息,對象與對象之間通過消息作為連接相互驅(qū)動。對象(問題)之間的關(guān)系是編程關(guān)心的重點,而對象(問題)的功能實現(xiàn)過程則處于次要的地位(只在某一函數(shù)內(nèi)考慮問題的實現(xiàn))。3.2.3 應(yīng)用實例計算兩數(shù)之和Ë 設(shè)計流程:q 定義出一個“加”類-描述出各種類型的數(shù)相加操作;q 將此類(實例化)具體化以定義產(chǎn)生出一個對象(代表本次計算的問題);q 向此對象發(fā)送一條消息-將二數(shù)相加并發(fā)送消息參數(shù);q 再向此對象發(fā)送一

48、條消息-顯示出總和值。 【實例練習(xí)】#include <iostream> using namespace std; class AddClass/定義一個"加"類 public: void Add(int x, int y) sum=x+y; void Add(float x, float y) sumf=x+y; void printSum(int flag) cout<<"Total Sum="<<sum; void printSum(float flag) cout<<"Total Sum

49、="<<sumf; private: int sum; float sumf;void main(void) AddClass addObj; /定義出一個對象(它代表所要解決的問題"1+2 = ?") addObj.Add(1,2);/向此問題的對象發(fā)送一條"累加"的消息同時附帶二個消息參數(shù) addObj.Add(3.4F, 5.6F); addObj.printSum(1); /再向此問題的對象發(fā)送一條"顯示總和"的消息 addObj.printSum(1.0F);3.2.4 OOP的優(yōu)點:q 實現(xiàn)數(shù)據(jù)與方法的封裝,通過方法來操作改變數(shù)據(jù),提高了數(shù)據(jù)訪問的安全性;q 程序更加模塊化,便于代碼重用;q 由于程序是類的集合從而可以根據(jù)問題的相關(guān)性來組裝程序,而面向過程則是函數(shù)的集合,零零散散不便于代碼重用。3.3 抽象 對具體問題(對象)進(jìn)行分類概括,提取出這一類對象的公同性質(zhì)并且加以描述的過程。編程的要求:q 先注意問題的本質(zhì)及描述,其次是實現(xiàn)過程或細(xì)節(jié)。它直接決定程序的優(yōu)劣-類的定義及組成元素;q 所涉及到的主要內(nèi)容:數(shù)據(jù)抽象(屬性)-描述某類對象的屬性或狀態(tài)(對象

溫馨提示

  • 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

提交評論