




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
會(huì)計(jì)學(xué)1CNET程序設(shè)計(jì)上實(shí)用學(xué)習(xí)體會(huì)學(xué)習(xí)C++編程技術(shù),必須了解和掌握C++制訂的各種規(guī)則,然后應(yīng)用這些規(guī)則寫程序,也就容易了。這與學(xué)習(xí)開車,首先要學(xué)習(xí)交通規(guī)則,然后才能驅(qū)車上路的道理相同。但與Basic和C等語言相比,C++的規(guī)則確實(shí)多出許多,掌握它必須付出努力!然而一旦掌握了這些規(guī)則,對(duì)于學(xué)習(xí)掌握面向?qū)ο缶幊碳夹g(shù),乃至于學(xué)習(xí)JAVA,C#及VB.net之類的編程語言,也就容易多了。千里之行,始于足下!第1頁/共299頁參考書《C++程序設(shè)計(jì)教程》--清華大學(xué)出版社,錢能《C++Primer中文版》--中國(guó)電力出版社,StanleyB.Lippman著,潘愛民,張麗譯《C++程序設(shè)計(jì)語》--機(jī)械工業(yè)版社,BjarneStroustrup著,裘宗燕譯《VC++與面向?qū)ο蟪绦蛟O(shè)計(jì)教程》—高教出版社,劉路放《VC++面向?qū)ο笈c可視化程序設(shè)計(jì)》--清華出版社,黃維通《深入淺出MFC》華中科技大學(xué)出版社,侯俊杰第2頁/共299頁第1章C++.NET面向?qū)ο蟪绦蛟O(shè)計(jì)概述
第2章數(shù)據(jù)輸入與輸出
第3章C++基礎(chǔ)
第4章類與對(duì)象第3頁/共299頁第1章C++.NET面向?qū)ο蟪绦蛟O(shè)計(jì)概述本章主要講述:程序語言的發(fā)展面向過程程序設(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)C++與面向?qū)ο蟪绦蛟O(shè)計(jì)VC++.Net第4頁/共299頁1.1 程序設(shè)計(jì)語言的發(fā)展
本節(jié)主要介紹計(jì)算機(jī)語言的發(fā)展過程:機(jī)器語言→匯編語言→高級(jí)語言→面向?qū)ο蟪绦蛟O(shè)計(jì)語言第5頁/共299頁1.1.1機(jī)器語言
指令就是指計(jì)算機(jī)能夠識(shí)別的命令,它們是一些由0和1組合成的二進(jìn)制編碼。指令系統(tǒng)計(jì)算機(jī)硬件系統(tǒng)能夠識(shí)別的所有指令的集合。機(jī)器語言最早的程序設(shè)計(jì)語言,它由計(jì)算機(jī)能夠識(shí)別的二進(jìn)制指令系統(tǒng)構(gòu)成。第6頁/共299頁1.1.2匯編語言
1、匯編語言用一些便于記憶的符號(hào)代替機(jī)器語言中的二進(jìn)制指令代碼,就將二進(jìn)制的機(jī)器語言轉(zhuǎn)換成了一種便于記憶的符號(hào)語言,這就是匯編語言。
2、與機(jī)器語言的比較匯編語言編程比機(jī)器語言簡(jiǎn)單。同機(jī)器語言一樣,它仍然是與機(jī)器相關(guān)的。不同機(jī)器系統(tǒng)的匯編語言并不相同,要在不同硬件系統(tǒng)(其指令系統(tǒng)不同)的計(jì)算機(jī)上完成相同的任務(wù),需要編寫不同的匯編程序。
第7頁/共299頁1.1.3高級(jí)語言
1.高級(jí)語言的概念及特征高級(jí)語言屏蔽了與機(jī)器硬件相關(guān)的細(xì)節(jié),采用具有一定含義的命名符號(hào)和容易理解的程序語句進(jìn)行程序設(shè)計(jì),不僅大大降低了程序設(shè)計(jì)的難度,而且也使程序易被人們理解。
高級(jí)語言程序的通用性和可移植性更高與人們自然思維很接近,編程更容易、簡(jiǎn)單第8頁/共299頁1.2面向過程的程序設(shè)計(jì) 1、面向過程的程序設(shè)計(jì)主要采用結(jié)構(gòu)化程序設(shè)計(jì)語言編程,因此也常稱為結(jié)構(gòu)化程序設(shè)計(jì)2、結(jié)構(gòu)化程序設(shè)計(jì)的基本內(nèi)容結(jié)構(gòu)的類型順利、分支、循環(huán)結(jié)構(gòu)化程序設(shè)計(jì)思想利用過程或函數(shù)來抽象和模擬客觀現(xiàn)實(shí)。第9頁/共299頁1.2面向過程的程序設(shè)計(jì)2、結(jié)構(gòu)化程序設(shè)計(jì)方法重點(diǎn)放在如何實(shí)現(xiàn)細(xì)節(jié)過程方面,將數(shù)據(jù)與函數(shù)分開。形式:主模塊+若干個(gè)子模塊
(如C:main()+子函數(shù))。特點(diǎn):
自頂向下,逐步求精——功能分解。缺點(diǎn):效率低,是手工作坊式的編程。第10頁/共299頁1.2面向過程的程序設(shè)計(jì)全局變量局部變量函數(shù)A局部變量函數(shù)B只有函數(shù)A才能訪問只有函數(shù)B才能訪問可被任何函數(shù)訪問全局變量3、結(jié)構(gòu)化程序的問題——數(shù)據(jù)也算法分離,程序數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)是分離的。第11頁/共299頁1.2面向過程的程序設(shè)計(jì)structPerson{ charname[10]; charaddr[20]; charphone[11];}Personp[100]; intn=0;
voidInputData(){} voidSearchAddr(char*name){……} voidSearchPhone(char*name){……} voidPrintData(){……}Voidmain(){ …… //調(diào)用前面編寫的函數(shù),完成通信錄數(shù)據(jù)處理
……} 4、結(jié)構(gòu)化程序的案例——個(gè)人通信錄程序定義數(shù)據(jù)結(jié)構(gòu)定義全局?jǐn)?shù)據(jù)定義操作數(shù)據(jù)的函數(shù)主函數(shù)控制程序流程第12頁/共299頁1.2面向過程的程序設(shè)計(jì)大型程序中,有很多全局?jǐn)?shù)據(jù)和全局函數(shù),這導(dǎo)致了函數(shù)和數(shù)據(jù)之間數(shù)目巨大的潛在連接!若全局?jǐn)?shù)據(jù)有所改動(dòng),可能會(huì)導(dǎo)致所有訪問這個(gè)數(shù)據(jù)若的全部函數(shù)的重寫.全局?jǐn)?shù)據(jù)全局?jǐn)?shù)據(jù)全局?jǐn)?shù)據(jù)函數(shù)函數(shù)函數(shù)函數(shù)5、結(jié)構(gòu)化程序設(shè)計(jì)范型第13頁/共299頁1.3面向?qū)ο蟪绦蛟O(shè)計(jì)1、面向?qū)ο蟪绦蛟O(shè)計(jì)觀點(diǎn)自然界是由各種各樣的實(shí)體(對(duì)象)所組成,每種對(duì)象都有自己的內(nèi)部狀態(tài)和運(yùn)動(dòng)規(guī)律,不同對(duì)象之間的相互聯(lián)系和相互作用就構(gòu)成了各種不同的系統(tǒng),進(jìn)而構(gòu)成整個(gè)客觀世界.2、程序設(shè)計(jì)方法:使用面向?qū)ο蟮挠^點(diǎn)來描述模仿并處理現(xiàn)實(shí)問題。要求:高度概括、分類和抽象。3、目的:實(shí)現(xiàn)軟件設(shè)計(jì)的產(chǎn)業(yè)化。第14頁/共299頁1.3面向?qū)ο蟪绦蛟O(shè)計(jì)4、基本概念對(duì)象客觀存在的實(shí)體稱為對(duì)象屬性描述對(duì)象的特征的數(shù)據(jù)行為對(duì)象自身的行為,對(duì)現(xiàn)實(shí)世界某些信息的應(yīng).對(duì)象之間通過傳遞消息相互影響屬性行為對(duì)象由屬性和行為構(gòu)成第15頁/共299頁1.3面向?qū)ο蟪绦蛟O(shè)計(jì)structPerson{ private:charname[10];charaddr[20];charphone[11];public:voidInitData(){……}voidSearchAddr(char*name){……}; voidSearchPhone(char*name){……}; };5、通信錄程序在C++中的類代碼形式在++中,struct的功能被擴(kuò)展了,在struct中不僅可以定義數(shù)據(jù),還可以定義函數(shù)。數(shù)據(jù)與函數(shù)構(gòu)成了一個(gè)整體。其中的private和public是訪問權(quán)限。第16頁/共299頁1.3面向?qū)ο蟪绦蛟O(shè)計(jì)將客觀事物的屬性和行為抽象成數(shù)據(jù)和操作數(shù)據(jù)的函數(shù),并把它們組合成一個(gè)不可分割的整體(即對(duì)象)的方法能夠?qū)崿F(xiàn)對(duì)客觀世界的真實(shí)模擬,反映出世界的本來面目。從客觀世界中抽象出一個(gè)個(gè)對(duì)象,對(duì)象之間能夠傳遞消息
.?dāng)?shù)據(jù)成員函數(shù)成員函數(shù)數(shù)據(jù)成員函數(shù)成員函數(shù)數(shù)據(jù)成員函數(shù)成員函數(shù)對(duì)象1對(duì)象2對(duì)象3消息消息消息6、面向?qū)ο蠓缎偷?7頁/共299頁1.4面向?qū)ο蟮某绦蛟O(shè)計(jì)語言本節(jié)主要介紹類與對(duì)象的基本概念,以及面向?qū)ο蟪绦蛟O(shè)計(jì)的主要特征
第18頁/共299頁1.4.1類與對(duì)象1.對(duì)象的基本概念對(duì)象:用來描述客觀事物的一個(gè)實(shí)體,它是構(gòu)成系統(tǒng)的一個(gè)基本單元。一個(gè)對(duì)象具有一組屬性和行為。實(shí)體對(duì)象一臺(tái)計(jì)算機(jī)抽象對(duì)象一項(xiàng)計(jì)劃對(duì)象構(gòu)成要素:1.對(duì)象標(biāo)識(shí)符:是對(duì)象的名稱,用來區(qū)別與其他對(duì)象。2.屬性:是用來描述對(duì)象靜態(tài)特征的一個(gè)數(shù)據(jù)項(xiàng)。3.行為:是用來描述對(duì)象動(dòng)態(tài)特征和行為的一個(gè)操作。
第19頁/共299頁對(duì)象示例1:一個(gè)“學(xué)生”對(duì)象的例子對(duì)象名:學(xué)生對(duì)象的屬性:學(xué)號(hào):123456姓名:令狐沖年齡:18專業(yè):信管行為修改學(xué)號(hào)、姓名、專業(yè)、年齡等等1.4.1類與對(duì)象第20頁/共299頁對(duì)象示例2:一個(gè)“課程”對(duì)象的例子:對(duì)象名:課程對(duì)象的屬性:課程號(hào):123456課程名:程序設(shè)計(jì)任課教師:莫名選課要求:學(xué)時(shí):48行為獲取并修改課程名、課程號(hào)、學(xué)時(shí)數(shù)、選課要求、任課教師等1.4.1類與對(duì)象第21頁/共299頁2.類的基本概念類:是具有相同屬性和行為的一組對(duì)象的集合,它為屬于該類的全部對(duì)象提供統(tǒng)一的的抽象描述類和對(duì)象的關(guān)系:類對(duì)象 抽象定義實(shí)例類對(duì)象舉例學(xué)生學(xué)生王強(qiáng)課程C++程序設(shè)計(jì)類型變量,如
C語言中的int和intx;類的實(shí)例——用類定義的類變量,即對(duì)象。類是對(duì)多個(gè)特性相同的對(duì)象實(shí)例的抽象,所以同一類的不同實(shí)例之間必有:相同的操作集合相同的屬性集合不同的對(duì)象名,分配有不同的存儲(chǔ)空間。1.4.1類與對(duì)象第22頁/共299頁1.4.1類與對(duì)象3、類的描述類的描述——不同的OOP語言用不同的描述形式。在C++中用關(guān)鍵字class來定義描述一個(gè)類。classclassname{ public: //publicmembers //friendfunctionprototypes private: //privatemembers};第23頁/共299頁1.4.2抽象與封裝1、抽象抽象(abstract)是指有意忽略問題的某些細(xì)節(jié)和與當(dāng)前目標(biāo)無關(guān)的方面,以便把問題的本質(zhì)表達(dá)得更清楚。
案例:VCD機(jī)器的抽象第24頁/共299頁1.4.2抽象與封裝2、封裝性封裝encapsulation——將數(shù)據(jù)和與這個(gè)數(shù)據(jù)有關(guān)的操作集合在一起,形成一個(gè)實(shí)體——對(duì)象,且盡可能隱藏對(duì)象的內(nèi)部細(xì)節(jié).特點(diǎn):具有一個(gè)清楚的邊界,對(duì)象的所有私有數(shù)據(jù)、內(nèi)部程序(成員函數(shù))細(xì)節(jié)都被固定在這個(gè)邊界內(nèi)。具有一個(gè)接口,描述了對(duì)象之間的相互作用、請(qǐng)求和響應(yīng)——消息對(duì)象內(nèi)部的實(shí)現(xiàn)代碼受到封裝殼的保護(hù),其它對(duì)象不能直接修改本對(duì)象所擁有的數(shù)據(jù)和代碼。封裝的單位是對(duì)象。第25頁/共299頁2、封裝性從外面看只能看到對(duì)象的外部特性,即能夠受理哪些信息,具有哪些處理能力;對(duì)象的內(nèi)部,即處理能力的實(shí)行和內(nèi)部狀態(tài),對(duì)外是不可見的。從外面不能直接使用對(duì)象的處理能力,也不能直接修改其內(nèi)部狀態(tài),對(duì)象的內(nèi)部狀態(tài)只能由其自身改變。封裝的優(yōu)點(diǎn):1.降低部件間的耦合度,提高部件的獨(dú)立性2.具有隱藏性和安全性(如銀行的帳戶)3.易于維護(hù)(由于數(shù)據(jù)獨(dú)立,易于發(fā)現(xiàn)問題)4.封裝將對(duì)象的使用者與設(shè)計(jì)者分開,使用者只需要通過接口訪問對(duì)象,不必須了解對(duì)象的內(nèi)部細(xì)節(jié).提高了軟件復(fù)用.封裝的缺點(diǎn):需要更多的輸入輸出函數(shù)。1.4.2抽象與封裝第26頁/共299頁3、封裝的形式classclassname{ public:
//publicmembers //friendfunction private:
//privatemembers};Public成員1Public成員2Public成員nPrivate一個(gè)Class定義了一種抽象的數(shù)據(jù)類型,用戶只能訪問Public成員,不能直接訪問Private成員直接訪問private是禁止的邊界第27頁/共299頁1.4.2抽象與封裝4、抽象與封裝形成了程序接口與實(shí)現(xiàn)的分離第28頁/共299頁1、繼承的基本概念古語:龍生龍,鳳生鳳,老鼠生兒會(huì)打洞繼承:對(duì)象類之間的相交關(guān)系,使得某類對(duì)象可以繼承另外一類對(duì)象的特征和功能類間具有繼承關(guān)系的特性:類間具有共享特征(包括數(shù)據(jù)和程序代碼的共享):遺傳類間具有細(xì)微差別或新增部分(包括非共享的程序代碼和數(shù)據(jù)):變異類間具有層次結(jié)構(gòu)(同人類通過繼承構(gòu)成了家簇關(guān)系一樣)1.4.3繼承第29頁/共299頁2、繼承分類從繼承源上劃分:?jiǎn)卫^承(一個(gè)派生類只有一個(gè)基類)、多繼承(一個(gè)派生類有多個(gè)基類)從繼承內(nèi)容上劃分:取代繼承、包含繼承、受限繼承、特化繼承。3、繼承的作用:實(shí)現(xiàn)軟件的可重用性實(shí)現(xiàn)軟件的獨(dú)立性增加軟件的可維護(hù)性1.4.3繼承第30頁/共299頁4、繼承的層次結(jié)構(gòu)思考:B和C具有哪些成員?ABECDa:intgetA():intc:intgetC():intsetB():voidb:intgetB():intsetB():voidinheritance(“is-a”relation)e:intgetE():intsetB():voidd:intgetD():int1.4.3繼承第31頁/共299頁5、繼承的優(yōu)勢(shì)能清晰體現(xiàn)相關(guān)類間的層次結(jié)構(gòu)關(guān)系。有效地址提高了程序的可重用性,減小了程序代碼的冗余度。增強(qiáng)了程序的一致性,減少了程序模塊間的接口和界面,使程序更易維護(hù)。繼承是自動(dòng)傳播程序代碼的有力工具。繼承是新類構(gòu)造、建立和擴(kuò)充的有效手段。繼承具有傳遞性 如果類C繼承類B,類B繼承類A,則類C繼承類A“站在巨人的肩頭上”。用戶在開發(fā)新系統(tǒng)時(shí)不必從零開始,可以繼承原有相似功能或者從類庫中選取需要的類,再派生新類。1.2.3繼承第32頁/共299頁1、多態(tài)polymorphism對(duì)象根據(jù)所接受的消息而做出動(dòng)作,同樣的消息為不同的對(duì)象接受時(shí)可導(dǎo)致完全不同的行動(dòng),該現(xiàn)象稱為多態(tài)性。簡(jiǎn)單的說:?jiǎn)谓涌?,多?shí)現(xiàn)舉例:
sqrt_i(inti),sqrt_f(floatf)
sqrt(inti),sqrt(floatf)作用:減輕程序員負(fù)擔(dān)降低程序員出錯(cuò)機(jī)率1.4.4
多態(tài)第33頁/共299頁2、多態(tài)性的實(shí)現(xiàn)運(yùn)行時(shí)多態(tài)性:虛函數(shù)編譯時(shí)多態(tài)性:重載重載函數(shù)重載:是指在同一作用域內(nèi)的若干個(gè)參數(shù)特征不同的函數(shù)可以使用相同的函數(shù)名字。運(yùn)算符重載:是指同一個(gè)運(yùn)算符可以施加于不同類型的操作數(shù)上面。優(yōu)點(diǎn):重載進(jìn)一步提高了面向?qū)ο笙到y(tǒng)的靈活性和可讀性1.4.4
多態(tài)第34頁/共299頁3、多態(tài)的一個(gè)案例圖中同名函數(shù)area()作用在Circle、Triangle等不同類上時(shí),將執(zhí)行不同的操作,這就是多態(tài)。1.4.4
多態(tài)第35頁/共299頁1.5C++與面向?qū)ο蟪绦蛟O(shè)計(jì)1、面向?qū)ο蟪绦蛟O(shè)計(jì)語言的基本情況最早最成熟的領(lǐng)域萌芽于60年代(Simula),成熟于80年代70年代,純面向?qū)ο笳Z言,smalltalk常見面向?qū)ο蟮恼Z言Java:純面向?qū)ο蟮恼Z言VB.Net:可視化程序設(shè)計(jì)早期的VB或許算不上真正的面向?qū)ο蟪绦蛟O(shè)計(jì)語言,不具備面向?qū)ο蟪绦虻囊恍┨卣?,但VB.NET已經(jīng)改變了這一切!C#:具有VB和VC++的特征C++,ObjectPascal,Efficl其它常用的具有面向?qū)ο筇卣鞯恼Z言BorlandDelphi、PowerBuilder、VisualFoxPro……第36頁/共299頁1.5C++與面向?qū)ο蟪绦蛟O(shè)計(jì)2、C++簡(jiǎn)史C++起源20世紀(jì)80年代,AT&TBell實(shí)驗(yàn)室BjarneStroustrupC++發(fā)展B→C→帶類的C→C++→標(biāo)準(zhǔn)C++→托管C++C++常用領(lǐng)域系統(tǒng)軟件設(shè)備驅(qū)動(dòng)程序圖形學(xué)用戶界面……第37頁/共299頁1.5C++與面向?qū)ο蟪绦蛟O(shè)計(jì)3、C++特征兼容C語言,支持面向過程的程序設(shè)計(jì)具有高效性、靈活性、可移植性豐富的數(shù)據(jù)類型支持面向?qū)ο蟪绦蛟O(shè)4、標(biāo)準(zhǔn)C++三次主要訂:1985年,1990年,1998年1998年確定的版本為標(biāo)準(zhǔn)C++,之前的稱傳統(tǒng)C++。標(biāo)準(zhǔn)C++包括傳統(tǒng)C++的全部功能,且更龐大、全面.h和無擴(kuò)展名的頭文件:iostream.h、fstream.h、string.h;標(biāo)準(zhǔn)C++對(duì)應(yīng)的頭文件有iostream、fstream、string。第38頁/共299頁1.5C++與面向?qū)ο蟪绦蛟O(shè)計(jì)5、托管C++托管原理先將高級(jí)語言程序翻譯成一種與具體計(jì)算機(jī)類型無關(guān)的中間語言程序,當(dāng)要在某種具體計(jì)算機(jī)上執(zhí)行此程序時(shí),再將它編譯成機(jī)器相關(guān)的程序執(zhí)行。托管優(yōu)點(diǎn)中間語言程序與機(jī)器無關(guān),可在任何計(jì)算機(jī)中執(zhí)行,增強(qiáng)了程序的可移植性,實(shí)現(xiàn)程序的平臺(tái)無關(guān)性。
CLI和CLRCLI定了一組通用數(shù)據(jù)類型規(guī)范,它與具體機(jī)器無關(guān)CLR即公共語言運(yùn)行庫,是.NET一個(gè)標(biāo)準(zhǔn)化的程序執(zhí)行環(huán)境,能夠?qū)⒅虚g語言程序轉(zhuǎn)換成具體的機(jī)器語言程序第39頁/共299頁1.5C++與面向?qū)ο蟪绦蛟O(shè)計(jì)托管程序的執(zhí)行過程
VB.NET、C#、J#、MC++……中間語言代碼(即MSIL代碼)CLRWindowsUNIXLinux編譯JIT編譯第40頁/共299頁1.6Microsoft.NET與VisualC++1、.NET平臺(tái)主要功能.NET是基于因特網(wǎng)和Web的,它獨(dú)立于任何語言或平臺(tái),對(duì)于程序開發(fā)的語言不作限制,開發(fā)者可以使用多種.NET兼容語言的任意組合創(chuàng)建.NET程序,這就允許在同一軟件項(xiàng)目中,多個(gè)程序員分別使用自己精通的.NET語言編寫程序代碼。第41頁/共299頁1.6.1、.NETFramework1.NetFramework主要用途NETFramework提供了一個(gè)托管執(zhí)行環(huán)境和一個(gè)一致的面向?qū)ο蟮木幊汰h(huán)境,無論對(duì)象代碼在本地存儲(chǔ)和執(zhí)行,還是在本地執(zhí)行但在Internet上分布,或者是在遠(yuǎn)程執(zhí)行,其編程環(huán)境都相同,簡(jiǎn)化了程序的開發(fā)與部署。2、.NetFramework主要構(gòu)成公共語言運(yùn)行庫(CLR).NETFramework的核心組成部分,負(fù)責(zé)執(zhí)行托管代碼.NETFramework類庫(FCL)FCL是一個(gè)綜合性的面向?qū)ο蟮目芍赜妙愋图稀K庋b了對(duì)Windows、網(wǎng)絡(luò)、文件、多媒體的處理功能,涉及到了文件、繪圖、網(wǎng)絡(luò)通信、WEB服務(wù)、集合操作、多線程、字符串、XML、SOAP、XPath等多方面的類約7000多個(gè),是生成.NET應(yīng)用程序、組件和控件的基礎(chǔ)第42頁/共299頁1.6.1
.NETFramework3、.NETFramework結(jié)構(gòu)第43頁/共299頁1.6.2VC++.NET
1、VisualC++VisualC++是微軟公司對(duì)C++的一個(gè)特定實(shí)現(xiàn),支持C和C++程序設(shè)計(jì),并在其中添加了微軟公司的語言擴(kuò)展。
VisualC++是一個(gè)集成開發(fā)環(huán)境,具有編輯、編譯、調(diào)試、鏈接、裝配和執(zhí)行C++程序的功能。能夠編制基于控制臺(tái)和Windows平臺(tái)的C++程序。2、VisualC++版本
VisualC++6.0VisualC++.NET第44頁/共299頁1.6.2VC++.NET
3、V托管程序設(shè)計(jì)窗體程序設(shè)計(jì)FCL和CLRC#、J#、VC++、VisualBasic多語言混合程序設(shè)計(jì)垃圾回收第45頁/共299頁1.7第一個(gè)C++程序1、VisualC++2008簡(jiǎn)介
visualstudio2008中的編譯器之一支持標(biāo)準(zhǔn)C++和托管C++程序設(shè)計(jì)托管C++采用新語法支持MFC和窗體程序設(shè)計(jì)第46頁/共299頁啟動(dòng)VisualStudio.NET2、VsiualC++程序的建立過程第47頁/共299頁TheEnd謝謝大家!第48頁/共299頁第2章數(shù)據(jù)輸入與輸出本章主要介紹C++程序數(shù)據(jù)的輸入和輸出C++程序的結(jié)構(gòu)流與標(biāo)準(zhǔn)輸入輸出設(shè)備CinCout輸出格式文件數(shù)據(jù)的建立與讀取第49頁/共299頁2.1C++程序的結(jié)構(gòu)1、C++程序的構(gòu)成聲明部分主函數(shù)部分函數(shù)定義2、C++程序文件頭文件:.h.hpp源文件:.cpp3、程序結(jié)構(gòu)的一個(gè)例程如下第50頁/共299頁1.5C++程序的結(jié)構(gòu)3、C++程序的一個(gè)例程聲明部分0 //Eg1-1.cpp1 #include<iostream.h>2 #defineN103 voidsort(inta[],intn);4 voidprint(inta[],int);5第51頁/共299頁2.1C++程序的結(jié)構(gòu)對(duì)例程的補(bǔ)充:C++的注釋///*……*/C++的函數(shù)需要先聲明,然后才能調(diào)用第52頁/共299頁2.2流與標(biāo)準(zhǔn)輸入與輸出設(shè)備本節(jié)主要介紹C++程序中數(shù)據(jù)輸入輸出的方法,是C++程序設(shè)計(jì)的基礎(chǔ)。應(yīng)該掌握流的概念iostream.hcincoutendl講授方法:在VC++集成環(huán)境中演示第53頁/共299頁2.2流與標(biāo)準(zhǔn)輸入與輸出設(shè)備1、C及C++中的流概念I(lǐng)/O(input/ouput,輸入/輸出)數(shù)據(jù)是一些從源設(shè)備到目標(biāo)設(shè)備的字節(jié)序列,稱為字節(jié)流。除了圖像、聲音數(shù)據(jù)外,字節(jié)流通常代表的都是字符,因此在多數(shù)情況下的流(stream)是從源設(shè)備到目標(biāo)設(shè)備的字符序列,A8bctyx1234源設(shè)備目標(biāo)設(shè)備字符序列從源設(shè)備連續(xù)不斷地流向目標(biāo)設(shè)備,最后按先流出先到達(dá)的有序方式匯聚在目標(biāo)設(shè)備中,如同河流一樣,故此叫流。第54頁/共299頁2.2流與標(biāo)準(zhǔn)輸入與輸出設(shè)備輸入流輸入流(inputstream)是指從輸入設(shè)備流向內(nèi)存的字節(jié)序列。輸出流輸出流(outputstream)是指從內(nèi)存流向輸出設(shè)備的字節(jié)序列。C++中的輸入輸入流iostreamcin輸入流對(duì)象,C++已將其與鍵盤關(guān)聯(lián)cout輸出流對(duì)象,C++已將其與顯示器關(guān)聯(lián)第55頁/共299頁2.3cin和析取運(yùn)符1、cin的用途cin讀作(see-in)是一個(gè)輸入流對(duì)象,用于從鍵盤輸入數(shù)據(jù)。在C++程序中,也可以使用c語言中常用的scanf函數(shù)輸入數(shù)據(jù),但cin更簡(jiǎn)單。2、cin的用法輸入單個(gè)變量的值cin>>x;輸入多個(gè)變量的值cin>>x1>>x2>>x3>>x4……>>xn其中x,x1……x2可是以內(nèi)置數(shù)據(jù)類型如int,char,float,double等。第56頁/共299頁2.3cin和析取運(yùn)符3、用cin時(shí)的注意事項(xiàng)在一條cin語句中同時(shí)為多個(gè)變量輸入數(shù)據(jù)。在輸入數(shù)據(jù)的個(gè)數(shù)應(yīng)當(dāng)與cin語句中變量個(gè)數(shù)相同,各輸入數(shù)據(jù)之間用一個(gè)或多個(gè)空白(包括空格、回車、Tab)作為間隔符,全部數(shù)據(jù)輸入完成后,按Enter鍵結(jié)束。
在>>后面只能出現(xiàn)變量名,下面的語句是錯(cuò)誤的。cin>>"x=">>x; //錯(cuò)誤,>>后面含有字符串"x="cin>>12>>x; //錯(cuò)誤,>>后面含有常數(shù)12cin>>'x'>>x; 第57頁/共299頁2.3cin和析取運(yùn)符cin具有自動(dòng)識(shí)別數(shù)據(jù)類型的能力,析取運(yùn)算>>將根據(jù)它后面的變量的類型從輸入流中為它們提取對(duì)應(yīng)的數(shù)據(jù)。比如:cin>>x;假設(shè)輸入數(shù)據(jù)2,析取運(yùn)算符>>將根據(jù)其后的x的類型決定輸入的2到底是數(shù)字還是字符。若x是char類型,則2就是字符;若x是int,float之類的類型,則2就是一個(gè)數(shù)字。再如,若輸入34,且x是char類型,則只有字符3被存儲(chǔ)到x中,4將繼續(xù)保存在流中;若x是int或float,則34就會(huì)存儲(chǔ)x中。
第58頁/共299頁2.3cin和析取運(yùn)符數(shù)值型數(shù)據(jù)的輸入。在讀取數(shù)值型數(shù)據(jù)時(shí),析取運(yùn)算符>>首先略掉數(shù)據(jù)前面的所有空白符號(hào),如果遇到正、負(fù)號(hào)或數(shù)字,就開始讀入,包括浮點(diǎn)型數(shù)據(jù)的小數(shù)點(diǎn),并在遇到空白符或其他非數(shù)字字符時(shí)停止。例如:intx1;doublex2;charx3;cin>>x1>>x2>>x3;假如輸入“35.4A”并按Enter鍵,x1是35;x2是.4;x3是'A'第59頁/共299頁2.3cin和析取運(yùn)符4、輸入數(shù)據(jù)案例分析【例2-2】假設(shè)有變量定義語句如下:inta,b;doublez;charch;下面的語句說明數(shù)據(jù)輸入的含義。語句 輸入 內(nèi)存變量的值
1 cin>>ch; A ch='A'2 cin>>ch; AB ch='A',而'B'被保留在輸入流中等待被讀取
3 cin>>a; 32 a=324 cin>>a; 32.23 a=32,.23留在輸入流中等待被讀取
5 cin>>z; 76.21 z=76.216 cin>>z; 65 z=65.07 cin>>a>>ch>>z 23B3.2 a=23,ch='B',Z=3.28 cin>>a>>ch>>z 23B3.2 a=23,ch='B',Z=3.29cin>>a>>b>>z 2332 a=23,b=32,等待輸入下一個(gè)數(shù)據(jù)存入z10 cin>>a>>z 23.224 a=2,z=3.2,24被保留在輸入流中等待被讀取11 cin>>a>>ch 132 a=132,計(jì)算機(jī)等待輸入ch的值12 cin>>ch>>a 132 ch='1',a=32第60頁/共299頁2.3cin和析取運(yùn)符4、get輸入空白字符用Cin輸入數(shù)據(jù)時(shí),空白作為數(shù)據(jù)之間的間隔,無法輸入charc1,c2;intn;std::cin>>c1>>c2>>n;若輸入:X5則X將存入c1,5被存入c2,n沒有輸入值第61頁/共299頁2.3cin和析取運(yùn)符5、getline輸入包括空白字符的長(zhǎng)字符串getline函數(shù)一次讀取一行字符,其用法如下std::cin.getline(char*c,intn,char='\n');【例2-3】getline讀取一行輸入存入字符串中
#include<iostream>voidmain(){ chars1[100]; std::cout<<"usegetlineinputchar:"; std::cin.getline(s1,50); std::cout<<s1<<std::endl;}第62頁/共299頁2.3cin和析取運(yùn)符4、get輸入空白字符get輸入流函數(shù)完成單個(gè)空白字符(包括空格、回車換行等、Tab等)的輸入,get函數(shù)的用法如下:std::cin.get(charvarChar);例如:std::cin.get(c1); std::cin.get(c2); std::cin>>n;若輸入13,則C1為1,C2為空白,C2為3第63頁/共299頁2.4cout和數(shù)據(jù)輸出1、cout的用途cout(讀作see-out)是一個(gè)輸出流對(duì)象,已被C++默認(rèn)關(guān)聯(lián)到顯示器,用于在屏幕上輸入數(shù)據(jù)。在C++程序中,也可使用C語言的sprintf輸出數(shù)據(jù),但cout更簡(jiǎn)單。2、cout的用法cout<<x其中x可是以內(nèi)置數(shù)據(jù)類型如int,char,float,double等。第64頁/共299頁2.4cout和數(shù)據(jù)輸出輸出字符類型的數(shù)據(jù)對(duì)于字符變量和字符串變量,cout將把變量的值輸出到顯示屏幕上。對(duì)于字符常量和字符串常量,cout將把它們?cè)瓨虞敵鲈谄聊簧稀纠?-4】用cout輸出字符數(shù)據(jù)。//CH2-4.cpp#include<iostream.h>voidmain(){ charch1='c'; charch2[]="HellowC++!"; cout<<ch1; cout<<ch2; cout<<"C"; cout<<"Helloweveryone!";}第65頁/共299頁2.4cout和數(shù)據(jù)輸出2.連續(xù)輸出cout能夠同時(shí)輸出多個(gè)數(shù)據(jù),用法如下:cout<<x1<<x2<<x3<<…;例:cout<<ch1<<ch2<<"C"<<"Helloweveryone!";與C語言一樣,在C++程序中也可以將一條命令寫在多行上。比如,上面的語句也可寫成下面的形式:cout<<ch1 <<ch2 <<"C" <<"Helloweveryone!";第66頁/共299頁2.4cout和數(shù)據(jù)輸出3、輸出換行在cout語句中換行可用:“\n”或endl【例2-5】在例2-4的輸出語句中增加換行符。//CH2-5.cpp#include<iostream.h>voidmain(){ charch1='c'; charch2[]="HellowC++!";
std::cout<<ch1<<std::endl;
std::cout<<ch2<<"\n";
std::cout<<"C"<<endl;
std::cout<<"Helloweveryone!\n"; }第67頁/共299頁2.5cout輸出格式控制符1、輸入數(shù)據(jù)類型數(shù)據(jù)在連續(xù)輸入多個(gè)數(shù)據(jù)時(shí),應(yīng)注意在數(shù)據(jù)之加插入間隔符。如intx1=23;floatx2=34.1;doublex3=67.12;cout<<x1<<x2<<x3<<900;其中的cout語句將在屏幕上輸出,2334.167.12900誰知道這是個(gè)什么數(shù)據(jù)呢?第68頁/共299頁2.5cout輸出格式控制符2、數(shù)制基數(shù)hex:16進(jìn)制,oct:8進(jìn)制,dec:10進(jìn)制【例2-6】輸出不同進(jìn)制的數(shù)據(jù)。//ch2-6.cpp#include<iostream>voidmain(){ intx=34; std::cout<<std::hex<<17<<""<<x<<""<<18<<std::endl; std::cout<<17<<""<<std::oct<<x<<""<<18<<std::endl; std::cout<<std::dec<<17<<""<<x<<""<<18<<std::endl;
}第69頁/共299頁2.5cout輸出格式控制符3、其它輸出格式控制符設(shè)置浮點(diǎn)數(shù)的精度
setprecision(n)設(shè)置輸出域?qū)捄蛯?duì)齊方式setw(n)設(shè)置對(duì)齊方式Setiosflags(longf);resetiosflags(longf);第70頁/共299頁2.5cout輸出格式控制符【例2-7】用setiosflags和
resetiosflags設(shè)置
和取消輸出數(shù)據(jù)的對(duì)齊方式。//CH2-7.cpp#include<iostream> #include<iomanip> voidmain(){ std::cout<<“123456781234567812345678”<<std::endl; std::cout<<setiosflags(ios::left)<<setw(8) <<456<<setw(8)<<123<<std::endl; std::cout<<resetiosflags(ios::left)<<setw(8)<<123<<std::endl; }第71頁/共299頁2.5cout輸出格式控制符【例2-8】用fill和setfill設(shè)置輸出填充字符。//ch2-8.cpp#include<iostream> #include<iomanip> voidmain(){ std::cout<<"123456781234567812345678"<<std::endl; std::cout<<std::setw(8)<<123<<std::setw(8)<<456<<std::setw(8)<<789<<std::endl; std::cout.fill('@'); std::cout<<std::setw(8)<<123<<std::setw(8)<<456<<std::setw(8)<<789<<std::endl; std::cout<<std::setfill('^'); std::cout<<std::setw(8)<<123<<std::setw(8)<<456<<std::setw(8)<<789<<std::endl;}4.輸出填充字符(用指定字符填充空白)std::cout.fill(ch);std::cout<<std::setfill(ch);第72頁/共299頁2.6文件數(shù)據(jù)輸入與輸出1.文件數(shù)據(jù)讀取基理程序與文件的數(shù)據(jù)交換方法同它與標(biāo)準(zhǔn)輸入/輸出設(shè)備的數(shù)據(jù)交換方法相同,從文件讀取數(shù)據(jù)與從鍵盤輸入數(shù)據(jù)的方法相似,將數(shù)據(jù)寫入文件與將數(shù)據(jù)輸出到顯示器的方法相似。內(nèi)存變量顯示器磁盤文件鍵盤istreamostreamifstreamofstream第73頁/共299頁2.6文件數(shù)據(jù)輸入與輸出2、文件數(shù)據(jù)讀取的過程(1)在程序中包含頭文件fstream#include<fstream>;(2)定義文件流變量ifstreaminData; //定義輸入文件流變量ofstreamoutData; //定義輸出文件流變量(3)將文件流變量與磁盤文件關(guān)聯(lián)起來fileVar.open(filename,mode)(4)用文件流(<<或>>)讀/寫文件數(shù)據(jù)inData>>x>>y;outData<<x<<y;(5)關(guān)閉文件第74頁/共299頁2.6文件數(shù)據(jù)輸入與輸出3、文件操作案例【例2-9】在C盤根目錄下建立一文件student.dat,并從鍵盤輸入3個(gè)學(xué)生的數(shù)據(jù)到該文件中。每個(gè)學(xué)生的數(shù)據(jù)包括姓名、身份證號(hào),以及數(shù)學(xué)、英語、計(jì)算機(jī)等課程的成績(jī)。。
語文數(shù)學(xué)政治化學(xué)英語平均分學(xué)生167 76878976學(xué)生278 87789087……第75頁/共299頁2.6文件數(shù)據(jù)輸入與輸出//CH2-9.cpp#include<iostream>#include<fstream>usingnamespacestd;voidmain(){ ofstreamoutfile("C:\\student.dat"); charname[8],id[8]; intmath,eng,computer; for(inti=0;i<3;i++) { cout<<"輸入姓名:";cin>>name; cout<<"輸入身份證號(hào):";cin>>id; cout<<"輸入數(shù)學(xué)成績(jī):";cin>>math; cout<<"輸入英語成績(jī):";cin>>eng; cout<<"輸入計(jì)算機(jī)成績(jī):";cin>>computer; outfile<<name<<""<<id<<""<<math<<""<<eng<<""<<computer<<endl; } outfile.close();}定義文件變量,對(duì)outfile的操作實(shí)際是對(duì)盤根目錄中的student.dat磁盤文件的操作將內(nèi)存變量的值寫入outfile,實(shí)際上寫出到磁盤文件student.dat中第76頁/共299頁2.6文件數(shù)據(jù)輸入與輸出3、文件操作案例【例2-10】編寫一程序?qū)⑽募tudent.dat中的數(shù)據(jù)讀出來,計(jì)算每個(gè)同學(xué)的總分,并顯示在屏幕上。輸出格式如下:
。
語文數(shù)學(xué)政治化學(xué)英語平均分學(xué)生167 76878976學(xué)生278 87789087……第77頁/共299頁//ch2-10.cpp#include<iostream>#include<iomanip>#include<fstream>voidmain(){ std::ifstreaminfile("c:\\student.dat"); charname[8],id[8]; intmath,eng,computer,sum; std::cout<<std::setw(10)<<"姓名"<<std::setw(10)<<"身份證號(hào)" <<std::setw(10)<<"數(shù)學(xué)成績(jī)"<<std::setw(10)<<"英語成績(jī)" <<std::setw(12)<<"計(jì)算機(jī)成績(jī)"<<std::setw(10)<<"總分" <<std::endl<<std::endl;定義文件變量,對(duì)intfile的操作實(shí)際是對(duì)C盤根目錄中的student.dat磁盤文件的操作第78頁/共299頁infile>>name; while(!infile.eof()){ infile>>id>>math>>eng>>computer; sum=math+eng+computer; std::cout<<std::setw(10)<<name<<std::setw(10)<<id<<std::setw(10)<<math <<std::setw(10)<<eng <<std::setw(12)<<computer<<std::setw(10)<<sum<<std::endl; infile>>name; } infile.close();}將文件變量中的數(shù)據(jù)讀入到內(nèi)存變量中,實(shí)際上是將磁盤文件student.dat中值讀入到內(nèi)存變量中.第79頁/共299頁第3章C++基礎(chǔ)
本章主要介紹C++對(duì)C語言的某些改變和擴(kuò)展,是非向向?qū)ο蠓矫娴奶卣?,包括?/p>
C++的數(shù)據(jù)類型類型轉(zhuǎn)換
const常量、引用、指針及函數(shù)參數(shù)函數(shù)原型、默認(rèn)參數(shù)、函數(shù)重載內(nèi)聯(lián)函數(shù)名字空間及其應(yīng)用變量作用域和生存期數(shù)據(jù)輸入/輸出第80頁/共299頁3.1C++對(duì)C語言數(shù)據(jù)類型的擴(kuò)展1、C數(shù)據(jù)類型在C++中繼續(xù)可用2、C++對(duì)C的結(jié)構(gòu)、枚舉、聯(lián)合進(jìn)行了擴(kuò)展C:結(jié)構(gòu)名不是類型struct{……}some_struct;structsome_structstruct_var;typedefstructsome_structstruct_type;C++:結(jié)構(gòu)名、聯(lián)合名為類型struct{……}struct_name;struct_tstruct_var;unionenum第81頁/共299頁3.2局部變量說明C局部變量的定義在語句塊內(nèi)可執(zhí)行語句之前C++局部變量的定義可在語句塊內(nèi)任何語句可以出現(xiàn)的地方但不能被goto及類似語句跳過好處方便:使用時(shí)才定義易讀:類型信息就近獲取第82頁/共299頁3.3const常量1、常量定義C#define常量名稱常量
C++const類型常量名稱=常量;
常量在定義時(shí)就必須初始化第83頁/共299頁3.3const常量1、常量定義C#define常量名稱常量
C++const類型常量名稱=常量;
第84頁/共299頁3.3const常量2、常量說明①常量一經(jīng)定義就不能修改,例如:constinti=5; //定義常量ii=10; //錯(cuò)誤,修改常量i++; //錯(cuò)誤,修改常量②const常量必須在定義時(shí)初始化,例如:constintn; //錯(cuò)誤,常量n未被初始化③在C++中,表達(dá)式可以出現(xiàn)在常量定義語句中。如果定義的常量是整型,則類型關(guān)鍵字int可以省略。intj,k=9; //L1consti1=10+k+6; //L2constinti1=10+k+6; //L3第85頁/共299頁3.4命名空間1、C++引入名字空間的原因C++編程環(huán)境中,系統(tǒng)定義了大量的變量、函數(shù)和類的名稱。在編程中可能定義出系統(tǒng)已存在的變量、函數(shù)或類名稱,產(chǎn)生沖突。多人合作進(jìn)行軟件開發(fā)時(shí),可能定義出相同的名稱,產(chǎn)生沖突。這些問題導(dǎo)致名字空間的運(yùn)用:即程序員可以將自己定義的名字局限在一個(gè)自定義的名字空間中,就不會(huì)與其它人定義的名字沖突。第86頁/共299頁3.4命名空間2、名字空間的定義namespacenamespace_name{ members;}其中,namespace是定義名字空間的關(guān)鍵字;namespace_name是程序員指定的名字空間的名字;merbers
是名字空間中包括的成員,可以是變量定義、函數(shù)聲明、函數(shù)定義、結(jié)構(gòu)聲明,以及類的聲明等。
第87頁/共299頁3.4命名空間3、名字空間案例:下面的例子定義了名字空間ABCnamespaceABC{ intcount; typedeffloathouse_price; structstudent{ char*name; intage; };
doubleadd(inta,intb) {return(double)a+b;} inlineintmin(inta,intb);};intABC::min(inta,intb){ returna>b?a:b;}第88頁/共299頁3.4命名空間4、名字空間的應(yīng)用名字空間成員的作用域局限于名字空間內(nèi)部,可以通過作用域限定符(::)訪問它,語法如下:namespace_name::identifier名字空間ABC有5個(gè)成員:count、student、house_price、add
和min
。對(duì)其引用如下:voidmain(){
ABC::count=1; //訪問ABC空間中的count intcount=9; //main函數(shù)中的count與ABC中的count無關(guān)
ABC::students; //用ABC空間中的student結(jié)構(gòu)定義s s.age=9;
intx=ABC::min(4,5); //調(diào)用ABC中的min函數(shù)計(jì)算兩數(shù)最小值}
第89頁/共299頁3.4命名空間5、用usingnamespace訪問名字空間成員①引用名字空間的單個(gè)成員。用法如下:usingnamespace_name::identifier例如,用using簡(jiǎn)化ABC名字空間中count的使用:voidmain(){ usingABC::count; //L1
count=2; //L2 //intcount=9; //L3 …… count=count+2; //L4}第90頁/共299頁3.4命名空間②引入名字空間的全部成員。用法如下:usingnamespace_name例如,引有前述ABC名字空間的全體成員voidmain(){
usingnamespaceABC; //L1 intcount=9;//錯(cuò)誤,已有源于ABC中的count,重復(fù)定義
students; count=5; s.age=min(43,32);}第91頁/共299頁3.4命名空間【例3-4】名字空間的應(yīng)用舉例。//CH3-4.cpp#include<iostream>usingnamespacestd;namespaceA{ intn; voidf(){cout<<"namespaceA::f()"<<endl;} voidg(){cout<<"namespaceA::g()"<<endl;}};namespaceB{ intn; voidf(){cout<<"namespaceB::f()"<<endl; } voidt(){cout<<"namespaceB::t()"<<endl; }};voidmain(){ usingnamespaceA; usingnamespaceB; A::n=0; A::f(); B::f(); g(); t();}第92頁/共299頁3.4命名空間6.std名字空間C++標(biāo)準(zhǔn)化過程形成了兩個(gè)版本:一個(gè)是以BjarneStroustrup最初設(shè)計(jì)的C++為基礎(chǔ)的版本,稱為傳統(tǒng)C++;另一個(gè)是晚期(約1989年)以ANSI/ISO標(biāo)準(zhǔn)化委員會(huì)創(chuàng)建的C++,稱為標(biāo)準(zhǔn)C++。兩種版本的C++有大量相同的庫和函數(shù)。為了將兩者區(qū)分:傳統(tǒng)C++采用與C語言同樣風(fēng)格的頭文件;標(biāo)準(zhǔn)C++的新式頭文件沒有擴(kuò)展名,即不需要.h之類的擴(kuò)展名。例如,傳統(tǒng)C++的頭文件有iostream.h、fstream.h、string.h;標(biāo)準(zhǔn)C++對(duì)應(yīng)的頭文件有iostream、fstream、string。第93頁/共299頁3.4命名空間6.std名字空間傳統(tǒng)C++中的內(nèi)容被直接放到了全局名字空間中。標(biāo)準(zhǔn)C++將新格式頭文件中的內(nèi)容全部放到了std名字空間中。許多C++編譯器都提供了對(duì)兩種版本C++的支持,并允許在同一程序中同時(shí)引用兩種版本的C++函數(shù)。如果程序要引用標(biāo)準(zhǔn)C++新格式頭文件中的函數(shù),就需要在程序中使用下面的語句將std名字空間中的名稱引入到全局名字空間中。usingnamespacestd;第94頁/共299頁3.4命名空間【例3-5】標(biāo)準(zhǔn)C++程序設(shè)計(jì)的簡(jiǎn)單程序。//CH3-5.cpp#include<iostream>#include<cstdio>#include<cmath>#include<string>usingnamespacestd;voidmain(){ strings1="ddd",s2; //string是字符串,定義于<string> s2=s1; //字符串賦值,不需要strcpy函數(shù)
inti; ints=sin(30); //調(diào)用cmath庫中的sin函數(shù)
scanf("%d",&i); //scanf、printf來源于cstdio printf("i=%d\n",i); cin>>i; //cin、cout來源于iostream cout<<"i="<<i<<endl; cout<<s2<<endl;}第95頁/共299頁3.4命名空間usingnamespacestd會(huì)將std名字空間中的標(biāo)志符都引入到程序中,如果只需用到std名字空間中的個(gè)別標(biāo)志符,可以在要使用的標(biāo)志符前面加上前綴std::,不必用“usingnamespacestd;”將std中的全部名稱引入到程序中來。、例如:std::cout<<"notuseusing……"<<std::endl;std::cout<<"notuseusing……\n";std::cin<<xx;第96頁/共299頁3.5指針1、C++內(nèi)存分配靜態(tài)分配(靜態(tài)變量)編譯器在處理源代碼時(shí)為變量分配內(nèi)存,其效率較高,但缺少靈活性(要求程序執(zhí)行之前就知道變量所需的內(nèi)存類型和數(shù)量)動(dòng)態(tài)分配(動(dòng)態(tài)變量)程序執(zhí)行時(shí)調(diào)用運(yùn)行時(shí)刻庫函數(shù)來分配變量的內(nèi)存。兩者的區(qū)別靜態(tài)變量是有名字的變量,可以通過名字對(duì)它所代表的內(nèi)存進(jìn)行操作;動(dòng)態(tài)變量是沒有名字的內(nèi)存變量,只能通過指針進(jìn)行操作。靜態(tài)變量的分配和釋放由編譯器自動(dòng)處理,動(dòng)態(tài)變量的分配與釋放必須由程序員控制。第97頁/共299頁3.5指針本節(jié)主要介紹C++的指針及C++動(dòng)態(tài)內(nèi)存分配運(yùn)算符和回收運(yùn)算符new、delete指針與常量之間的關(guān)系,及0指針和void指針第98頁/共299頁3.5.1指針概念的回顧1、C++內(nèi)存分配靜態(tài)分配(靜態(tài)變量)編譯器在處理源代碼時(shí)為變量分配內(nèi)存,其效率較高,但缺少靈活性(要求程序執(zhí)行之前就知道變量所需的內(nèi)存類型和數(shù)量)動(dòng)態(tài)分配(動(dòng)態(tài)變量)程序執(zhí)行時(shí)調(diào)用運(yùn)行時(shí)刻庫函數(shù)來分配變量的內(nèi)存。兩者的區(qū)別靜態(tài)變量是有名字的變量,可以通過名字對(duì)它所代表的內(nèi)存進(jìn)行操作;動(dòng)態(tài)變量是沒有名字的內(nèi)存變量,只能通過指針進(jìn)行操作。靜態(tài)變量的分配和釋放由編譯器自動(dòng)處理,動(dòng)態(tài)變量的分配與釋放必須由程序員控制。第99頁/共299頁3.5.1指針概念的回顧2、動(dòng)態(tài)內(nèi)存分配指針對(duì)類型T,T*是“到T的指針”,即一個(gè)類型為T*的變量,能存一個(gè)類型T的對(duì)象的地址charc;c=‘a(chǎn)’;charp*p=&c;pc?????‘a(chǎn)’?&c*P內(nèi)存第100頁/共299頁3.5.1指針概念的回顧指針是一個(gè)復(fù)雜的概念,它能夠指向(保存)不同類型變量的內(nèi)存地址。例如:int*pi; //pi是指向int的指針int**pc;//pc是指向int指針的指針int*pA[10];//pA是指向int的指針數(shù)組int(*f)(int,char);//f是指向具有兩個(gè)參數(shù)的函數(shù)的指針int*f(int)//f是一個(gè)函數(shù),返回一個(gè)指向int的指針第101頁/共299頁3.5.2指針與00指針0是一個(gè)整數(shù),在C語言和C++中可以把它轉(zhuǎn)換成為任意數(shù)據(jù)類型,如整型、浮點(diǎn)型、指針等??梢园?賦值給不同類型的變量。沒有任何變量會(huì)被分配到地址0,所以0就可以作為一個(gè)指針常量,表明指針當(dāng)時(shí)沒有指向任何變量。比如,對(duì)于前面的指針定義,以下賦值是正確的:pc=0;pA=0;f=0;0與NULL第102頁/共299頁3.5.3指針與const1、指針與const的限定關(guān)系p*p?????‘a(chǎn)’?&cIntconst*p=&cP為常量,即此內(nèi)存的值不能修改constchar*p=&c*P為常量,即此內(nèi)存的值不能修改第103頁/共299頁3.5.3指針與const2、限制變量、參數(shù)的訪問,避免非本意的數(shù)據(jù)修改舉例#include<iostream>usingnamespacestd;main(){inti,j;constintic=100;constint*ip=⁣int*consticp=&i;//icp=&j;//err*icp=200; cout<<"i="<<i<<endl;cout<<"j="<<j<<endl;cout<<"*ip="<<*ip<<endl;cout<<"*icp="<<*icp<<endl;}icp是一個(gè)常量地址,此處企圖修改它第104頁/共299頁3.5.3指針與const3、指向常量的指針在指針定義前加const,表示指向的對(duì)象是常量。constinta=78;constintb=28;intc=18;constint*pi=&a;//定義指向常量的指針*pi=58; //error,不能修改指針指向的常量pi=&b; //ok,指針值可以修改*pi=68; //errorpi=&c; //ok*pi=88; //errorC=98; //ok*p是常量,但通過修改C的值而使*p發(fā)生了變化,這種用法就有問題了,第105頁/共299頁3.4.3指針與const例題:限制函數(shù)修改參數(shù)//eg.cpp#include<iostream.h>voidmystrcpy(char*Dest,constchar*Src){ while(*Dest++=*Src++);}voidmain(){ chara[20]="Howareyou!"; charb[20]; mystrcpy(b,a); cout<<b<<endl;}第106頁/共299頁3.5.3指針與const4、指針常量在指針定義語句的指針名前加const,表示指針本身是常量。例如:char*constpc=“aaaa”;//定義指針常量,在定義時(shí)必須初始化pc=“bbbb”; //error,指針常量不能改變其指針值*pc=“a //err,所指的內(nèi)容可改*pc=‘a(chǎn)’; //ok,在VC環(huán)境下產(chǎn)生運(yùn)行錯(cuò)誤,*(pc+1)=‘b’; //ok,在VC環(huán)境下產(chǎn)生運(yùn)行錯(cuò)誤pc++=‘y’; //errorconstintb=28;int*constpi=&b; //error,pi不能變,但它所指的內(nèi)存單卻可以改變,此處卻將它指向了一個(gè)不可變的內(nèi)存單元,即://不能將constin*轉(zhuǎn)換成int*第107頁/共299頁在上面的例子中,下面的語句會(huì)產(chǎn)生運(yùn)行錯(cuò)誤.*pc='a';//ok,L5*(pc+1)='b';//ok,L6其原因是定義pc的語句的處理方式:char*constpc="baaa"VC++會(huì)將“baaa”所在內(nèi)容區(qū)域標(biāo)識(shí)為const類型,這意味著此區(qū)域的任何內(nèi)容不可被修改.從pc的定義是講,雖然*pc所指的內(nèi)容是可以修改的,但現(xiàn)在它指向了不可修改的內(nèi)容.因此,上述兩條修改語句會(huì)產(chǎn)生錯(cuò)誤.用下面的方式代替pc的初始化,可驗(yàn)證上述說法!第108頁/共299頁#include<iostream>usingnamespacestd;voidmain(){charx[5]="baaa";//char*constpc="baaa";//定義指針常量,在定義時(shí)必須初始化
char*constpc=x;//pc="bbbb";//error,指針常量不能改變其指針值(pc不能改變)//*pc="a";//err,*pc='a';//ok,L5*(pc+1)='b';//ok,L6//pc++='y';//errorintb=28;int*constpi=&b;
cout<<pc<<endl;cout<<*pc<<endl;cout<<*(pc+1)<<endl;cout<<pi<<endl;cout<<*pi<<endl;*pi=38;cout<<b<<endl;}第109頁/共299頁3.5.3指針與const5、指向常量的常指針可以定義一個(gè)指向常量的常指針變量,它必須在定義時(shí)進(jìn)行初始化。例如:constintci=7;intai=8;constint*constcpc=&ci; //指向常量的指針常量constint*constcpi=&ai;//okcpi=&ai; //error,指針不能修改*cpi=39; //error,不能修改所指對(duì)象ai=39; //ok,第110頁/共299頁3.5.3指針與const6、const、指針與變量賦值一般編譯器不能跟蹤指針在程序中任意一點(diǎn)所指向的對(duì)象,任何一個(gè)“企圖將一個(gè)非const對(duì)象的指針指向一個(gè)常量對(duì)象”的動(dòng)作都將引起編譯錯(cuò)誤。
constdoubleminWage=9.60;double*ptr=&minWage;第111頁/共299頁const對(duì)象的地址只能賦值給指向const對(duì)象的指針,但是指向const對(duì)象的指針卻可以被賦于一個(gè)非const對(duì)象的地址。
constdoubleminWage=9.60;constdouble*ptr=&minWage;doubledval=3.14;ptr=&dval;*ptr=23;dval=23;3.5.3指針與const第112頁/共299頁3.5.3指針與const
練習(xí)1、下面的聲明中,哪些是錯(cuò)誤的?
inti; constintic; constint*pic; int*constcpi; constint*constcpic;未初始化第113頁/共299頁3.5.3指針與const練習(xí)2、指出下面的錯(cuò)誤
inti=-1; constintic=i; constint*pic=⁣ int*constcpi=⁣ constint*constcpic=⁣i=ic;pic=⁣cpi=pic;pic=cpic;cpic=⁣ic=*cpic;錯(cuò)誤第114頁/共299頁3.5.4void指針1、指針與地址每個(gè)指針都是一個(gè)內(nèi)存地址,但都有一個(gè)相關(guān)的類型指示編譯器怎樣解釋它所指定內(nèi)存區(qū)域的內(nèi)容,以及該內(nèi)存區(qū)域應(yīng)該跨越多少個(gè)內(nèi)存單元。相同類型的指針進(jìn)行比較或相互賦值才有意義。2、void*指針void*指針只表示與它相關(guān)的值是個(gè)地址,但該地址的數(shù)據(jù)類型是未知的。它是能夠接受任何數(shù)據(jù)類型的特殊指針。void*最重要的用途是作為函數(shù)的參數(shù),向函數(shù)傳遞一個(gè)類型可變的對(duì)象。另一種用途就是從函數(shù)返回一個(gè)無類型的對(duì)象,在使用時(shí)再將它顯式轉(zhuǎn)換成適當(dāng)?shù)念愋汀?/p>
第115頁/共299頁3.5.5new和delete1、動(dòng)態(tài)存儲(chǔ)管理的概念 系統(tǒng)為每個(gè)程序提供了一個(gè)在程序執(zhí)行時(shí)可用的內(nèi)存空間,這個(gè)內(nèi)存空間被稱為空閑存儲(chǔ)區(qū)或堆(heap),運(yùn)行時(shí)刻的內(nèi)存分配就稱為動(dòng)態(tài)內(nèi)存分配。2、在C語言中,動(dòng)態(tài)內(nèi)存分配用mallc和free函數(shù)完成
int*ip=(int*)malloc(sizeof(int)*100);free(ip);第116頁/共299頁3.5.5new和delete3、C++動(dòng)態(tài)內(nèi)存分可由new,delete運(yùn)算符完成New用于從內(nèi)存中分配指定大小的內(nèi)存用法1:p=newtype;用法2:p=newtype(x);用法3:p=newtype[n];delete用于釋放new分配的堆內(nèi)存用法1:deletep;用法2:delete[]p;第117頁/共299頁3.5.5new和delete4、【例3-6】用new和delete分配與釋放堆內(nèi)存。//CH3-6.cpp#include<iostream.h>voidmain(){ int*p1,*p2,*p3; p1=newint; //分配一個(gè)能夠存放int類型數(shù)據(jù)的內(nèi)存區(qū)域
p2=newint(10); //分配一個(gè)int類型大小的內(nèi)存區(qū)域,并將
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 共同購(gòu)買機(jī)械合同范例
- 產(chǎn)品攝影租賃合同范例
- 兼職推廣合同范例
- 保潔入職合同范例
- 關(guān)于企業(yè)用工合同范例
- 專職消防員服務(wù)合同范例
- 買賣白菜合同范例
- 買房名額轉(zhuǎn)讓合同范例
- 公司食堂門面租賃合同范例
- 保健院整改合同范例
- 臺(tái)球廳合伙協(xié)議書
- SWITCH塞爾達(dá)傳說曠野之息-1.6金手指127項(xiàng)修改使用說明教程
- 阻生牙的拔除
- 、野外生存教案
- 新形式下做好檢察信息工作的心得體會(huì)
- 綠色低碳節(jié)能先行3000字(9篇)
- 上海市浦東新區(qū)2022屆九年級(jí)中考二?;瘜W(xué)試卷+答案
- 水文地質(zhì)手冊(cè)
- 二級(jí)建造師《施工管理》高頻考點(diǎn)二
- 水質(zhì)采樣記錄
- 中智集團(tuán)及下屬單位招聘筆試題庫2022
評(píng)論
0/150
提交評(píng)論