




已閱讀5頁,還剩372頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
C+程序設(shè)計,吉林大學(xué) 軟件學(xué)院,教師郵箱: 參考書: C+程序設(shè)計教程 錢能 清華大學(xué)出版社 第2版 課堂紀(jì)律: 上機(jī):,第一章:概 述,1-1 培養(yǎng)目標(biāo) 理解和掌握c+語言的基本語義和語法,初步理解面向?qū)ο蟮乃枷?,初步掌握面向?qū)ο蟮某绦蛟O(shè)計方法。 提高編程能力和調(diào)試程序的能力,為后面的學(xué)習(xí)打好基礎(chǔ)。,1-2 C語言與C+語言,C語言回顧: 1972年 bell實驗室研制 C語言特點: 高度靈活性、實現(xiàn)上的高效性 (比FORTRAN) 簡捷和高效 (比Pascal),C語言局限: 程序達(dá)到一定規(guī)模時,模塊之間的協(xié)調(diào)性存在問題,程序的重用性也存在問題,程序員難以控制程序的復(fù)雜性。,C+產(chǎn)生: 1980年 貝爾實驗室 Bjanre Stroustrup 對C改進(jìn)與擴(kuò)充 最初稱為“帶類的C”,(c with classes). 1983年正式命名為C+ 3次修訂后 1994 年制定了ANSI c+草案 1998年11月,ISO標(biāo)準(zhǔn)被批準(zhǔn)。,C+是C的改進(jìn)與擴(kuò)充 C+包括C的全部屬性、特征、優(yōu)點,是在C的基礎(chǔ)上的改進(jìn)與擴(kuò)充 C+是C語言改進(jìn)的基礎(chǔ)上,添加了對面向?qū)ο蟪绦蛟O(shè)計部分的支持 C+包括過程性語言和類部分 C+是C的超集,C是C+的子集 C+是混合型語言,即是過程型的,又是面向?qū)ο笮偷?1-3 面向過程的程序設(shè)計,“面向過程”是一種以事件為中心的編程思想。 就是分析出解決問題所需要的步驟,然后用函數(shù)把這些步驟一步一步實現(xiàn),使用的時候一個一個依次調(diào)用就可以了。,1-4 面向?qū)ο蟪绦蛟O(shè)計的基本特征,1. 對象 一個對象是客觀世界的一個實體 數(shù)據(jù)與數(shù)據(jù)處理過程作為一個整體對象 C+采用“類”來支持對象,同類對象抽象出其共性,形成類,類封裝了數(shù)據(jù)與處理數(shù)據(jù)的過程(函數(shù)),2. 繼承與重用 舉例 C+采用繼承支持重用。 可通過繼承現(xiàn)有類,并對其進(jìn)行擴(kuò)展,生成新類,即新類是從現(xiàn)有類派生出來的,成為派生類。,3. 多態(tài)性: 多態(tài)性指同一個操作在不同的類上有著不同行為。,1-5:舉例比較面向?qū)ο蠛兔嫦蜻^程 程序設(shè)計,例如五子棋, 面向過程的設(shè)計思路就是首先分析問題的步驟: 1、開始游戲, 2、黑子先走, 3、繪制畫面, 4、判斷輸贏, 5、輪到白子, 6、繪制畫面, 7、判斷輸贏, 8、返回步驟2, 9、輸出最后結(jié)果。 把上面每個步驟用分別的函數(shù)來實現(xiàn),問題就解決了,而面向?qū)ο蟮脑O(shè)計則是從另外的思路來解決問題。整個五子棋可以分為: 1、黑白雙方,這兩方的行為是一模一樣的, 2、棋盤系統(tǒng),負(fù)責(zé)繪制畫面, 3、規(guī)則系統(tǒng),負(fù)責(zé)判定諸如犯規(guī)、輸贏等。 第一類對象(玩家對象)負(fù)責(zé)接受用戶輸入,并告知第二類對象(棋盤對象)棋子布局的變化,同時利用第三類對象(規(guī)則系統(tǒng))來對棋局進(jìn)行判定。,面向過程和面向?qū)ο蟛皇菍α⒌?面向過程和面向?qū)ο髮㈤L期并存 從程序機(jī)構(gòu)上,c+的單一程序體本質(zhì)上是基于過程的,因為運行程序時,總是啟動過程。,/* this is a simple c+ program*/ #include using namespace std; / #include int main( ) int a,b,result; cout ab; result=3*a-2*b+1; cout“result is “resultendl; return 0; ,1-6 C+的程序結(jié)構(gòu),1.預(yù)處理命令: 宏定義命令、文件包含命令和條件編譯命令 2.輸入和輸出: 3.函數(shù): 4.語句:是組成程序的基本單元。以分號結(jié)束。 5.變量: 6.其他:如符號常量和注釋信息。 C+中盡量把常量定義為符號常量 #define PI 3.1415 const double PI=3.1415;,1-7 C+程序的實現(xiàn),編輯、編譯、運行 1.編輯:將編寫好的C+源程序輸入到計算機(jī)中,生成磁盤文件的過程。磁盤文件的名字要用擴(kuò)展名.cpp。 2.編譯:C+程序的實現(xiàn)必須要使用某種C+語言的編譯器對程序進(jìn)行編譯。功能是:將程序的源代碼轉(zhuǎn)換成為機(jī)器代碼的形式,稱為目標(biāo)代碼(.obj),然后,再使目標(biāo)代碼進(jìn)行連接,生成可執(zhí)行文件(.exe)。 編譯過程可分為三個子過程:預(yù)處理過程、編譯過程、連接過程,(1)預(yù)處理過程:執(zhí)行預(yù)處理命令 (2)編譯過程: 進(jìn)行詞法分析和語法分析的過程,又稱源程序分析的過程。 符號表:又稱字典。映射程序中的各種符號及其他們的屬性。是在進(jìn)行詞法分析和語法分析是生成的,在生成中間代碼和可執(zhí)行的機(jī)器代碼時使用。 錯誤處理程序: 生成目標(biāo)代碼:.OBJ為擴(kuò)展名的磁盤文件,機(jī)器可識別文件內(nèi)容,卻不能執(zhí)行。 (3)連接過程:編譯器對每個源文件單獨進(jìn)行編譯,多個源程序的目標(biāo)代碼以及庫文件(.Lib)連接在一起,才能形成可執(zhí)行文件(.exe)。由連接器完成. 3.運行:,上機(jī)環(huán)境: Visual c+ 6.0 Visual studio 2010,一個C+程序有一個主函數(shù), 主函數(shù)是程序執(zhí)行的開始點。 C+ 不允許函數(shù)定義嵌套。 函數(shù)有兩種:標(biāo)準(zhǔn)庫函數(shù)和用戶自定義函數(shù)。,第二章 函 數(shù),2-1 內(nèi)聯(lián)函數(shù),內(nèi)聯(lián)函數(shù)也稱內(nèi)嵌或內(nèi)置函數(shù),它的語法格式與普通函數(shù)一樣,只是在函數(shù)原型或函數(shù)定義標(biāo)題頭之前加上關(guān)鍵字inline。 inline int isnumber(char); inline int isnumber(char ch) return(ch=0 ,編譯器為內(nèi)聯(lián)函數(shù)創(chuàng)建一段源代碼,每遇到一次該函數(shù)的調(diào)用都用相應(yīng)的一段代碼來代替。 內(nèi)聯(lián)函數(shù)主要是解決運行效率的問題。使用內(nèi)聯(lián)函數(shù)可以省去函數(shù)調(diào)用所需的建立棧內(nèi)存環(huán)境,進(jìn)行參數(shù)傳遞,產(chǎn)生程序轉(zhuǎn)移的時間開銷 內(nèi)聯(lián)函數(shù)應(yīng)是使用頻率高,代碼卻很短的函數(shù)。,內(nèi)聯(lián)函數(shù)必須在調(diào)用之前聲明或定義。 #include using namespace std; inline int isnumber(char); / int isnumber(char);(則正常函數(shù)調(diào)用) int main() char c; while (cinc ,此處inline可省略,內(nèi)聯(lián)函數(shù)的函數(shù)體限制: 內(nèi)聯(lián)函數(shù)中,不能含有switch和while。 遞歸函數(shù)不能用來做內(nèi)聯(lián)函數(shù)。 內(nèi)聯(lián)函數(shù)中不能說明數(shù)組。 否則,按普通函數(shù)調(diào)用那樣產(chǎn)生調(diào)用代碼。 (內(nèi)聯(lián)函數(shù)是建議性,不是指令性) 內(nèi)聯(lián)函數(shù)只適合于1-5行的小函數(shù) 類結(jié)構(gòu)中所有在類內(nèi)部定義的函數(shù),都是內(nèi)聯(lián)函數(shù)。,2-2 重載函數(shù),int abs(int); long l_abs(long); double d_abs(double); 重載函數(shù): int abs(int); long abs(long); double abs(double); C+用一種函數(shù)名技術(shù)可準(zhǔn)確的判斷出應(yīng)使用那一個函數(shù)。 abs(-10); /調(diào)用int abs(int); abs(-1000000); /調(diào)用long abs(long); abs(12.3); /調(diào)用double abs(double);,簡化編程,在編程邏輯上,親近了人類的思維,在同一作用范圍中為多個函數(shù)定義(其功能通常是相近的)指定一個共同的函數(shù)名,委托編譯器根據(jù)每一個單獨函數(shù)的形參個數(shù)、類型和位置的差異 ,在幕后進(jìn)行名稱細(xì)分并選擇合適的函數(shù)調(diào)用匹配的現(xiàn)象稱為函數(shù)重載。 void print (double); void print (long); void print(double,char*); void print(char*,double); void f( ) print (1L);/print(long) print (1.0);/print(double) print (2.0,”hello”);/print(double,char*) print (”hello”,3.0);/print(char*,double) ,讓重載函數(shù)執(zhí)行不同的功能,是不好的編程風(fēng)格。,匹配重載函數(shù)的順序: (1)嚴(yán)格匹配 (2)內(nèi)部轉(zhuǎn)換(相容類型匹配) (3)通過用戶定義的轉(zhuǎn)換尋找求一個匹配。 void print(int); void print(double); void function() print(3); print(5.0); print(a); print(3.1415f); ,void print(long); void print(double); void function() int a; print(a);/有二義性 ,print(long(a); 或者print(double(a);,重載的內(nèi)部實現(xiàn): C+用名字粉碎(name mangling)(名字細(xì)分、名字壓軋)的方法來改變函數(shù)名。 用v,c,i,f,l,d,r 分別表示void,char,int,float,long,double,longdouble. int f (char a); / f_c int f (char a,int b,double c); /f_cid,返回值類型不能夠作為重載依據(jù)(區(qū)分、細(xì)分重載) void func (int); int func ( int); fucn(10); /error 這樣規(guī)定保證對重載的解析與環(huán)境無關(guān) float sqrt(float); double sqrt(double); void f(double da,float fla) float fl=sqrt(da); /調(diào)用sqrt(double) double d=sqrt(da); /調(diào)用sqrt(double) fl=sqrt(fla); /調(diào)用sqrt(float) d=sqrt(fla); /調(diào)用sqrt(float) ,2-3 默認(rèn)參數(shù)的函數(shù),默認(rèn)參數(shù)也稱為缺省參量。 例: void delay(int loops); void delay(int loops) if (loops=0) return; for (int i=0;iloops;i+); 允許函數(shù)默認(rèn)參數(shù)值,是為了讓編程簡單,讓編譯器做更多的檢查錯誤工作。 默認(rèn)參數(shù)函數(shù)的聲明 當(dāng)又有聲明又有定義時,定義中不允許默認(rèn)參數(shù)。 若只有定義,則默認(rèn)參數(shù)才可出現(xiàn)在函數(shù)定義中,將loops 定義成默認(rèn)值為1000 void delay(int =1000); 調(diào)用時:delay(); delay(2000);,默認(rèn)參數(shù)的順序規(guī)定: 一個函數(shù)中可以有多個默認(rèn)參數(shù),默認(rèn)參數(shù)應(yīng)從右至左逐漸定義,當(dāng)調(diào)用函數(shù)時,從左向右匹配參數(shù)。 例:void foo(int a, int b, bool c); void foo(int a, int b, bool c = false); /ok,c是最后一個參數(shù) void foo(int a, int b = 0, bool c); /fail,b不是最后一參數(shù),當(dāng)調(diào)用有默認(rèn)參數(shù)的函數(shù)時,從左向右匹配參數(shù)。 #include using namespace std; void fun(int a=1,int b=3,int c=5) cout“a=“a“,“ “b=“b“,“ “c=“c“,“endl; int main() fun(); fun(7); fun(7,9); fun(7,9,11); cout“OK“; return 0; ,默認(rèn)值的規(guī)定: 默認(rèn)值可以是全局變量、全局常量、函數(shù)。不可以是局部變量。因為默認(rèn)值是在編譯時確定的,必須是靜態(tài)確定的。,函數(shù)重載與函數(shù)默認(rèn)參數(shù): (1)默認(rèn)參數(shù)不能用于細(xì)分重載函數(shù)。 例1: void func(int,int); void func(int=3,int=4); func(22,32);,例2:void func(int); void func(int,int);是重載函數(shù) 而void func(int); void func(int,int=4); 在 func(3)調(diào)用時有二義性 應(yīng)該避免重載過程中的涉及參數(shù)個數(shù)的默認(rèn)設(shè)置,(2)函數(shù)重載與函數(shù)默認(rèn)參數(shù): 默認(rèn)函數(shù)可將一系列簡單的重載函數(shù)合成為一個。 int month,int day,int year; void Tdate() month=4; day=15; year=1995; void Tdate(int m) month=m; day=15; year=1995; void Tdate(int m,int d) month=m; day=d; year=1995; void Tdate(int m,int d,int y) month=m; day=d; year=y; void Tdate(int m=4,int d=15,int y=1995) month=m; day=d; year=y; ,int main() Tdate(); Tdate(1); Tdate(1,2); Tdate(1,2,3); return 0; ,重載函數(shù)的功能相同,只是參數(shù)個數(shù)不同,用默認(rèn)參數(shù)值的方法比較簡便,如果參數(shù)值用來確定不同的操作,則用函數(shù)重載比較好 #include using namespace std; void print(); void print(int *); int main() int arr10; int sum=0; for (int i=0;iarri; sum=sum+arri; if (sum100) print(arr); else print(); return 0; ,void print(int * pa) cout“the array can be used“endl; for (int i=0;i10;i+) coutpai“ “; coutendl; void print() cout“the array can not be usedendl“; ,無名參數(shù) 函數(shù)的定義和聲明中,都可以省略形參名. void print (int ,int); void print(int a,int) coutaendl; void func() print(1,2); ,2-4: 程序運行時的內(nèi)存布局,(1)代碼區(qū)(code area):存放程序的代碼(各個函數(shù)的代碼塊) (2)全局變量區(qū)(data area):存放程序的全局?jǐn)?shù)據(jù)和靜態(tài)數(shù)據(jù) (3)堆區(qū)(heap area) :存放程序的動態(tài)數(shù)據(jù) 可以用malloc()與free()以及new和delete 來申請與釋放堆內(nèi)存,也稱動態(tài)內(nèi)存、動態(tài)數(shù)據(jù)區(qū)。 (4)棧區(qū)(stack area):存放程序的局部數(shù)據(jù)(各個函數(shù)中的數(shù)據(jù)),3-1:指針 1.指針變量的定義與賦值 指針是一種數(shù)據(jù)類型,用于存放內(nèi)存單元的地址。 int * ip; 定義同時賦值:int a; int *p=,第三章: 指針和引用,3.與地址相關(guān)的運算 * 和 “ & ”稱為取地址運算符,用來得到一個對象的地址。一元運算符。 * 和 &是兩個互逆的操作,當(dāng)這兩個操作符碰到一起時,其作用相互抵消,例如 *&k=3 與 k=3 效果完全相同,4.用指針處理數(shù)組元素 例: int *p,i,a6=0,1,2,3,4,5; p=a; for(i=0;i6;i+) printf(“%d”,_); ai *(a+i) pi *(p+i) *p+ *a+ 考慮: 的作用 和*的比較; 越界訪問 數(shù)組名和指針,(1)數(shù)組名的內(nèi)涵在于其指代實體是一種數(shù)據(jù)結(jié)構(gòu),這種數(shù)據(jù)結(jié)構(gòu)就是數(shù)組; (2)數(shù)組名的外延在于其能夠轉(zhuǎn)換為指向其指代實體的指針,而且是個指針常量; (3)數(shù)組名作為函數(shù)形參時,在函數(shù)體內(nèi),其失去了本身的內(nèi)涵,僅僅只是個指針;,#include using namespace std; void arrayTest(char str) /char *str, char str10 cout sizeof(str) endl; cout+strendl; int main() char str110 = “Y and me”; arrayTest(str1); return 0;,5. void 指針與NULL指針值 (1)void 指針(void *p) 空類型指針 不指向任何類型,僅僅是一個地址。 不能進(jìn)行指針運算,也不能進(jìn)行間接引用。*p 其他類型指針可以賦值給空類型指針 空類型指針經(jīng)顯示轉(zhuǎn)換后方可賦給其他指針。 int a=30; int *ip=,(2)NULL是空指針值,不指向任何地方。任何類型的指針都可以賦該值。 int *ptr = NULL; int *ptr = 0; NULL與void*是不同的概念,6. 指針和常量 const 說明符 const 為指定說明符(也稱為常類型說明符),使用指定時,程序執(zhí)行的過程中指定的內(nèi)容不能被改變(凍結(jié))。即一次初始化后,指定的內(nèi)容始終不變。 (1)定義一般常量 使用const 說明常量:int const x=2; 或const int x=2; 定義或說明一個常數(shù)組可采用如下格式: const 或者 const double const a2=1.0,2.0 常量定義時,應(yīng)被初始化。 const int i5; i+;(錯誤); const int i;必須初始化; C 中常量定義用#define PI 3.14159 c+中使用const double PI=3.1415; 積極使用const, 避免使用宏,可以用const、enum定義常量。,(2)指針常量和常量指針(指向常量的指針) 指針常量:在指針定義語句的指針名前加const, 表示指針本身是常量。 int a; int* const p= 均可。 以上定義表明,*pi是常量,不能將*pi作為左值進(jìn)行操作。 定義指向常量的指針時,定義時不必須先初始化。,例:指針常量 int a10; int * const p=a; int b6; p=b; / 錯誤 *p=6; / 正確 *(p+6)=6; / 正確 *p+7; / 錯誤 const int c0; int *const q / 錯誤(a本身不能被修改就不允許外界提供修改的漏洞),(3)指向常量的指針常量(常量指針常量) 形式: const int *const p,重載和const形參 (1) void f(int* p); void f(const int* cp);/有效重載,是不是指向const對象 (2) void f(int* p ); void f(int * const pc);/無效重載,重定義不能基于指針本身是否const 實現(xiàn)重載,7. 堆內(nèi)存的分配 1堆內(nèi)存(heap):堆是一塊內(nèi)存區(qū)域,堆允許程序在運行時(而不是編譯時),申請某個大小的內(nèi)存空間。堆內(nèi)存又稱為動態(tài)內(nèi)存。 2獲得堆內(nèi)存 c中用函數(shù)malloc()(在頭文件malloc.h中)來獲得堆內(nèi)存;c+中用操作符new來獲得堆內(nèi)存。 3釋放堆內(nèi)存 c中用函數(shù)free()(在頭文件malloc.h中)來釋放堆內(nèi)存;c+中用操作符delete來釋放堆內(nèi)存。,使用malloc申請空間 void *malloc(unsigned long size); 例: #include “stdio.h” #include “malloc.h” int main() int *p,i; p=(int *)malloc(10*sizeof(int); for(i=0;i10;i+) scanf(“%d”,p+); p-=10; for(i=0;i10;i+) printf(“%d”,pi); free(p); /只能釋放malloc申請的空間 return 0; ,使用new和delete進(jìn)行動態(tài)內(nèi)存分配和釋放 運算符new和delete是C+新增的運算符,提供了存儲的動態(tài)分配和釋放功能。它的作用相當(dāng)于C語言的函數(shù)malloc()和free(),但是性能更為優(yōu)越。 使用new和delete: (1) new 類型 (初始化值) ; int *p; p=new int (100);/動態(tài)分配一個整數(shù)并初始化 delete p; (2)new 類型 數(shù)組大小 int *p;p=new int10; /分配一個含有10個整數(shù)的整形數(shù)組 delete p; /刪除這個數(shù)組 使用new較之使用malloc()有以下的幾個優(yōu)點: (1)new自動計算要分配類型的大小,不使用sizeof運算符,比較省事,可以避免錯誤。 (2)自動地返回正確的指針類型,不用進(jìn)行強制指針類型轉(zhuǎn)換。 (3)可以用new對分配的對象進(jìn)行初始化。 (4)不用使用頭文件聲明(malloc.h),更簡潔。,include “stdio.h” int main() int *p,i; p=new int10; for(i=0;i10;i+) scanf(“%d”,p+); p-=10; for(i=0;i10;i+) printf(“%d”,pi); delete p; /只能釋放new申請的空間 return 0; ,new操作符若申請成功,返回首單元地址;否則返回NULL值。 int *p=new int10; if (p=NULL) /if (!p) 或者 if (p=0) cout“cant allocate more memory!n”; exit(1); /exit是在調(diào)用處強行退出程序 /exit(1)表示異常退出. exit(0)表示正常退出,動態(tài)空間 : 動態(tài)申請二維數(shù)組 #include “stdio.h” int main() int *p,i,j; p=new int *3; for(i=0;i3;i+) pi=new int3; for(i=0;i3;i+) for(j=0;j3;j+) scanf(“%d”,*(p+i)+j); for(i=0;i3;i+) for(j=0;j3;j+) printf(“%d“,pij); for(i=0;i3;i+) delete pi; delete p; return 0; ,8.函數(shù)指針和指針函數(shù) (1)指針函數(shù):返回指針值的函數(shù)。 定義格式:類型修飾符* 函數(shù)名(形參表) 函數(shù)體 int* f(int a); (2)函數(shù)指針:指向函數(shù)地址(程序區(qū))的指針。與函數(shù)名等價的指針。函數(shù)名是指向函數(shù)的指針常量。 函數(shù)指針定義 若函數(shù)原型為:類型 函數(shù)名(形參表); 則相應(yīng)函數(shù)指針定義為: 類型 (*變量名) (形參表);/()的優(yōu)先級大于* char *p(int); char (*p)(int ); 例:int f1(int n); int (*pf1)(int n); pf1=f1;/pf1是與f1等價的函數(shù)指針 指針函數(shù)用來申請空間或者查找數(shù)據(jù); 函數(shù)指針用來臨時制定參與運算的函數(shù);,(3)通過函數(shù)指針來調(diào)用函數(shù) 例: int add(int a,int b)return a+b; int main() int (*p)(int,int); p=add; /p是與add等價的函數(shù)指針 coutadd(3,5); cout(*p)(3,5); /四種調(diào)用形式效果等價 coutp(3,5); cout(*add)(3,5); return 0; 結(jié)果:8888,4函數(shù)指針作函數(shù)形參 例:計算以0.10為步長,特定范圍內(nèi)的三角函數(shù)之和。 #include using namespace std; #include double sigma(double(*func)(double),double dl,double du) double dt=0.0; for(double d=dl;ddu;d+=0.1) dt+=func(d); return dt; int main() double dsum; dsum=sigma(sin,0.1,1.0); cout“the sum of sin from 0.1 to 1.0 is“dsumendl; dsum=sigma(cos,0.5,3.0); cout“the sum of cos from 0.5 to 3.0 is“dsumendl; return 0; ,5.用typedef 來簡化函數(shù)指針 (1)typedef int (*FUN)(int a,int b); int f(int,int); FUN funp=f; FUN 不是指針變量,是指針類型名。 (2)typedef int FUNC(int,int); /先定義函數(shù)類型 FUNC* funp=f; 6.函數(shù)的返回類型可以是函數(shù)指針 typedef int (*SIG) (); typedef void (*SIGARG) (); SIG signal (int,SIGARG);,3-2 引 用,1.引用(reference)的概念 為一個變量、函數(shù)等對象規(guī)定一個別名,該別名稱為引用。此后,對別名的操作即是對別名所代表的對象的操作。,對象:存儲器中一片連續(xù)的區(qū)域; *(a+10)=7 左值:就是引用某個對象的表達(dá)式,2聲明引用:聲明引用格式如下: 格式:類型標(biāo)識符 /rp2代表p所指向的那個對象, /即數(shù)組元素a0,3引用必須初始化。引用一旦被聲明則不能再修改. Int j,k; int ,void /error void 本質(zhì)不是一個類型,只是在語法上相當(dāng)于一個類型,沒有該類型的對象。,4、引用的使用參數(shù)傳遞 void swap(int,形參和實參結(jié)合規(guī)則: 形參為引用時,形參(引用)接收實參(對象)的地址。 或表述為: 形參為引用時,凡遇到形參(引用)的地方,全部用實參(對象)來代替。 傳遞引用給函數(shù)與傳遞指針的效果相同。 可讀性比指針傳遞好(傳值方式的調(diào)用與可讀性,性能卻強于傳值方式) 參數(shù)結(jié)合符合初始化標(biāo)準(zhǔn) 可使用引用傳遞從函數(shù)返回多個值(指針和引用都可以),5.引用和指針的關(guān)系 指針是個變量,可再賦值; 而引用建立時必須進(jìn)行初始化并且決不會再關(guān)聯(lián)其它不同的變量。 指針操縱兩個實體(指針值、指向的值);引用只能操縱一個實體。 引用在內(nèi)部用指針實現(xiàn) ,被看成是指針常量,不能操作自身的地址值,只能訪問所指向的實體。 在語言層面,引用的用法和對象一樣;在二進(jìn)制層面,引用一般都是通過指針來實現(xiàn)的,只不過編譯器幫我們完成了轉(zhuǎn)換 實際上“引用”可以做的任何事情“指針”也都能夠做,為什么還要“引用”? 答案是“用適當(dāng)?shù)墓ぞ咦銮∪缙浞值墓ぷ鳌薄?指針能夠毫無約束地操作內(nèi)存中的東西,盡管指針功能強大,但是非常危險。 引用是指針出于安全考慮的替代品。,在以下情況下你應(yīng)該使用指針: 一是你考慮到存在不指向任何對象的可能(在這種情況下,你能夠設(shè)置指針為空) 二是你需要能夠在不同的時刻指向不同的對象(在這種情況下,你能改變指針的指向)。 如果總是指向一個對象并且一旦指向一個對象后就不會改變指向,那么你應(yīng)該使用引用。,6.用const 限定引用 用const 限定引用聲明方式: Int i; const int 效率相同,double 注意:c+不分變量的const引用,和const變量的引用,因為引用本身就不能重新賦值,使它指向另一個變量。 即沒有const int const &a=1, 只有const int &a=1,7.引用的使用用引用返回值 float t; float f1(float r) float k; k=3.14*r*r; cout“f1:k is“ ,int main() float a=f1(5); const float ,f1:k is0x0013FF08 f1:k is0x0013FF08 b:0x0013FF74,f2:t is0x0042DD68 f2:t is0x0042DD68 d:0x0042DD68,f3:f is0x0013FF08 e=5.88384e-039,用普通的返回值的方法返回一個函數(shù)的函數(shù)值時,需在內(nèi)存中先創(chuàng)建一個臨時變量, 在被調(diào)函數(shù)返回時,將函數(shù)值復(fù)制到該臨時變量中, 主調(diào)函數(shù)再以該臨時變量的值進(jìn)行運算。這種方法產(chǎn)生了函數(shù)值的副本。 用引用返回一個函數(shù)值的最大好處是:在內(nèi)存中不產(chǎn)生被返回值的副本。 別返回一個局部對象的引用。,8.引用的使用函數(shù)調(diào)用作為左值 int a=0,b=0,c=0; int ,9.返回堆中變量的引用 int ,練習(xí)題 char a =“abcdefghij“; char *q=a; int *p=(int *)a; while(*q) *q+=*q+1; p+=2; printf(“%s“,p); /sizeof(char)=1 /sizeof(int)=4,分析程序,寫出結(jié)果:#include void main() int* p; int*,第四章: 類,1.從結(jié)構(gòu)到類 結(jié)構(gòu):相關(guān)聯(lián)的數(shù)據(jù)元素組成一個單獨的統(tǒng)一體 struct Savings unsigned accountnumber; /賬號 float balance; /結(jié)算額 ; ;是必需的 struct Savings a,b; 或者 Savings a,b; 常用形式 結(jié)構(gòu)分量稱為成員,使用“.”操作符訪問成員 void fn() Savings a; Savings b; a.accountnumber=1; b.accountnumber=2; ,粗糙的數(shù)據(jù)類型,沒有涉及復(fù)合數(shù)據(jù)的操作。,C的結(jié)構(gòu)中不含有成員函數(shù)。 C+的類中既能包含數(shù)據(jù)成員,又包含函數(shù)成員或稱成員函數(shù)。 class Savings public : float deposit(float amount) /成員函數(shù) balance+=amount; return balance; unsigned accountnumber; /數(shù)據(jù)成員 float balance; /結(jié)算額 ; /類的聲明時不分配內(nèi)存空間 void fn() Savings a,b; /對象 (對象和變量) Savings *pa= / .的前面是對象,-的前面是地址,成員函數(shù)的調(diào)用一定是和某個對象捆綁在一起,一個類的一般構(gòu)造: class class_name_identifier public: 公共數(shù)據(jù)成員聲明語句; 公共函數(shù)成員聲明語句; private: 私有數(shù)據(jù)成員聲明語句; 私有函數(shù)成員聲明語句; protected : 保護(hù)數(shù)據(jù)成員聲明語句; 保護(hù)函數(shù)成員聲明語句; ;,C+中類與結(jié)構(gòu)的區(qū)別 struct Savings public : /可省略 float deposit(float amount) balance+=amount; return balance; private: int accountnumber; float balance; ;,class Savings private: /可省略 int accountnumber; float balance; public : float deposit(float amount) balance+=amount; return balance; ;,C+中類與結(jié)構(gòu)的區(qū)別: 默認(rèn)情況下,class定義的成員是private的,而struct 定義的成員是public的。,2.對象的引用以及返回對象的函數(shù) class Student public: int age; char name9; float score; ; int main() void add(Student ,void add (Student ,3. 公有,int main() Student a; a.p(); a.q(); a.score=80; a.age=20; /錯誤 a.add(); /錯誤 a.r(5); a.r(int)(a.score); a.r(a.age); /錯誤 return 0; ,4.成員函數(shù),void p(int a) couta; int main() Student a; a.p(); p(a.q(); return 0; ,成員函數(shù)與普通函數(shù)的區(qū)別: 成員函數(shù)屬于類, 成員函數(shù)定義是類設(shè)計的一部分, 其作用域是類作用域. 而普通函數(shù)一般為全局函數(shù) 成員函數(shù)的操作主體是對象,使用時通過捆綁對象來行使其職責(zé), 而普通函數(shù)被調(diào)用時沒有操作主體,5. 重載成員函數(shù) class Student public: float grade()/ float grade(float newgpa)/ protected: /. ; class Slope public: float grade()/ protected: /. ; char grade(float value)/,void main() Student s; Slope t; s.grade(3.2); float v=s.grade(); char c=grade(v); float m=t.grade(); ,6.定義成員函數(shù) (1)在類的內(nèi)部定義成員函數(shù) #include using namespace std; class Tdate public: void set (int m,int d,int y) month=m;day=d;year=y; int isleapyear() return (year%4=0,int main() Tdate a; a.set(2,4,1998); a.print(); if (a.isleapyear() cout“is leapyear!“ else cout“is not leapyear!“; return 0;,Set 與month 全名 :作用域區(qū)分符、作用域運算符、名字空間引導(dǎo)符,例:用:表示全局變量和函數(shù) int month; int day; int year; void set (int month,int day,int year) :month=month; :day=day; :year=year; class Tdate public: void set (int m,int d,int y) :set(m,d,y); private: int month; int day; int year; ;,類內(nèi)部提供的成員函數(shù)定義默認(rèn)為內(nèi)聯(lián)函數(shù)。 類中定義的成員函數(shù)一般規(guī)模較小(1-5句) 不能使用結(jié)構(gòu)化語句 類定義一般在頭文件中,便于多個程序使用。,/例子 文件名Student.h class Student public: void p() age = 19; coutage; float score; protected: char name; int age; ;,a.cpp #include “Student.h” main() Student a; a.p(); b.cpp #include “Student.h” void hh() Student a; a.p(); /類定義和使用的分離,(2)在類之后定義成員函數(shù) class Tdate public: void set (int m,int d,int y); int isleapyear(); void print(); private: int month; int day; int year; ;,void Tdate:set (int m,int d,int y) month=m;day=d;year=y; int Tdate:isleapyear() return (year%4=0 void Tdate:print() cout month“/”day“/”yearendl:,類定義和成員函數(shù)定義的分離 /tdate.h(類的定義) class Tdate public: void set (int m,int d,int y); int isleapyear(); void print(); private: int month; int day; int year; :,/tdate.cpp(類的實現(xiàn)) #include using namespace std; #include “tdate.h” void Tdate:set (int m,int d,int y) month=m;day=d;year=y; int Tdate:isleapyear() return (year%4=0 void Tdate:print() cout month“/”day“/”yearendl:,/pmain.cpp #include “tdate.h” int main() Tdate a; a.set(2,4,1998); a.print();,從上圖中觀察可以得知: 1,整個源程序由3個單獨的文件構(gòu)成。 2,兩個.cpp文件分別編譯生成各自目標(biāo)文件。 3,兩個目標(biāo)文件和庫文件連接生成可執(zhí)行程序。,tdate.cpp #include #include “tdate.h“,tdate.h,Pmain.cpp #include “tdate.h“,tdate.obj,Pmain.obj,可執(zhí)行文件pmain.exe,編譯,編譯,連接,連接,注意: :用于c+提供的頭文件,一般存放在c+系統(tǒng)目錄中的include 子目錄下 “ ”:首先在當(dāng)前文件所在的目錄中進(jìn)行搜索,找不到,再按標(biāo)準(zhǔn)方式進(jìn)行搜索.,/成員函數(shù)的實現(xiàn)和類定義一起放在頭文件中 文件名Student.h class Student public: void p(void); float score; protected: char name; int age; ; void Student:p() coutage /直接放在了h文件中,文件名aa.cpp #include “student.h” void main() void f(); Student a; a.score=80; couta.score; a.p(); f(); 文件名bb.cpp #include “student.h“ void f() Student a; a.score=90; a.p(); /提示void Student:p()被重復(fù)定義,c+的名稱有 外部鏈接:函數(shù)定義,可以在其他文件中使用。不能重復(fù)定義。 內(nèi)部鏈接:只能在自己的程序中使用,可以跨文件重復(fù)定義。如:類型定義、全局常量、inline函數(shù)、模板定義等。,/頭文件在一個文件中多次被包含 文件名Student.h class Student public: void p() coutscore; float score; protected: char name; int age; ;,文件名ss.h #include “student.h“ class ss public: Student *a; float f; ; 文件名bb.cpp #include #include “student.h“ #include “ss.h“ void main() Student a; ss s; a.score=80; ss.f=50; /提示 Student類被重復(fù)定義,頭文件衛(wèi)士 文件名Student.h # ifndef STUDENT # define STUDENT class Student public: void p() coutscore; float score; protected: char name; int age; ; #endif /頭文件衛(wèi)士保證頭文件在一個程序文件中只被定義一次,文件名ss.h #include “student.h“ class ss public: Student *a; float f; ; 文件名bb.cpp #include #include “student.h“ #include “ss.h“ int main() Student a; ss s; a.score=80; ss.f=50; return 0; ,#ifndef _INC_IOSTREAM #define _INC_IOSTREAM,6.程序的文件機(jī)制,文件,文件,文件,頭文件的使用:使函數(shù)調(diào)用免于聲明,/ abc.h void f1 ( ); void f2 ( ); void f3 ( ); void g1 ( ); void g2 ( ); void p ( ); void h ( );,/ a1.cpp #include”abc.h” void f1() if() p(); g1(); else g2(); h(); ,/ a2.cpp #include”abc.h” int main() f1(); f2(); f3(); /- void f3() f1(); /- void p() f3(); /-,界面頭文件(上),/ a1.h a1.cpp提供的資源 void f1(); / a2.h a2.cpp提供的資源 void p(); / a3.h
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 消費者權(quán)益保護(hù)法的實施效果研究試題及答案
- 2025年企業(yè)戰(zhàn)略變革試題及答案
- 偽隨機(jī)數(shù)生成考試考題及答案
- 抖音雙十一活動策劃方案
- 2025年云計算應(yīng)用考試試題及答案
- 計算機(jī)技術(shù)員考試試題及答案概述
- 項目合同協(xié)議書
- 新疆出入境邊防檢查總站所屬事業(yè)單位2025年度公開招聘筆試和合格分?jǐn)?shù)線筆試歷年典型考題及考點剖析附帶答案詳解
- 公共關(guān)系技巧的訓(xùn)練計劃
- 行政法學(xué)的評估標(biāo)準(zhǔn)及試題及答案
- 林下經(jīng)濟(jì)產(chǎn)業(yè)項目可行性研究報告
- 《深入了解中信建投》課件
- 2025年全民營養(yǎng)周科學(xué)實現(xiàn)吃動平衡健康中國營養(yǎng)先行課件
- 鍵盤采購合同協(xié)議
- 銀泰證券公司融資融券業(yè)務(wù)方案設(shè)計
- 2025年高校教師崗前培訓(xùn)《高等教育學(xué)》考試模擬試卷及答案(共五套)
- 湖南省張家界市慈利縣實驗高中-奮進(jìn)關(guān)鍵期跨越分水嶺-高二下開學(xué)家長會【課件】
- 2025年湖北省建設(shè)投資集團(tuán)有限公司招聘筆試參考題庫含答案解析
- 2025年中國證券融資融券行業(yè)市場調(diào)查研究及投資前景預(yù)測報告
- 魚躍前滾翻單元計劃-2024-2025學(xué)年人教版體育與健康六年級上冊
- DB32∕T 525-2010 學(xué)生公寓用紡織品
評論
0/150
提交評論