C++對(duì)C的擴(kuò)充、_第1頁
C++對(duì)C的擴(kuò)充、_第2頁
C++對(duì)C的擴(kuò)充、_第3頁
C++對(duì)C的擴(kuò)充、_第4頁
C++對(duì)C的擴(kuò)充、_第5頁
已閱讀5頁,還剩67頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l課程簡(jiǎn)介(課程簡(jiǎn)介(OOP)l課程任務(wù)與要求課程任務(wù)與要求l推薦教材推薦教材l軟件開發(fā)流程與 IDE 簡(jiǎn)介lC 語言選擇性回顧l從 C 到 C+l最簡(jiǎn)單的 C+ 程序lC+ 對(duì) C 的擴(kuò)充C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l 先進(jìn)開發(fā)技術(shù),眾多流行開發(fā)系統(tǒng)采用先進(jìn)開發(fā)技術(shù),眾多流行開發(fā)系統(tǒng)采用VB & VBScript, VC+, Delphi, C+Builder,Java, JavaScript, PowerBuilder, ActionScript,., etc.l 面向過程程序設(shè)計(jì)的缺陷(例如面向過程程序設(shè)計(jì)的缺陷(例如C語言)語言)

2、模塊(函數(shù)或子程)的堆砌,就象由零件直接裝配整機(jī),零件很多,本身又不能獨(dú)立工作,零件彼此關(guān)聯(lián),協(xié)同工作,造成很多的問題,牽一發(fā)而動(dòng)全身,無法克服軟件危機(jī)。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l掌握 DOS 字符界面下的 OOPl掌握 Windows 圖形界面下的 OOP了解 Windows 消息驅(qū)動(dòng)機(jī)制了解 Windows DLL 與 API(高級(jí)技術(shù))掌握 VC+ 各種常用控件的使用l僅靠課堂學(xué)習(xí)和集中上機(jī)實(shí)驗(yàn)遠(yuǎn)遠(yuǎn)不夠!僅靠課堂學(xué)習(xí)和集中上機(jī)實(shí)驗(yàn)遠(yuǎn)遠(yuǎn)不夠! 只有充分利用課余時(shí)間,加強(qiáng)動(dòng)手實(shí)驗(yàn),只有充分利用課余時(shí)間,加強(qiáng)動(dòng)手實(shí)驗(yàn), 才能真正掌握本領(lǐng),學(xué)到技能。才能真正掌握本領(lǐng),學(xué)到技能。C+

3、 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l教材:教材: 譚浩強(qiáng). C+面向?qū)ο蟪绦蛟O(shè)計(jì). 清華大學(xué) 出版社, 2006.01 (規(guī)劃教材)C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念軟件開發(fā)流程.cpp 源程序,文本文件.obj 目標(biāo)程序,二進(jìn)制文件.exe 執(zhí)行程序,二進(jìn)制文件設(shè)計(jì)解決問題的算法步驟程序結(jié)構(gòu)設(shè)計(jì),數(shù)據(jù)結(jié)構(gòu)選擇語法錯(cuò)誤邏輯錯(cuò)誤設(shè)計(jì)各種測(cè)試數(shù)據(jù)學(xué)習(xí)掌握相關(guān)領(lǐng)域的知識(shí)C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念lIDE(集成開發(fā)環(huán)境) 簡(jiǎn)介大型開發(fā)系統(tǒng)都有自己的IDE.將源文件的編輯、編譯、連接、調(diào)試、運(yùn)行集成在一個(gè)工作環(huán)境內(nèi),方便軟件開發(fā)。集成開發(fā)環(huán)境具有強(qiáng)大的調(diào)試功能和工具,一定要掌握常用的調(diào)試

4、手段,盡可能提高 軟件開發(fā)效率。提供常用的編程控件供選用。提供強(qiáng)大的聯(lián)機(jī)幫助系統(tǒng),掌握其使用。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l字符內(nèi)碼(計(jì)算機(jī)內(nèi)部的存儲(chǔ)編碼)一切信息在計(jì)算機(jī)內(nèi)部均是以01串(位串/比特串)形式存儲(chǔ)。包括圖形、圖像、影視、文本.等等。按存儲(chǔ)格式,字符分為單字節(jié)和雙字節(jié)字符。ASCII 編碼:美國信息交換標(biāo)準(zhǔn)代碼。它用于存儲(chǔ):英文字母、數(shù)字、其他專用字符。用 8 位來存儲(chǔ),可存儲(chǔ) 28 = 256個(gè)單字節(jié)字符。漢字?jǐn)?shù)量眾多,GB2312-80兩級(jí)字庫共有6000多個(gè)漢字,新標(biāo)準(zhǔn)有上萬漢字。因此,用雙字節(jié)存儲(chǔ)。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念整型變量在軟件開發(fā)中用的很

5、多,它的表示范圍由編譯系統(tǒng)確定,并不斷的擴(kuò)大范圍。可用運(yùn)算符 sizeof(int) 測(cè)試其字節(jié)數(shù)。特別注意大整數(shù)的范圍是否越界。如18位身份證編號(hào)。sizeof(類型名) 或 sizeof(變量名) int x; coutsizeof(int); coutsizeof(x);整型比字符串表示更有優(yōu)勢(shì):因整數(shù)是一個(gè)數(shù)值,可參與各種數(shù)學(xué)運(yùn)算。常用整型:2字節(jié)、4字節(jié)、64位整型。整型分為帶符號(hào)和無符號(hào)整型。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念ltypedef 類型定義聲明自定義類型有:數(shù)組、枚舉、結(jié)構(gòu)、聯(lián)合、類等類型,它是基本類型的組合類型。typedef 給已有類型取一個(gè)別名,以提高程序可讀

6、性。如用短名字代替長(zhǎng)名字。 typedef double Area, Volume ; typedef int Natural ; Natural k , m ; Area s ; Volume v ;C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l枚舉常量:enum 關(guān)鍵字定義對(duì)僅有幾個(gè)有限取值的數(shù)據(jù)可考慮定義為枚舉。如:星期1星期日,星期8就是非法的,用枚舉便于檢查數(shù)據(jù)取值的合法性。枚舉元素一般用大寫表示。enum weekday SUN, MON, TUE, WED, THU, FRI, SAT ; 枚舉元素的默認(rèn)值:SUN為0, MON為1, ., SAT為6。 在聲明時(shí)可另外定義默認(rèn)值: e

7、num weekday SUN=7, MON=1, TUE, WED, THU, FRI, SAT ; 枚舉元素是常量,不能重新賦值,可參與運(yùn)算。 枚舉元素名為符號(hào)常量如SUN,程序中可直接使用。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l結(jié)構(gòu)體:struct 關(guān)鍵字定義將不同的數(shù)據(jù)類型結(jié)合在一起。如一個(gè)學(xué)生的信息:學(xué)號(hào),姓名,性別,身高等。struct student /結(jié)構(gòu)可嵌套定義 unsigned long ID ; char name20; bool sex ; float height ; stu= 20020011, ”黎明”, true, 1.80 ; student stu1,

8、stu2100, *p_stu; /結(jié)構(gòu)變量cout sizeof(student) ;cout stu.ID ;cout stu24.sex ;cout ID ;定義時(shí)結(jié)構(gòu)體時(shí)內(nèi)部不允許初始化C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l局部變量在語句塊內(nèi)、函數(shù)體內(nèi)定義的變量,只存在于定義它的語句塊或函數(shù)體內(nèi)。執(zhí)行到該范圍內(nèi)時(shí),變量才創(chuàng)建(分配內(nèi)存),離開該范圍后局部變量被自動(dòng)刪除。l全局變量在語句塊和函數(shù)體外面定義的變量,它存在于該源文件范圍內(nèi),即該源文件各處均可訪問。程序運(yùn)行完畢退出時(shí),才被刪除。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l外部變量:extern 關(guān)鍵字聲明較大型軟件往往由多個(gè)源文

9、件編譯連接而成,源文件 A.c 中定義的全局變量 x,另一源文件B.c 也要使用變量 x,在 B.cpp 中可用 extern聲明變量 x 為外部變量,告訴系統(tǒng):它是其他源文件中定義的變量。/ A.c / B.cint x=2; extern int x ;為了避免重復(fù)定義,通常在一個(gè)源文件中定義全部全局變量,其他源文件中用extern聲明。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念lstatic 關(guān)鍵字聲明變量聲明全局變量: static int x ; /x是全局變量 表示:該變量對(duì)其他源文件不可見。該變量對(duì)其他源文件不可見。避免在多文件 包含時(shí)產(chǎn)生變量重復(fù)定義的語法錯(cuò)誤。多個(gè)源文件 定義有同

10、名的全局變量(容易發(fā)生的事情)。聲明局部變量: int myfun(static int x=0) ; 編譯時(shí)就給x分配內(nèi)存,存在于程序的整個(gè)生存期: 程序運(yùn)行時(shí)就存在,程序退出時(shí)才被刪除。生存期 與全局變量相同,訪問限制與局部變量相同。全局 壽命,局部可用。只第一次進(jìn)入函數(shù)時(shí)被初始化。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l由多個(gè)源文件組成的 C 程序:程序結(jié)構(gòu):(三個(gè)部分組成) 函數(shù)聲明,函數(shù)實(shí)現(xiàn),主函數(shù)。單元文件:(可用#include包含) 較大規(guī)模程序往往由多個(gè)源文件組成,每個(gè) 源文件作為一個(gè)單獨(dú)編譯的單元,因此稱為 單元文件。對(duì)不同文件可單獨(dú)編寫、編譯, 最后連接。一個(gè)程序通常至少

11、分為3個(gè)文件 函數(shù)聲明(.h)、函數(shù)實(shí)現(xiàn)(.c)、主函數(shù)(.c)C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念 函數(shù)實(shí)現(xiàn)文件#include “fun.h”.fun.h 函數(shù)聲明文件#include .#include “fun.h”.work.objfun.objwork.exe編譯編譯連接如果修改了函數(shù)實(shí)現(xiàn),調(diào)用文件不用修改,不重新編譯C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l工程文件(項(xiàng)目文件)編譯系統(tǒng)對(duì)多文件的組織管理,用工程文件。最后生成的 exe 執(zhí)行文件與工程文件名相同。l內(nèi)置函數(shù)的特殊性對(duì)于多文件程序,內(nèi)置函數(shù)要求在每一個(gè)調(diào)用它的單元文件中都給出其實(shí)現(xiàn)。因此,較好的做法是:將內(nèi)置函數(shù)的實(shí)

12、現(xiàn)寫在頭文件中,供調(diào)用它的單元文件包含這個(gè)頭文件。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l某些程序段需滿足給定條件才參與編譯 形式 1 #if 條件 /條件:常量表達(dá)式 程序段 ; /條件成立,編譯本段程序 #endif 如果條件不成立,不編譯本段程序,最后的 EXE 文件中沒有本段程序的執(zhí)行代碼。 常用于調(diào)試程序,“程序段”為調(diào)試用語句, 發(fā)行版將 “條件” 改為假,去掉調(diào)試語句段。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念 形式 2#if 條件 /條件:常量表達(dá)式 程序段1 ; /條件成立,編譯程序段1#else 程序段2 ; /條件不成立,編譯程序段2#endif注意:編譯預(yù)處理命令(非語句

13、,前面有符號(hào)#)末尾都沒有分號(hào) “ ; ” 。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念 形式 3#ifdef 符號(hào) /符號(hào):由 #define 定義 程序段1 ; /符號(hào)已定義:編譯本段#else 程序段2 ; /符號(hào)未定義,編譯本段#endif同樣,如果沒有程序段2,#else 可省略。與形式1和形式2比較:把條件改為符號(hào)更簡(jiǎn)略,只需#define定義符號(hào),無需取值。如:#define debugC+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念 形式 4(與形式 3 相反)#ifndef 符號(hào) /符號(hào):由 #define 定義 程序段1 ; /符號(hào)未定義:編譯本段#else /#else 段可省略 程序

14、段2 ; /符號(hào)已定義,編譯本段#endif說明:由 #define 定義的符號(hào),可用 #undef 刪除。如: #define debug #undef debug /debug 并未定義C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念 “unit1.h”#include “unit2.h”int main()./unit1.h#include “head.h”./unit2.h#include “head.h”./head.hint x ; /全局變量.編譯出錯(cuò):head.h被包含兩次,導(dǎo)致變量x 被重復(fù)定義,語法錯(cuò)。/head.h 改寫頭文件#ifndef HEAD_H #define HEAD_

15、H int x ;#endif 四個(gè)文件組成的程序C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念lC語言是面向過程的lC+是面向?qū)ο蠛兔嫦蜻^程的混合型語言lC+由C發(fā)展而來,兼容C,是C的超級(jí)l面向過程與面向?qū)ο蟛⒎菍?duì)立面向?qū)ο蟪绦蛟O(shè)計(jì)中仍然要用到面向過程的 程序設(shè)計(jì)技術(shù)。例如,類成員函數(shù)的定義。對(duì)于簡(jiǎn)單問題,直接用面向過程方法就可以輕松解決。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念例:輸出一行字符例:輸出一行字符 This is a C+ program.#include /cout需要的頭文件using namespace std; /庫函數(shù)用命名空間stdint main() /某些操作系統(tǒng)要求主

16、函數(shù)返回int /輸出流對(duì)象cout,插入流操作符 cout “This is a C+ program.n”; return 0; /正常結(jié)束返回0程序運(yùn)行時(shí)輸出:/行注釋,/*.*/塊注釋This is a C+ program.系統(tǒng)頭文件用系統(tǒng)頭文件用存放于系統(tǒng)文件夾存放于系統(tǒng)文件夾用戶頭文件用用戶頭文件用“ ”存放于用戶文件夾存放于用戶文件夾C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念例:求例:求a和和b兩個(gè)數(shù)之和兩個(gè)數(shù)之和#include using namespace std;int main() int a, b, sum; /定義變量 cinab; /輸入流對(duì)象cin,流提取符 /多

17、個(gè)變量之間用空格分隔 sum = a+b; cout“a+b=”sumendl; /endl與n相同 return 0; cin 鍵盤輸入cout 屏幕輸出C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念#include using namespace std;int max(int, int); /函數(shù)聲明int main() int a, b, c; cinab; c=max(a, b); cout“max=”cy) z=x; else z=y; return z;如果聲明函數(shù)較多,則放入自編頭文件中C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念lC+為了與為了與C兼容,保留了兼容,保留了C的一些規(guī)定的一些

18、規(guī)定C包含頭文件時(shí),用.h為擴(kuò)展名如iostream.h, string.h,math.h等。C+包含頭文件時(shí)不帶擴(kuò)展名如 iostream, string, cmath。為兼容,兩者可并存。另外,C+允許頭文件擴(kuò)展名 為 .hpp C無命名空間,using namespace std 略。C不要求main函數(shù)返回int,可略或?yàn)関oid型, 相應(yīng)地 return 0 略去。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念lC+輸入輸出:輸入輸出:cin 與與 cout C+為方便用戶,除可用printf, scanf等函數(shù)進(jìn)行輸入輸出外,還提供cin和cout流對(duì)象。cout與一起使用,將后面數(shù)據(jù)輸出

19、到標(biāo)準(zhǔn)輸出設(shè)備(屏幕)上。cout=console output用“n”實(shí)現(xiàn)換行,或者用iostream.h中定義的符號(hào) endl(end of line)實(shí)現(xiàn)換行??捎枚鄠€(gè)實(shí)現(xiàn)多個(gè)數(shù)據(jù)項(xiàng)按從左向右從左向右順序輸出:coutabcendl;C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念每個(gè)輸出項(xiàng)要用一個(gè)符號(hào),不能多個(gè)項(xiàng)目共用一個(gè)如:couta, b, c ;(錯(cuò)誤)不指定輸出數(shù)據(jù)類型,系統(tǒng)按默認(rèn)格式輸出 float a=3.45; int b=5; char c=A; cout“a=”a“,”“b=”b“,” “c=”cendl; 輸出結(jié)果:a=3.45,b=5,c=A格式輸出在第七章講述格式輸出在第

20、七章講述C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念用iomanip.h定義的符號(hào)setw(n)設(shè)定輸出 數(shù)據(jù)項(xiàng)的寬度為n。如setw(5):為其后一個(gè)其后一個(gè)輸出項(xiàng)設(shè)定5個(gè)字符的輸出寬度。若該輸出項(xiàng)不足5列寬,則右邊對(duì)齊右邊對(duì)齊;若超過5列,則按實(shí)際寬度輸出。上例改為: cout“a=”setw(5)aendl “b=”setw(5)bendl “c=”setw(5)c共同使用,將鍵入數(shù)據(jù)輸入到后面一個(gè)數(shù)據(jù)項(xiàng)中??捎枚鄠€(gè)實(shí)現(xiàn)多個(gè)數(shù)據(jù)項(xiàng)按從左向右從左向右順序輸入:cinabc; 鍵入時(shí)用空格分隔各個(gè)輸入數(shù)據(jù)項(xiàng)。鍵入時(shí)用空格分隔各個(gè)輸入數(shù)據(jù)項(xiàng)。每個(gè)輸入項(xiàng)用一個(gè)符號(hào),不能夠多個(gè)項(xiàng)目共用一個(gè)如:cina,

21、 b, c ;(錯(cuò)誤)C+為輸入輸出流提供了詳細(xì)的格式控制,包括精度控制,進(jìn)制轉(zhuǎn)換等,詳見第七章。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念lC語言 #define(宏替換)命令#define PI 3.14159 /宏命令后面無分號(hào)編譯時(shí),將程序中 PI 替換為字符串字符串 3.14159不作類型檢查,即不檢查 PI 取值的合法性。int a=1, b=2;#define PI 3.14159#define R (a+b)cout PI*R*R endl;編譯時(shí)替換為:3.14159*(a+b)*(a+b)PI不是變量,無類型,不占內(nèi)存單元,不能用指針指向它。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄

22、念lC+ 用 const 定義常量取代 #defineconst float PI = 3.14159 ; 常量(常變量)具有變量性質(zhì),有數(shù)據(jù)類型,占有內(nèi)存單元,有內(nèi)存地址,可用指針指向。程序運(yùn)行時(shí),它的值不能被改變即不能對(duì)它重新賦值,否則編譯出錯(cuò),不能通過編譯。const 用法很廣,可與指針、對(duì)象、函數(shù)等結(jié)合,將在后面第三章講述。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念lC 語言函數(shù)聲明函數(shù)被調(diào)用前,必須進(jìn)行聲明。系統(tǒng)的庫函數(shù)在相應(yīng)的頭文件中聲明(用#include包含)。聲明規(guī)則,C 沒有強(qiáng)制規(guī)定沒有強(qiáng)制規(guī)定,以下均合法:int max(int x , int y) ; /函數(shù)原型(推薦)i

23、nt max() ; /省略函數(shù)參數(shù)max() ; /省略整型返回值類型和參數(shù)缺點(diǎn):除函數(shù)原型聲明外,其他聲明方式不便于編譯時(shí)作合法性檢查(參數(shù)類型和個(gè)數(shù))。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念lC+函數(shù)聲明規(guī)定:必須用函數(shù)原型進(jìn)行聲明。函數(shù)原型的兩種形式:int max(int x , int y) ; int max(int , int ) ; /省略參數(shù)名編譯時(shí)檢查:函數(shù)返回值類型、參數(shù)個(gè)數(shù)、參數(shù)類型。如果不能正確匹配,給出語法錯(cuò)誤,供程序員及早發(fā)現(xiàn)錯(cuò)誤所在。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l函數(shù)重載(Overloading)兩個(gè)以上函數(shù)的函數(shù)名相同函數(shù)名相同,參數(shù)個(gè)數(shù)或參數(shù)類型

24、必須不全相同函數(shù)重載。int add(int x , int y); /整型加法float add(float x , float y); /浮點(diǎn)加法long add(long x , long y); /長(zhǎng)整型加法l函數(shù)重載的意義用同一函數(shù)名完成不同數(shù)據(jù)的相同操作,不用記憶更多的函數(shù)名字。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念 例:一個(gè)函數(shù)求2個(gè)或3個(gè)整數(shù)的最大值#include using namespace std;int max(int , int , int);int max(int , int);int main() int a=7, b=-4, c=9; coutmax(a,b,

25、c)endl; coutmax(a,b)a) a=b; if (ca) a=c; return a; int max(int a, int b) if (ab) return a; else return b; C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念 函數(shù)重載實(shí)現(xiàn)了一個(gè)函數(shù)名多用,但對(duì)于 函數(shù)體完全相同函數(shù)體完全相同的重載函數(shù)仍需分別實(shí)現(xiàn) 例如:int max(int a, int b) float max(float c, float d) if (ab) return a; if (cd) return c; else return b; else return d; 改進(jìn)改進(jìn):用一個(gè)函數(shù)

26、實(shí)現(xiàn),簡(jiǎn)化編程,提高效率。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l函數(shù)模板的應(yīng)用場(chǎng)合凡是函數(shù)體相同的函數(shù),均可定義函數(shù)模板,不必定義多個(gè)函數(shù)。(參數(shù)個(gè)數(shù)相同)l函數(shù)模板的定義因函數(shù)體相同的函數(shù),其參數(shù)類型不同,因此用一個(gè)虛類型T定義。調(diào)用函數(shù)時(shí),系統(tǒng)根據(jù)實(shí)參類型來取代函數(shù)模板中的虛類型。上例: template T max(T a, T b) ;其中, typename也可用class,兩者等價(jià)。根據(jù)需要根據(jù)需要,T 可定義若干個(gè)可定義若干個(gè)template C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念#include using namespace std;template T max(T a,

27、T b);int main() float c=5.2, d=8.5, m; m=max(c, d); coutm; return 0; template T max(T a, T b) if (ab) return a; else return b;函數(shù)調(diào)用時(shí),編譯器根據(jù)實(shí)參類型,確定T的類型。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l參數(shù)傳遞:實(shí)參形參。帶默認(rèn)值形參, 調(diào)用時(shí)可不給出實(shí)參,而使用默認(rèn)值。函數(shù)聲明: float area(float r = 6.5); 函數(shù)調(diào)用1:area(); /等價(jià)于area(6.5);函數(shù)調(diào)用2:area(7.5); /取代默認(rèn)值l帶多個(gè)默認(rèn)值形參的規(guī)則

28、:void F1(int a, int b=0, int c, int d=2); /錯(cuò)誤void F2(int a, int c, int b=0, int d=2); /正確規(guī)則:帶默認(rèn)值形參必須從右邊開始連續(xù)放。規(guī)則:帶默認(rèn)值形參必須從右邊開始連續(xù)放。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l帶默認(rèn)值形參的語法規(guī)則:函數(shù)聲明時(shí)給出形參默認(rèn)值函數(shù)聲明時(shí)給出形參默認(rèn)值,函數(shù)定義時(shí)可不給出。如果兩處都給了,以先給的為準(zhǔn)。某些編譯器不允許重復(fù)給出,認(rèn)為語法錯(cuò)。 編譯過程從上向下逐行編譯,調(diào)用時(shí)遇到缺省參數(shù) 形參,認(rèn)為實(shí)參與形參個(gè)數(shù)不匹配而報(bào)錯(cuò)。帶默認(rèn)值形參的函數(shù)重載時(shí),容易出錯(cuò)帶默認(rèn)值形參的函數(shù)重

29、載時(shí),容易出錯(cuò) 因?yàn)檎{(diào)用重載函數(shù)時(shí),根據(jù)參數(shù)類型或個(gè)數(shù)信息來決定調(diào)用哪個(gè)重載函數(shù)。若參數(shù)缺省,系統(tǒng)不知道調(diào)用哪個(gè)重載函數(shù),產(chǎn)生二義性。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l引用(Reference)的概念變量的引用又稱為變量的別名(alias)。 int a ; int &b = a ; / b 是 a 的引用(別名)b 與 a 是同一個(gè)變量,使用同一內(nèi)存單元。引用不是一個(gè)獨(dú)立變量。內(nèi)存單元ab變量與引用內(nèi)存單元a內(nèi)存單元c獨(dú)立變量C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念聲明引用時(shí),必須指定它代表哪個(gè)變量: int &b = a ; /正確,指定 b 代表 a 變量 int &

30、amp;b ; /錯(cuò)誤,沒指定代表的變量 float a , int &b = a; /錯(cuò)誤,類型不匹配聲明一個(gè)引用后,它一直與代表變量聯(lián)系,在其作用域內(nèi),不能中途更換它所代表的 變量,例如: int &b = a ; int &b = c ; /錯(cuò)誤,又代表另一個(gè)變量C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念引用的引用:一個(gè)變量,多個(gè)別名 int a = 3 ; /定義 a 是整型變量并初始化 int& b = a ; /聲明 b 是 a 的別名 int& c = b ; /聲明 c 是引用 b 的別名 int& d = a ; /聲明 d 是 a

31、 的別名3一個(gè)整型內(nèi)存單元abcd整型變量所占內(nèi)存的字節(jié)數(shù):cout sizeof(int) ;由編譯系統(tǒng)定義。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念引用符&與取地址操作符&的區(qū)分: int a = 3 ; /定義一個(gè)整型變量并初始化 int &b = a ; /&前有類型符(int),是引用 int *c = &a ; /&前無類型符,是取地址符 int *d ; /定義一個(gè)整型指針 d = &a ; /指向變量a,&是取地址符實(shí)際編程時(shí),幾乎不直接使用變量別名,而使用它的原名如a,那么引用究竟有何作用?回答:C+用它擴(kuò)充函數(shù)的

32、參數(shù)傳遞。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l變量名作為實(shí)參:?jiǎn)蜗蛑祩鬟f(實(shí)參形參)例:例:#include using namespace std ;void swap(int a , int b) int temp ; temp = a ; a = b ; b = temp ;int main() int i = 3 ; j = 5 ; swap(i, j) ; cout i “,” j ; return 0 ; 該程序不能實(shí)現(xiàn)實(shí)參值交該程序不能實(shí)現(xiàn)實(shí)參值交換換ijab實(shí)參形參形參與實(shí)參在不同的內(nèi)存單元,形參變化,不影響實(shí)參C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l傳遞變量的指針:雙向地

33、址傳遞 實(shí)參 形參例:例:#include using namespace std ;void swap(int *a , int *b) int temp ; temp = *a ; *a = *b ; *b = temp ;int main() int i = 3 ; j = 5 ; swap(&i , &j) ; cout i “,” j ; return 0 ; abij實(shí)參形參形參與實(shí)參的內(nèi)存單元相同該程序?qū)崿F(xiàn):實(shí)參值交換該程序?qū)崿F(xiàn):實(shí)參值交換C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l傳遞變量的別名:雙向引用傳遞例:例:#include using namespace

34、std ;void swap(int& a , int& b) int temp ; temp = a ; a = b ; b = temp ;int main() int i = 3 ; j = 5 ; swap(i, j) ; cout i “,” j ; return 0 ; 引用傳遞比地址傳遞的優(yōu)點(diǎn):1. 不定義指針變量,不涉及指針運(yùn)算;2. 引用比指針更為直觀、簡(jiǎn)便。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l不能聲明數(shù)組的引用int a4 = 1, 2, 3, 4 ;int& b = a ; / 錯(cuò)誤l可以聲明指針變量的引用,指針的別名int a = 5 ;in

35、t *p = &a ; / p是指向整型變量a的指針int * &b = p ; / b是指針p的引用,也是指針cout *b ;C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l可將引用的地址賦給指針,指向原變量int a = 3 ;int& b = a ; / b是a的別名,無自己的地址int *p = &b ; / 取b地址賦予指針p,p指向al常引用:const 限定引用值不能被修改int a = 3 ;const int &b = a ;a = 7 ; / a 可以改變b = 5 ; / 錯(cuò)誤,b 不允許改變C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l可用常

36、量或表達(dá)式對(duì)引用初始化,但必須加上 const 關(guān)鍵字:int a = 5 ;const int& b=a+3 ; / const限定b不可改變編譯器處理為:(生成一個(gè)臨時(shí)變量temp)int temp = a+3 ;const int& b=temp;同理,可用不同類型的變量初始化引用:double d=3.1415; int temp=d; /類型轉(zhuǎn)換const int& c = d ; const int& c=temp;C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l定義內(nèi)置函數(shù) (inline function)又稱為內(nèi)聯(lián)函數(shù)、內(nèi)嵌函數(shù)。定義內(nèi)聯(lián)函數(shù)很簡(jiǎn)單,在

37、函數(shù)定義前面加上 inline 即可。#include using namespace std ;inline int max(int a, int b) if (ba) return b ; else return a ;int main() int i=5, k=8, n; n = max(i, k); cout n ;C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l內(nèi)置函數(shù)是如何工作的非內(nèi)置函數(shù)的調(diào)用過程 保存調(diào)用處的現(xiàn)場(chǎng)(下一條指令地址,各個(gè)寄存器狀態(tài)等),實(shí)參進(jìn)棧,實(shí)參與形參相結(jié)合完成參數(shù)傳遞,進(jìn)入被調(diào)用函數(shù)體執(zhí)行,執(zhí)行完畢后,返回調(diào)用處。內(nèi)置函數(shù)在形式上是函數(shù)(定義和調(diào)用),編譯時(shí)將函數(shù)體

38、嵌入調(diào)用處,不產(chǎn)生函數(shù)調(diào)用,節(jié)約了時(shí)空開銷,提高了執(zhí)行效率。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l內(nèi)置函數(shù)的使用場(chǎng)合和語法規(guī)則需要頻繁調(diào)用、功能簡(jiǎn)單、規(guī)模較小的函數(shù)可定義為內(nèi)置函數(shù),以提高其執(zhí)行效率。inline只是一個(gè)請(qǐng)求,編譯器不保證將其編譯為內(nèi)置函數(shù),若編譯器認(rèn)為該函數(shù)過于復(fù)雜,仍將其編譯為普通函數(shù)(非內(nèi)置)。內(nèi)置函數(shù)體內(nèi)不能有循環(huán)語句和switch語句。內(nèi)置函數(shù)的定義必須出現(xiàn)在內(nèi)置函數(shù)第一次被調(diào)用之前。因?yàn)榫幾g是從上向下進(jìn)行的,否則,找不到內(nèi)置函數(shù)的已編譯代碼。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念lC語言的宏函數(shù):(很常見,包括一些系統(tǒng)函數(shù))形式上象函數(shù)的宏替換,而非函數(shù)。#inc

39、lude using namespace std ;#define myPower(x) x*x /形式上象函數(shù)int main() coutmyPower(2)“,” ; /結(jié)果:4 coutmyPower(1+1) ; /結(jié)果:3 錯(cuò)原因:myPower(1+1) 1+1*1+1=3改正:#define myPower(x) (x)*(x)C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l內(nèi)置函數(shù)與宏函數(shù)的比較:宏函數(shù)只是簡(jiǎn)單替換,不作“參數(shù)”的運(yùn)算和類型檢查,程序容易出現(xiàn)邏輯錯(cuò)誤。內(nèi)置函數(shù)避免了宏函數(shù)的問題,推薦采用。內(nèi)置函數(shù)提高了程序的執(zhí)行效率,但增加了程序目標(biāo)代碼的長(zhǎng)度。 比如:某個(gè)內(nèi)置函數(shù)需

40、要調(diào)用10次,編譯時(shí) 將該函數(shù)的代碼復(fù)制插入到每一個(gè)調(diào)用處, 為此,增加了目標(biāo)代碼長(zhǎng)度。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l作用域符號(hào): 域名:域成員名(變量或函數(shù))全局變量與局部變量同名:#include /using namespace std ; /cout定義在std域float a=13.5 ;int main() int a=5; /局部屏蔽全局 std:cout a endl ; /輸出局部變量a 13.5 std:cout :a ; /輸出全局變量a 5 return 0 ; /:前域名省略表示全局C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念lC 僅有字符char類型,無字符串類

41、型為此,只能定義字符數(shù)組來存放字符串,使用系統(tǒng)提供的字符處理函數(shù)來處理字符串,如:strcpy(復(fù)制),strcat(連接),strcmp(比較),strlen(長(zhǎng)度)等,它們的完整使用查聯(lián)機(jī)幫助。字符串操作,是軟件開發(fā)中最為常用的技術(shù),需很好地、全面地掌握它們的各種使用方法。使用上述函數(shù)需 #include ,聯(lián)機(jī)幫助說明了每個(gè)函數(shù)需要包含的頭文件。C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念lC+ 增加 string 類類型處理字符串:使用 string 時(shí)需 #include 定義字符串變量:(實(shí)質(zhì)上是對(duì)象) string str1 ; string str2 = “china” ; /定義同

42、時(shí)初始化對(duì)字符串變量賦值: string str1, str2; char str310; str1= “China” ; /對(duì),且不用指明長(zhǎng)度 str3= “China” ; /錯(cuò),數(shù)組不能這樣賦值C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念str2 = “Hi” ;str2 = str1 ; /兩個(gè)字符串相互賦值,即使str2 /原來長(zhǎng)度為2也無妨,因?yàn)殚L(zhǎng)度 /隨字符串長(zhǎng)度的改變而改變。str23=0 ; /操作單個(gè)字符:ChinaChi / 0 是字符串結(jié)束標(biāo)志cout str2 ; /輸出字符串cout str2 ; /鍵入字符串C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l字符串變量的運(yùn)算:復(fù)制

43、:賦值實(shí)現(xiàn)(=) strcpy(.) str2 = str1; /等價(jià):strcpy(str2, str1);連接:加法實(shí)現(xiàn)(+) strcat(.) string str1 = “C+ ”, str2 = “Language” ; str1 = str1 + str2 ; /輸出:C+ Language比較:關(guān)系運(yùn)算符實(shí)現(xiàn) strcmp(.) = = = 其他:成員函數(shù)或成員變量實(shí)現(xiàn)C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念#include #include using namespace std ;string name3 ; /定義個(gè)字符串?dāng)?shù)組,未初始化string name3 = “Zhang”, “Li”, “Zhao” ;cout sizeof(string) endl ; /4 bytescout sizeof(name) ; /3*4=12cout name2 ; name2name1name0首地址首地址首地址ZhaoLiZhang字符串?dāng)?shù)組的內(nèi)存格式C+ 面向?qū)ο蟪绦蛟O(shè)計(jì)西華大學(xué) 黃襄念l內(nèi)存的動(dòng)態(tài)分配與釋放程序需要時(shí)分配一定大小的內(nèi)存塊供使用,使用完畢后釋放已經(jīng)分配的內(nèi)存塊,以節(jié)省程序運(yùn)行所需的內(nèi)存大小。(好的風(fēng)格)程序運(yùn)行時(shí)才能確定數(shù)組的元素個(gè)數(shù),如果預(yù)先固定分配,其大小難以掌握。C 語言用 mal

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論