




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、12n1 1 行注釋行注釋n2 2 輸入輸出輸入輸出n3 3 數(shù)據(jù)類型數(shù)據(jù)類型n4 4 變量變量主要內(nèi)容n5 5 函數(shù)函數(shù)n6 6 newnew及及deletedeleten7 7 引用類型引用類型31. 行注釋在c+中,新增了行注釋/sum.cpp/sum.cpp#include #include /編譯預(yù)處理命令編譯預(yù)處理命令using namespace std; using namespace std; /使用命令空間使用命令空間stdstdint main() int main() /主函數(shù)首部主函數(shù)首部 int x,y,sum; int x,y,sum; /定義定義3 3個整型變量
2、個整型變量 coutplease input two integers:n; coutplease input two integers:x; /cinx; /從鍵盤輸入變量從鍵盤輸入變量x x的值的值 ciny; /ciny; /從鍵盤輸入變量從鍵盤輸入變量y y的值的值 sum=x+y; sum=x+y; /將將x+yx+y的值賦給整型變量的值賦給整型變量sumsum coutx+y=sumendl; coutx+y=sumendl; /輸出兩個整數(shù)的和輸出兩個整數(shù)的和sumsum return 0; return 0; /如程序正常結(jié)束如程序正常結(jié)束, , /向操作系統(tǒng)返回一個數(shù)值向操作
3、系統(tǒng)返回一個數(shù)值0 0 4c c語言中我們用庫函數(shù)語言中我們用庫函數(shù)printfprintf和和scanfscanf對基本變量進(jìn)行輸入輸對基本變量進(jìn)行輸入輸出。如下程序:出。如下程序:2. 數(shù)據(jù)的輸入和輸出數(shù)據(jù)的輸入和輸出#include void main()int a;scanf(%d,&a);printf(a=%dn,a);c+c+擴(kuò)展了擴(kuò)展了c c的輸入輸出,不但可用的輸入輸出,不但可用printfprintf、scanfscanf函數(shù),還函數(shù),還可以用輸入輸出流??梢杂幂斎胼敵隽鳌?c+c+輸入輸出標(biāo)準(zhǔn)流輸入輸出標(biāo)準(zhǔn)流流名流名含義含義默認(rèn)設(shè)備默認(rèn)設(shè)備流名流名含義含義默認(rèn)設(shè)備默
4、認(rèn)設(shè)備cincin標(biāo)準(zhǔn)輸入標(biāo)準(zhǔn)輸入鍵盤鍵盤coutcout輸出輸出屏幕屏幕以上標(biāo)準(zhǔn)流為利用以上標(biāo)準(zhǔn)流為利用面向?qū)ο蠓椒ㄔO(shè)計的輸入輸出流類面向?qū)ο蠓椒ㄔO(shè)計的輸入輸出流類的對象的對象. .使用使用cincin的格式的格式:cincin變量名變量名11變量名變量名22變量名變量名nn 使用使用coutcout的格式:的格式:coutcout表達(dá)表達(dá)11表達(dá)式表達(dá)式22n 6#include int main() for(int i=1;i=3;i+) coutcount=iafc;couta=af=fc=cendl;return 0;例如:注:使用cin與cout必須在程序開頭包含iostream頭
5、文件!7c+c+輸入輸出流的優(yōu)點(diǎn)輸入輸出流的優(yōu)點(diǎn)簡單易用,根據(jù)操作對象自適應(yīng),無需指定簡單易用,根據(jù)操作對象自適應(yīng),無需指定變量的類型;變量的類型;可對自定義的類型進(jìn)行輸入輸出;可對自定義的類型進(jìn)行輸入輸出;提高了安全性和可擴(kuò)展性。提高了安全性和可擴(kuò)展性。,=等運(yùn)算符對字等運(yùn)算符對字符串進(jìn)行操作。符串進(jìn)行操作。114. 變量n正確理解正確理解c中的變量的定義要求:中的變量的定義要求:一般應(yīng)該集中定義出,不能在語句塊中定義。一般應(yīng)該集中定義出,不能在語句塊中定義。n程序例:程序例:void main()1. int x=1; /正確正確2. for(int i=0; i10; i+) /錯誤錯誤
6、3. 4. int y=2; 5. 6. 12(1)c+變量定義規(guī)則u可以采用可以采用“隨用隨定義隨用隨定義”的方式定義出變量,即變量的塊內(nèi)的方式定義出變量,即變量的塊內(nèi)定義定義uc+中允許中允許變量在使用之前的任一語句塊中定義變量在使用之前的任一語句塊中定義出來,包括出來,包括 for循環(huán)中循環(huán)中何為塊?塊:c+語言把括起來的一塊區(qū)域稱為塊。 塊變量:塊變量:定義在某個塊中的變量。塊作用域:塊作用域:變量定義的由花括號括起來的范圍,塊變量在其作用域可見,而在作用域外不可見。 13例如:1.#include2.void main(void) 3. 4.int x=1;/局部變量 5. 6.in
7、t y; /塊內(nèi)變量 7.8.x=3;y=4; 9. 10.couty=yendl;11. void main(void) for(int i=1;i10;i+) int z=1; /塊內(nèi)變量 coutz=z; 14正確理解正確理解c+中的變量的各種作用域中的變量的各種作用域 n文件域文件域全局變量全局變量(其作用域為從定義點(diǎn)到當(dāng)前文件結(jié)(其作用域為從定義點(diǎn)到當(dāng)前文件結(jié)束有效)。束有效)。n函數(shù)域函數(shù)域局部變量局部變量(其作用域為本函數(shù)內(nèi)有效)。(其作用域為本函數(shù)內(nèi)有效)。n函數(shù)原型域函數(shù)原型域函數(shù)的形參,為局部變量,只在該函數(shù)體函數(shù)的形參,為局部變量,只在該函數(shù)體內(nèi)有效。內(nèi)有效。n塊內(nèi)域塊內(nèi)
8、域塊內(nèi)定義的變量塊內(nèi)定義的變量(比局部變量的作用域更?。?,(比局部變量的作用域更?。瑝K內(nèi)定義的變量的作用域為從定義點(diǎn)到當(dāng)前塊內(nèi)有效,塊內(nèi)定義的變量的作用域為從定義點(diǎn)到當(dāng)前塊內(nèi)有效,語句塊執(zhí)行完畢,自動釋放。語句塊執(zhí)行完畢,自動釋放。 15例如:1.int x=1; 2.void function(int a) 3. int b=a; 4. x=b; 5. y=x;6.7.void main()8. int y=2; 9. x=2; 10. function(x);11. for(int i=0;i10;i+) 12. x=2; 13. int c=0; 14.15. x=2,y=3; 16.
9、 c=x; a=3; b=4;17./錯誤錯誤/正確正確/正確正確/正確正確/正確正確/錯誤錯誤 /全局變量全局變量 /函數(shù)的形參函數(shù)的形參 /局部變量局部變量/局部變量局部變量 /塊定義的變量塊定義的變量 /塊定義的變量塊定義的變量16語句塊內(nèi)變量的應(yīng)用目的語句塊內(nèi)變量的應(yīng)用目的 通過縮小變量的作用域來縮短變量的生存期,充分利通過縮小變量的作用域來縮短變量的生存期,充分利用內(nèi)存空間,優(yōu)化內(nèi)存的使用用內(nèi)存空間,優(yōu)化內(nèi)存的使用void main() int x; /局部變量 for(x=1; x10; x+) /在此時x才被釋放void main() for(int x=1; x10; x+)
10、/塊內(nèi)變量 /在此時x就被釋放17(2) 作用域運(yùn)算符與命名空間作用域運(yùn)算符與命名空間c c語言中變量命名的要求:語言中變量命名的要求:在同一個程序中應(yīng)該盡可能保持變量名的唯一性,最好不要同名。在同一個程序中應(yīng)該盡可能保持變量名的唯一性,最好不要同名。 #include iostream.h#include iostream.hint x=1;int x=1;void main()void main() int x=2; int x=2; cout x; cout x; 相同嗎?此時輸出的此時輸出的x x值值是 為是 為 “ 1 1 ” 還 是還 是“2 2”系統(tǒng)系統(tǒng)采用同名覆蓋原則采用同名覆
11、蓋原則決定,輸出為決定,輸出為2 2如果要輸出全局變量如果要輸出全局變量x x的值,怎么辦的值,怎么辦?18c+中的全局作用域限定符 n作用:作用:它能使程序員它能使程序員訪訪問在某外部塊中所定義問在某外部塊中所定義的全局變量的全局變量,以免被同,以免被同名的局部變量所覆蓋。名的局部變量所覆蓋。n訪問規(guī)則:訪問規(guī)則:有有:限定的限定的同名符號是全局變量,同名符號是全局變量,無無:限定的同名符號是限定的同名符號是局部變量。局部變量。#include #include int x=1;int x=1;void main()void main() int x=2; int x=2; cout cou
12、t local x=local x= xendl; xendl; / /未限定時的符號名為局部未限定時的符號名為局部 /符號名符號名 cout global x= :x; cout global x= :x; / /采用采用“:”限定時的符號名為全限定時的符號名為全/局符號名局符號名 19全局作用域限定符的編程規(guī)則(全局作用域限定符的編程規(guī)則(1 1) 只能將只能將“:”放在具有全局符號名說明的變量名之前,不能放在無全局放在具有全局符號名說明的變量名之前,不能放在無全局符號名說明的局部變量名之前。符號名說明的局部變量名之前。int x=1;int x=1; void main(void)voi
13、d main(void) int x=2; int x=2; int y=3; int y=3; :x=10; :x=10;/正確,因為有同名的全局符號名說明正確,因為有同名的全局符號名說明 :y=4;:y=4;/錯誤,因為無同名的全局符號名說明錯誤,因為無同名的全局符號名說明 全局作用域限定符全局作用域限定符“:”不僅可以限定變量,也可以用來限定函數(shù)不僅可以限定變量,也可以用來限定函數(shù)20名字空間n-解決解決不同模塊相同名字沖突問題不同模塊相同名字沖突問題。一個名字空間可以看作一個比程序模塊更大的包一個名字空間可以看作一個比程序模塊更大的包。格式:格式:namespace modulenam
14、enamespace modulename 注:注:一個給定名字空間的所有代碼可以位于同一個文件中,一個給定名字空間的所有代碼可以位于同一個文件中,也可以分布在多個文件中,但是在每一個文件中代碼都要按照也可以分布在多個文件中,但是在每一個文件中代碼都要按照上述語句格式進(jìn)行封裝。上述語句格式進(jìn)行封裝。其作用域有兩方面的含義:其作用域有兩方面的含義:(1 1)同一個名字空間作用域內(nèi)不允許存在同名標(biāo)識符;)同一個名字空間作用域內(nèi)不允許存在同名標(biāo)識符;(2 2)不同名字空間作用域內(nèi)的標(biāo)識符不能直接調(diào)用,)不同名字空間作用域內(nèi)的標(biāo)識符不能直接調(diào)用,需要需要添加名字空間的作用域限定運(yùn)算符添加名字空間的作用
15、域限定運(yùn)算符。21例如:/a.h#includenamespace a 函數(shù)f1 函數(shù)f2變量s;若要在若要在a a名字空間外,調(diào)用名字空間外,調(diào)用f1f1、f2f2函數(shù)和函數(shù)和變量變量s s,如何表達(dá)?如何表達(dá)? 方法方法1 1:a:f1();a:f1();方法方法2 2:#include “a.h”#include “a.h”void main()void main() using namespace a; using namespace a; f1();/ f1();/名字空間名字空間a a中的函數(shù)中的函數(shù) 22(3 3)用)用constconst關(guān)鍵字定義常變量關(guān)鍵字定義常變量在在c語
16、言中我們用語言中我們用#define宏命令來定義常量,宏命令來定義常量,define只是在編譯時進(jìn)行字符串替換,只是在編譯時進(jìn)行字符串替換,運(yùn)行時系統(tǒng)不為其分配運(yùn)行時系統(tǒng)不為其分配內(nèi)存空間內(nèi)存空間。用它有時會出現(xiàn)意想不到的錯誤。如下所示:。用它有時會出現(xiàn)意想不到的錯誤。如下所示:#include #define pi 3#define r a+bint main() int a=2; int b=3; coutpi*r*r; return 1;程序輸出程序輸出15而不是想要的而不是想要的75的結(jié)構(gòu)。的結(jié)構(gòu)。因為因為pi*r*r被展開為了被展開為了3*a+b*a+b=15。因此因此c+提供了提供
17、了const關(guān)鍵字來定義常關(guān)鍵字來定義常變量,用變量,用const定義的常變量具有變定義的常變量具有變量量的一些屬性。(有數(shù)據(jù)類型、占量量的一些屬性。(有數(shù)據(jù)類型、占用內(nèi)存空間、具有地址、可以用指針用內(nèi)存空間、具有地址、可以用指針來指向它等),唯一和變量不同的是來指向它等),唯一和變量不同的是它的值它的值只能在定義時指定只能在定義時指定。以后就不。以后就不能通過任何形式改變。能通過任何形式改變。23#include #define pi 3 /沒有類型,不占用存儲單元沒有類型,不占用存儲單元const int r=2+3;/有類型,有存儲單元有類型,有存儲單元int main() int a=
18、2; int b=3; coutpi*r*rendl; return 1;改進(jìn):改進(jìn):24#include const float pi=3.1415926f;int main()float r;cout請輸入圓的半徑值:請輸入圓的半徑值:(負(fù)值退出負(fù)值退出)r;while(r=0)cout半徑為半徑為r的圓的面積為:的圓的面積為:pi*r*r,周長為:周長為:2*pi*rendl;cout請輸入圓的半徑值:請輸入圓的半徑值:(負(fù)值退出負(fù)值退出)r;return 1;例:例:分析如下程序的功能分析如下程序的功能25const定義常量constconst 類型類型 常量名常量名= =表達(dá)式表達(dá)式
19、; ; 或或 類型類型 const const 常量名常量名= =表達(dá)式表達(dá)式; ; 例如:例如:constconst double pi=3.14; double pi=3.14; 和和 double double constconst pi=3.14; pi=3.14;兩者兩者等價等價! !constconst定義數(shù)組常量定義數(shù)組常量:const int a5=1,2,3,4,5;const int a5=1,2,3,4,5; 注:注:const定義常量必須初始化。定義常量必須初始化。26常量與指針一起使用 (1 1)指向常量的指針)指向常量的指針 const char * name=ch
20、en; name2=i;?name=stu;? (2 2)常指針)常指針char* const name=chen例如:name=stu; name1=2;27常量與指針一起使用(3)指向常量的常指針注:注:const定義一個整型常量,關(guān)鍵字定義一個整型常量,關(guān)鍵字int可以省略??梢允÷?。const char *const name=”chen”; name2=i;?name=”stu”;? 28區(qū)分c語言中的#define與c+中的const的不同 1.由由#define所定義的符號名為所定義的符號名為全局性常量全局性常量,因而在整個程序中,因而在整個程序中應(yīng)保持符號名的唯一性;應(yīng)保持符號
21、名的唯一性;2.const可以說明可以說明一個局部或全局性同名常量一個局部或全局性同名常量(據(jù)此可以改變(據(jù)此可以改變const符號名之值)。符號名之值)。3.另外在語法方面另外在語法方面,#define為編譯預(yù)處理命令為編譯預(yù)處理命令,而,而const為為定義定義符符,語句以,語句以“;”結(jié)束。結(jié)束。#define min 1const int max=100;void main(void) #define min 2 /錯誤,不能再定義同名常量錯誤,不能再定義同名常量 const int max=200; /可以再定義同名局部常量可以再定義同名局部常量 29(4)函數(shù)形式上的轉(zhuǎn)換任何系統(tǒng)定
22、義的基本數(shù)據(jù)類型或用戶自定義的任何系統(tǒng)定義的基本數(shù)據(jù)類型或用戶自定義的數(shù)據(jù)類型數(shù)據(jù)類型的名字,的名字,都可作為都可作為函數(shù)函數(shù)使用,從而把變量(常量)從一種數(shù)據(jù)類型轉(zhuǎn)換使用,從而把變量(常量)從一種數(shù)據(jù)類型轉(zhuǎn)換到另一種數(shù)據(jù)類型。到另一種數(shù)據(jù)類型。例如:例如:int i=20; float x; x=int(i);int i=20; float x; x=int(i);(在(在c語言中則錯誤)語言中則錯誤)30 c c語言要求如果函數(shù)調(diào)用在函數(shù)定義之前,則應(yīng)在函數(shù)語言要求如果函數(shù)調(diào)用在函數(shù)定義之前,則應(yīng)在函數(shù)調(diào)用之前對所調(diào)用的函數(shù)進(jìn)行函數(shù)聲明,但如果函數(shù)的返回值調(diào)用之前對所調(diào)用的函數(shù)進(jìn)行函數(shù)聲明
23、,但如果函數(shù)的返回值為整型,也可以不進(jìn)行聲明。如下例所示:為整型,也可以不進(jìn)行聲明。如下例所示:#include int max(int a,int b); /函數(shù)聲明函數(shù)聲明void main()int a=max(2,3);printf(%d,a);int max(int a,int b)if(a=b)return a;else return b;int max(int a,int b);就是對后面就是對后面max函函數(shù)的聲明。由于數(shù)的聲明。由于max函數(shù)的返回值為整型,函數(shù)的返回值為整型,所以這里的聲明也可以不要。但如果所以這里的聲明也可以不要。但如果max的返回值不是整型,這必須對其進(jìn)
24、行聲明。的返回值不是整型,這必須對其進(jìn)行聲明。聲明可以采用以下幾種形式:聲明可以采用以下幾種形式:int max(int a , int b); /原型聲明原型聲明int max(); / 無參聲明無參聲明max(); /無參無返回值聲明無參無返回值聲明5.函數(shù)31(1)c+中的函數(shù)聲明中的函數(shù)聲明在在c+如果函數(shù)調(diào)用在函數(shù)定義之前。則必須在如果函數(shù)調(diào)用在函數(shù)定義之前。則必須在調(diào)用之前調(diào)用之前對其進(jìn)行的函數(shù)聲明對其進(jìn)行的函數(shù)聲明(返回值為返回值為int的函數(shù)也必須聲明的函數(shù)也必須聲明)。而且必。而且必須采用函數(shù)原型聲明的形式。須采用函數(shù)原型聲明的形式。#include int max(int
25、a,int b);int main()int a=max(2,3);couta=b)return a;elsereturn b;c+c+中函數(shù)聲明必須采用函數(shù)中函數(shù)聲明必須采用函數(shù)原型的形式:原型的形式:返回值返回值 函數(shù)名函數(shù)名(形參表形參表); ;但在但在c+c+中函數(shù)的聲明可以只中函數(shù)的聲明可以只有形參類型,而沒有形參。如左有形參類型,而沒有形參。如左邊的例子中也可將函數(shù)申明寫為:邊的例子中也可將函數(shù)申明寫為:int max(int int);int max(int int);要區(qū)分函數(shù)的要區(qū)分函數(shù)的定義定義、聲明聲明和和調(diào)調(diào)用用以及它們的作用。以及它們的作用。32(2) c+中函數(shù)的重
26、載中函數(shù)的重載函數(shù)重載:函數(shù)重載:c+c+中允許在同一作用域中用中允許在同一作用域中用同一函數(shù)名定義多個函數(shù)同一函數(shù)名定義多個函數(shù)(c c語語言中不可以)言中不可以) 。這些函數(shù)的。這些函數(shù)的參數(shù)個數(shù)和參數(shù)類型不同參數(shù)個數(shù)和參數(shù)類型不同。例例1 1:跟據(jù)參數(shù)類型的不同進(jìn)行重載:跟據(jù)參數(shù)類型的不同進(jìn)行重載#include int max(int a,int b) if(a=b) return a; else return b;float max(float a,float b) if(a=b) return a; else return b;int main() int ia,ib; float
27、 fa,fb; ciniaib; coutmax(ia,ib)fafb; coutmax(fa,fb)endl;33例例2:跟據(jù)參數(shù)個數(shù)的不同進(jìn)行重載:跟據(jù)參數(shù)個數(shù)的不同進(jìn)行重載#include using namespace std;int max(int a,int b) if(a=b) return a; else return b;int max(int a,int b,int c) if(ba) a=b; if(ca) a=c; return a;int main() int ia,ib,ic; ciniaibic; coutmax(ia,ib)endl; coutmax(ia,ib
28、,ic)endl;由以上兩個例子的分析可以得出:由以上兩個例子的分析可以得出:對重載的函數(shù)進(jìn)行調(diào)用時,主對重載的函數(shù)進(jìn)行調(diào)用時,主要根據(jù)函數(shù)參數(shù)類型和個數(shù)的不同來確定具體應(yīng)該調(diào)用那一個函數(shù)要根據(jù)函數(shù)參數(shù)類型和個數(shù)的不同來確定具體應(yīng)該調(diào)用那一個函數(shù)。重載的函數(shù)能否僅僅只有返回值不同而形參完全相同?重載的函數(shù)能否僅僅只有返回值不同而形參完全相同?調(diào)用重載函數(shù)時,函數(shù)返回值類型不在參數(shù)匹配檢查之列調(diào)用重載函數(shù)時,函數(shù)返回值類型不在參數(shù)匹配檢查之列 34(3)默認(rèn)參數(shù)的函數(shù))默認(rèn)參數(shù)的函數(shù)c c語言,函數(shù)調(diào)用時傳給函數(shù)的語言,函數(shù)調(diào)用時傳給函數(shù)的實參個數(shù)必須與形參的個數(shù)相實參個數(shù)必須與形參的個數(shù)相同同
29、,但,但c+c+可以讓形參帶有默認(rèn)的值可以讓形參帶有默認(rèn)的值, ,從而可以讓傳遞給函數(shù)的形從而可以讓傳遞給函數(shù)的形參個數(shù)少于實參的個數(shù)。稱為參個數(shù)少于實參的個數(shù)。稱為默認(rèn)參數(shù)默認(rèn)參數(shù)。這種機(jī)制有時候給我們。這種機(jī)制有時候給我們帶來很大的方便。尤其是在面向?qū)ο缶幊虝r類的構(gòu)造函數(shù)。帶來很大的方便。尤其是在面向?qū)ο缶幊虝r類的構(gòu)造函數(shù)。#include void getdate(int day ,int month=3,int year=2011) coutyear/month/dayendl;int main( )getdate(20);getdate(20,5);getdate(20,5,2012
30、);return 1;程序輸出:程序輸出:2011/3/202011/5/202012/5/2035實參與形參的結(jié)合是以實參與形參的結(jié)合是以從左到右從左到右的順序進(jìn)行的,第一個實參的順序進(jìn)行的,第一個實參的值必須傳遞給第一個形參,第二個實參必然與第二個形參相的值必須傳遞給第一個形參,第二個實參必然與第二個形參相結(jié)合。所以帶函數(shù)的默認(rèn)參數(shù)必須按從結(jié)合。所以帶函數(shù)的默認(rèn)參數(shù)必須按從右到左右到左的順序進(jìn)行默認(rèn)。的順序進(jìn)行默認(rèn)。例如如下的函數(shù)默認(rèn)參數(shù)是錯誤的。例如如下的函數(shù)默認(rèn)參數(shù)是錯誤的。fun(int a, int b=2,int c,int d=3); fun(int a, int b=2,in
31、t c,int d=3); /錯誤錯誤默認(rèn)參數(shù)的次序默認(rèn)參數(shù)的次序由以上的討論我們可以發(fā)現(xiàn),由以上的討論我們可以發(fā)現(xiàn),在有默認(rèn)參數(shù)的函數(shù)中,實參在有默認(rèn)參數(shù)的函數(shù)中,實參的個數(shù)可以少于形參的個數(shù),但實參的個數(shù)不能少于形參中沒的個數(shù)可以少于形參的個數(shù),但實參的個數(shù)不能少于形參中沒有默認(rèn)的參數(shù)的個數(shù)。有默認(rèn)的參數(shù)的個數(shù)。帶默認(rèn)值的函數(shù)的功能可以由函數(shù)的重載來實現(xiàn)!帶默認(rèn)值的函數(shù)的功能可以由函數(shù)的重載來實現(xiàn)!36使用帶默認(rèn)參數(shù)的函數(shù)時應(yīng)注意的問題使用帶默認(rèn)參數(shù)的函數(shù)時應(yīng)注意的問題(1 1)如果函數(shù)的定義在函數(shù)的調(diào)用之前,則應(yīng)在)如果函數(shù)的定義在函數(shù)的調(diào)用之前,則應(yīng)在函數(shù)的定義中給出形函數(shù)的定義中給出
32、形參的默認(rèn)值參的默認(rèn)值。如果函數(shù)的定義在函數(shù)的調(diào)用之后,則應(yīng)在函數(shù)聲明中給出參。如果函數(shù)的定義在函數(shù)的調(diào)用之后,則應(yīng)在函數(shù)聲明中給出參數(shù)的默認(rèn)值,而在函數(shù)的定義中可以給出也可以不給出(視編譯器而定,例數(shù)的默認(rèn)值,而在函數(shù)的定義中可以給出也可以不給出(視編譯器而定,例如如vc6.0vc6.0中則中則只能在函數(shù)聲明中給出,而在函數(shù)定義中不能給出默認(rèn)參數(shù)只能在函數(shù)聲明中給出,而在函數(shù)定義中不能給出默認(rèn)參數(shù))。)。為了避免混淆,我們?yōu)榱吮苊饣煜覀冏詈弥辉诤瘮?shù)聲明中給出默認(rèn)參數(shù)最好只在函數(shù)聲明中給出默認(rèn)參數(shù)。(2 2)函數(shù)名重載時最好不要用缺省參數(shù),否則會引起二義性函數(shù)名重載時最好不要用缺省參數(shù),否
33、則會引起二義性 。例如:。例如:getdate(int day,int month=4,int year=2008);getdate(int day,int month=4,int year=2008);getdate(int day);getdate(int day);則如果有一個函數(shù)調(diào)用則如果有一個函數(shù)調(diào)用getdate(20),getdate(20),系統(tǒng)無法判斷應(yīng)該調(diào)用哪一個函數(shù)系統(tǒng)無法判斷應(yīng)該調(diào)用哪一個函數(shù)(編譯報錯編譯報錯)。但如果第二個函數(shù)改為:)。但如果第二個函數(shù)改為:getdate(int dat,int month,int year,int hour);getdate(in
34、t dat,int month,int year,int hour);則不會出現(xiàn)以上混淆。則不會出現(xiàn)以上混淆。37(4)內(nèi)聯(lián)函數(shù)(內(nèi)置函數(shù))內(nèi)聯(lián)函數(shù)(內(nèi)置函數(shù)) 對函數(shù)的調(diào)用需要一定的時間和空間開銷,對于有些需要頻繁調(diào)用的對函數(shù)的調(diào)用需要一定的時間和空間開銷,對于有些需要頻繁調(diào)用的函數(shù)這種開銷會累積起來。函數(shù)這種開銷會累積起來。c+c+對此提供了一種解決方法對此提供了一種解決方法內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)。 內(nèi)聯(lián)函數(shù):內(nèi)聯(lián)函數(shù):在編譯時將被調(diào)函數(shù)的代碼嵌入到主調(diào)函數(shù)中。這種嵌入在編譯時將被調(diào)函數(shù)的代碼嵌入到主調(diào)函數(shù)中。這種嵌入到主調(diào)函數(shù)中的函數(shù)稱為內(nèi)聯(lián)函數(shù)。定義內(nèi)聯(lián)函數(shù)只需在函數(shù)定義的前面到主調(diào)函數(shù)中的
35、函數(shù)稱為內(nèi)聯(lián)函數(shù)。定義內(nèi)聯(lián)函數(shù)只需在函數(shù)定義的前面加上關(guān)鍵字加上關(guān)鍵字 inlineinline. .38使用內(nèi)聯(lián)函數(shù)應(yīng)注意:n內(nèi)聯(lián)函數(shù)必須在函數(shù)第一次出現(xiàn)時由內(nèi)聯(lián)函數(shù)必須在函數(shù)第一次出現(xiàn)時由inlineinline指定;指定;n內(nèi)聯(lián)函數(shù)代碼不宜太大,原則上適宜內(nèi)聯(lián)函數(shù)代碼不宜太大,原則上適宜1-51-5行代碼的小函數(shù);行代碼的小函數(shù);n不能含有復(fù)雜的分支和循環(huán)等語句。不能含有復(fù)雜的分支和循環(huán)等語句。n遞歸調(diào)用函數(shù)不能定義為內(nèi)聯(lián)函數(shù)。遞歸調(diào)用函數(shù)不能定義為內(nèi)聯(lián)函數(shù)。i; p=(int *)malloc(sizeof(int)*i); void main() f();for(int j=0;ji
36、;j+) pj=j*10; coutpjendl;free(p); 6.6.動態(tài)分配動態(tài)分配/ /撤銷內(nèi)存的運(yùn)算符撤銷內(nèi)存的運(yùn)算符newnew和和deletedeletec c語言中動態(tài)內(nèi)存的分配與使用語言中動態(tài)內(nèi)存的分配與使用( (堆區(qū)堆區(qū)) )/分配單個堆區(qū)變量分配單個堆區(qū)變量#include#includevoid main()int *p;p=(int*)malloc(sizeof(int);*p=4;cout*pendl;free(p);40動態(tài)分配動態(tài)分配/撤銷內(nèi)存的運(yùn)算符撤銷內(nèi)存的運(yùn)算符new和和deletec c語言中使用庫函數(shù)語言中使用庫函數(shù)mallocmalloc和和fre
37、efree, ,進(jìn)行內(nèi)存分配和撤銷,進(jìn)行內(nèi)存分配和撤銷,mallocmalloc只能由用戶給出大小來分配內(nèi)存只能由用戶給出大小來分配內(nèi)存而不能自己確定數(shù)據(jù)類型,而不能自己確定數(shù)據(jù)類型,所以不適合面向?qū)ο笞远x類型,所以不適合面向?qū)ο笞远x類型,c+c+提供了提供了newnew和和deletedelete運(yùn)算符運(yùn)算符來來對內(nèi)存進(jìn)行動態(tài)分配和撤銷(任兼容對內(nèi)存進(jìn)行動態(tài)分配和撤銷(任兼容c c語言的語言的mallocmalloc和和freefree函數(shù))。函數(shù))。 new和和delete的用法:的用法:#include using namespace std;void main()int *p;p=
38、new int;*p=4;cout*pi;p=new inti;void main()f();for(int j=0;ji;j+) pj=j*10;coutpjendl;deletep;417. 引用類型引用類型引用:引用:就是給變量起一個別名,別名的定義,同一實體,就是給變量起一個別名,別名的定義,同一實體,兩個不同的名稱。兩個不同的名稱。c+中的引用中的引用:同一內(nèi)存單元兩種不同的變量名。:同一內(nèi)存單元兩種不同的變量名。通過引用,可以實現(xiàn)在不同的作用域內(nèi)訪問同一內(nèi)存單元。通過引用,可以實現(xiàn)在不同的作用域內(nèi)訪問同一內(nèi)存單元。42void main() int x=1; fun(x);void
39、 fun(int &a)a=3;您知道x與a是什么關(guān)系嗎?43引用定義的語法引用定義的語法q類型定義符類型定義符&變量名原變量名;變量名原變量名;int a=3;int &ra=a; (聲名聲名ra為為a的引用,的引用,ra就是就是a,a就是就是ra.改變了改變了ra就改變了就改變了a,改變了改變了a也就改變了也就改變了ra);即即ra與與a為同一個變量,但在不同的應(yīng)用場合下為同一個變量,但在不同的應(yīng)用場合下(作用域內(nèi))以不同的變量名出現(xiàn)。(作用域內(nèi))以不同的變量名出現(xiàn)。 44必須定義的同時使之初始化必須定義的同時使之初始化。引用并不另開辟內(nèi)存空間引用并不另開辟內(nèi)存空間
40、。聲明了一個變量的引用后,就聲明了一個變量的引用后,就不能在將其改為別的變量的引用不能在將其改為別的變量的引用。如下。如下程序。程序。#include using namespace std;int main() int a=2,b=3; int &ra=a; ra=b;/? b=6; couta=aendlb=bendlra=raendl; 聲明聲明 對一個一般變量的引用對一個一般變量的引用45n引用實際上是一隱指針,是對變量的間接引用,但不引用實際上是一隱指針,是對變量的間接引用,但不必加運(yùn)算符必加運(yùn)算符“* *“。n引用不同于其他變量。引用不同于其他變量。 不能定義引用數(shù)組不能定
41、義引用數(shù)組; ;如:如: int &x10int &x10錯誤。錯誤。 不能建立指向引用的指針不能建立指向引用的指針;如:;如:int &int &* *p p錯誤。錯誤。 不能建立引用的引用不能建立引用的引用; ;如:如:int &xint &x;錯誤。;錯誤。 int i; int &j=i;int*p=&j;? 46為什么要提供引用操作符為什么要提供引用操作符 c+中的引用主要是用來解決函數(shù)調(diào)用中中的引用主要是用來解決函數(shù)調(diào)用中形參為指形參為指針型的參數(shù)時其函數(shù)體時的不安全性(易出錯),針型的參數(shù)時其函數(shù)體時的不安全性(易出
42、錯),使得操作更加簡單、安全。使得操作更加簡單、安全。例如:例如: 47 int add(int &x, int &y) x=x+y; return x; void main() int a=1, b=2; add(a, b); int add(int int add(int * *x, int x, int * * y) y) * *x=x=* *x+x+* *y;y; return return * *x;x; void main() void main() int a=1, b=2; int a=1, b=2; add(&a, &b); add(&
43、a, &b); 改進(jìn)為48引用調(diào)用的優(yōu)點(diǎn)引用調(diào)用的優(yōu)點(diǎn) 通過引用調(diào)用可以提高調(diào)用速度,因為通過引用調(diào)用可以提高調(diào)用速度,因為只需要傳送地址只需要傳送地址而不而不需要直接將大量數(shù)據(jù)拷貝,因而特別適用于形參為大量數(shù)需要直接將大量數(shù)據(jù)拷貝,因而特別適用于形參為大量數(shù)據(jù)的應(yīng)用場合。據(jù)的應(yīng)用場合。 struct datastruct data int a1000; int a1000; adata; adata; void fun(struct data x)void fun(struct data x) struct datastruct data int a1000; int a1000;
44、adata; adata; void fun(struct data &x)void fun(struct data &x) 改進(jìn)為改進(jìn)為您知道為什么要這您知道為什么要這樣做呢?樣做呢?49正確區(qū)分傳值調(diào)用與傳地址調(diào)用正確區(qū)分傳值調(diào)用與傳地址調(diào)用 c語言中,函數(shù)參數(shù)傳遞有兩種方式:語言中,函數(shù)參數(shù)傳遞有兩種方式:變量名作實參變量名作實參和和變變量地址作實參量地址作實參。c+中有擴(kuò)充了一種中有擴(kuò)充了一種變量引用作實參變量引用作實參。下面。下面分別回顧一下:分別回顧一下:(1 1)變量名作實參變量名作實參 變量名作實參變量名作實參就是直接將變量或變量的值傳遞給函就是直接將變量或變量
45、的值傳遞給函數(shù)的形參。這種方式在函數(shù)棧中為形參分配空間。并將實參數(shù)的形參。這種方式在函數(shù)棧中為形參分配空間。并將實參的值復(fù)制到該空間中的值復(fù)制到該空間中, ,因為因為實參和形參在不同的空間實參和形參在不同的空間,所以傳,所以傳遞是遞是單向單向的。只能由實參將值復(fù)制給形參,形參的改變不影的。只能由實參將值復(fù)制給形參,形參的改變不影響實參的值。響實參的值。50例如:例如:程序輸出:程序輸出:a=2 b=4; a=2 b=4; 可見可見swapswap函數(shù)并不能實現(xiàn)將實參交換的作用。函數(shù)并不能實現(xiàn)將實參交換的作用。51(2 2)變量地址作實參變量地址作實參 變量地址作實參變量地址作實參是將函數(shù)的參數(shù)
46、定義為是將函數(shù)的參數(shù)定義為指針類型指針類型,調(diào)用函數(shù)的時候?qū)⒆兞康牡刂纷鳛閷崊鬟f給函數(shù)。這種傳調(diào)用函數(shù)的時候?qū)⒆兞康牡刂纷鳛閷崊鬟f給函數(shù)。這種傳值方式也是單向傳遞,但和變量名作實參不同的是值方式也是單向傳遞,但和變量名作實參不同的是它將實參它將實參變量的內(nèi)存地址復(fù)制給形參變量的內(nèi)存地址復(fù)制給形參。所以可以在函數(shù)棧中直接通過。所以可以在函數(shù)棧中直接通過變量地址來改變實參的值。變量地址來改變實參的值。52程序輸出:程序輸出:a=4 b=2; a=4 b=2; 可見可見swapswap函數(shù)實現(xiàn)了將實參交換的作用。函數(shù)實現(xiàn)了將實參交換的作用。間接間接的實現(xiàn)了的實現(xiàn)了函數(shù)傳參的雙向傳遞函數(shù)傳參的雙向
47、傳遞。53()()變量引用作實參變量引用作實參 變量引用作實參變量引用作實參是將函數(shù)的參數(shù)定義為引用類型,是將函數(shù)的參數(shù)定義為引用類型,調(diào)用函數(shù)的時候?qū)⒆兞棵鳛檎{(diào)用函數(shù)的時候?qū)⒆兞棵鳛閷崊鬟f給函數(shù)實參傳遞給函數(shù)。這種傳值方。這種傳值方式是式是雙向傳遞雙向傳遞,實參和形參共享同一內(nèi)存空間。,實參和形參共享同一內(nèi)存空間。改變了形參改變了形參也就改變了實參也就改變了實參。54程序輸出:程序輸出:a=4 b=2; a=4 b=2; 可見可見swapswap函數(shù)實現(xiàn)了將實參交換的作用。這種函數(shù)實現(xiàn)了將實參交換的作用。這種傳參方式和變量名作參數(shù)的唯一不同是定義函數(shù)時傳參方式和變量名作參數(shù)的唯一不同是
48、定義函數(shù)時將形參聲名為引用類型。將形參聲名為引用類型。其余都和變量名作參數(shù)完全相同其余都和變量名作參數(shù)完全相同。55區(qū)分引用在如下兩種場合的差別區(qū)分引用在如下兩種場合的差別 (1)對一般的變量進(jìn)行引用對一般的變量進(jìn)行引用:如引用的變量不是用作函數(shù)如引用的變量不是用作函數(shù)的形參或返回值,則聲明時的形參或返回值,則聲明時必須加以初始化以指明它的必須加以初始化以指明它的同地址變量。同地址變量。 void main(void) int x=3; int &refx=x; fun(refx); cout x; /x的值被改變?yōu)榈闹当桓淖優(yōu)? void fun( int & a) a+;/
49、a為為refx的引用的引用 56int add(int &x=1, int &y=2) x=x+y; return x; 正確的參正確的參數(shù)聲明數(shù)聲明錯誤的參數(shù)聲明錯誤的參數(shù)聲明(2)函數(shù)的形參為引用函數(shù)的形參為引用:如引用的變量用作函數(shù)的形參或返:如引用的變量用作函數(shù)的形參或返回值,則說明時回值,則說明時不要不要加以初始化以指明它的同地址變量,此加以初始化以指明它的同地址變量,此時形參為實參的引用。時形參為實參的引用。int add(int &x, int &y) x=x+y; return x; 57函數(shù)形參定義為引用參數(shù)時的調(diào)用要求函數(shù)形參定義為引用參數(shù)時的調(diào)用要求 int add(int &a, int & b) return a+ b;
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 燈具改造施工方案
- 鋼材基礎(chǔ)知識培訓(xùn)課件
- 吊頂裝飾工程合同范例
- 刀具合同范例
- 如何建立與維護(hù)良好的銀行關(guān)系計劃
- 行業(yè)趨勢研究與應(yīng)對措施計劃
- 筑夢未來社團(tuán)工作愿景計劃
- 人力資源戰(zhàn)略與公司目標(biāo)的對接計劃
- 注重員工心理健康的年度計劃
- 餐飲行業(yè)安全消防工作計劃
- 醫(yī)療技術(shù)臨床應(yīng)用動態(tài)評估制度
- 2023年四川成都農(nóng)業(yè)科技中心管理人員招聘1人高頻考點(diǎn)題庫(共500題含答案解析)模擬練習(xí)試卷
- 護(hù)士奮斗從n1晉升n2個人總結(jié)大全
- 《概率論與數(shù)理統(tǒng)計》課件第八章 假設(shè)檢驗
- 2023年濟(jì)南工程職業(yè)技術(shù)學(xué)院單招職業(yè)技能考試題庫及答案解析word版
- 格力2匹柜機(jī)檢測報告KFR-50LW(50530)FNhAk-B1(性能)
- 10KV開關(guān)柜教學(xué)講解課件
- 河南省施工現(xiàn)場安全文明施工標(biāo)準(zhǔn)
- GB/T 8813-2020硬質(zhì)泡沫塑料壓縮性能的測定
- GB/T 15057.2-1994化工用石灰石中氧化鈣和氧化鎂含量的測定
- 事故應(yīng)急預(yù)案演練流程圖
評論
0/150
提交評論