計算機(jī)編程《C語言程序設(shè)計與實踐》課件_第1頁
計算機(jī)編程《C語言程序設(shè)計與實踐》課件_第2頁
計算機(jī)編程《C語言程序設(shè)計與實踐》課件_第3頁
計算機(jī)編程《C語言程序設(shè)計與實踐》課件_第4頁
計算機(jī)編程《C語言程序設(shè)計與實踐》課件_第5頁
已閱讀5頁,還剩568頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C++程序設(shè)計與實踐第一章引論課程簡介C++語言是在軟件設(shè)計中的主流程序設(shè)計語言,以C語言為基礎(chǔ),加入面向?qū)ο蟪绦蛟O(shè)計的封裝性、繼承性、多態(tài)性的思想,適用于大型軟件開發(fā)和應(yīng)用要求熟練掌握C++程序設(shè)計語言的基本語法規(guī)則、類和對象定義和相關(guān)運算法則,熟練掌握面向?qū)ο蟪绦蛟O(shè)計的核心概念:封裝、繼承、多態(tài),掌握泛型編程的概念和方法。掌握應(yīng)用面向?qū)ο笏枷脒M(jìn)行較大軟件開發(fā)的能力學(xué)時分配總學(xué)時64學(xué)時:

課堂教學(xué)32學(xué)時(8周)+實驗32學(xué)時第1章引論(2)

第2章C++的數(shù)據(jù)類型(2)第3章C++語句(2)

第4章函數(shù)(2)第5章類和對象(4)

第6章深入類和對象(4)第7章運算符重載(4)

第8章繼承和派生(4)第9章虛函數(shù)和多態(tài)性(4)

第10章模板和泛型編程(4)考核方式平時考核(10%):點名、作業(yè)中期考核(10%):隨堂考試期末考核(50%):考試實驗成績(30%):實驗課程的參考教材白忠建C++程序設(shè)計與實踐機(jī)械工業(yè)出版社2012年5月BjarneStroustrup/王剛等C++程序設(shè)計原理與實踐機(jī)械工業(yè)出版社2010年7月BjarneStroustrup/裘宗燕C++程序設(shè)計語言機(jī)械工業(yè)出版社2010年3月PPT和課程的相關(guān)資料,我會放到網(wǎng)盤上/s/1eQFDT1w第一章引論本章要點對象的概念。對象是一個主動的實體,是面向?qū)ο蠹夹g(shù)的基礎(chǔ)概念。面向過程技術(shù)與面向?qū)ο蠹夹g(shù)的異同。面向過程技術(shù)以過程(函數(shù)、子例程等)為中心;而面向?qū)ο蠹夹g(shù)以對象為中心。面向?qū)ο蟮暮诵母拍?。?shù)據(jù)封裝、繼承和多態(tài)是每一種面向?qū)ο蟮某绦蛟O(shè)計語言必須實現(xiàn)的核心概念?,F(xiàn)代的觀點認(rèn)為泛型編程也是核心之一。C++程序的概貌。C++程序與C程序有相似之處,但也有很大的不同,輸入和輸出的區(qū)別就是其中之一。1.1什么是對象在現(xiàn)實的世界中,我們時時刻刻對在面對一些客觀實體客體,都擁有不同的特性,還擁有獨特的行為。他們構(gòu)成了我們所認(rèn)識的外部世界1.1什么是對象對象(Object)將這些不依賴于人類意識而存在的客體稱為“對象”關(guān)系對象之間存在著一張復(fù)雜的關(guān)系網(wǎng),而網(wǎng)中的對象隨時隨地都在發(fā)生信息交流,他們之間互相構(gòu)成了服務(wù)與被服務(wù)的關(guān)系。可以這么說,對象加上對象之間的關(guān)系就構(gòu)成了現(xiàn)實世界1.1什么是對象圖1-2對象和對象間的關(guān)系構(gòu)成現(xiàn)實世界a)孤立對象構(gòu)成的世界一片死寂b)對象間的聯(lián)系形成復(fù)雜的信息網(wǎng)絡(luò)1.1什么是對象同一個群體中的所有對象對具有相似的共性和行為模式屬于這個抽象類別的具象(個體)無條件地?fù)碛羞@些共性,而具象同時還擁有各自不同的個性思考:王同學(xué)和李同學(xué)的共性和差異1.1什么是對象抽象和對象的關(guān)系抽象是所有對象的模板(類)對象是抽象的一個具體實例描述抽象特性的術(shù)語屬性:靜態(tài)的行為:動態(tài)的1.1什么是對象1.1什么是對象一個對象是一個主動的實體,它能夠主動發(fā)起動作,從而引起它內(nèi)部狀態(tài)的改變。對象和其他對象是有聯(lián)系的,他們之間要產(chǎn)生互動,從而驅(qū)動問題向能夠解決的方向發(fā)展。從以上觀點出發(fā),我們可以發(fā)現(xiàn),真實世界中充滿了對象,并且一切皆可成為對象。1.1什么是對象習(xí)題1.1除了書中的例子,在現(xiàn)實世界中,還能發(fā)現(xiàn)事物可以稱為對象?1.2什么是面向過程和面向?qū)ο?/p>

實際問題往往以數(shù)值計算為主體。數(shù)值計算主要依賴兩類事物:數(shù)據(jù)計算方法對以上兩者關(guān)系的處理方式衍生了多種程序設(shè)計方法,而其中最流行的,就是面向過程和面向?qū)ο蟮姆椒?。有沒有同學(xué)能說出其中的差別?1.2什么是面向過程和面向?qū)ο?/p>

1.2.1面向過程方法面向過程的觀點以計算方法為重。例如C語言中,最顯著的語法成分就是“過程”,又或稱為“函數(shù)”,它們成為程序的主宰。數(shù)據(jù)沒有仿真實際對象,而是退化成僅包含基本屬性的最小數(shù)據(jù)包,其中沒有包含對象應(yīng)有的行為。1.2什么是面向過程和面向?qū)ο蟠嬖诒锥耍好枋鰧ο筇匦缘臄?shù)據(jù)包沒有任何或者只有很弱的保護(hù)措施。對象的屬性和行為之間的聯(lián)系非常松散。 映射關(guān)系扭曲。面向過程的程序設(shè)計方法基本思路:自頂向下,逐步求精——功能分解重點:如何實現(xiàn)細(xì)節(jié)過程,將數(shù)據(jù)與函數(shù)分開。形式:主模塊+若干個子模塊(main()+子函數(shù))優(yōu)點:便于開發(fā)和維護(hù),當(dāng)程序規(guī)模不大時,程序的流程很清楚。缺點:效率低,程序的可重用性差、數(shù)據(jù)安全性差等請同學(xué)寫一個C程序,有三個客戶購買了物品,分別花費了X元,Y元,Z元,請求出其中花費最多的用戶,并將客戶名按花費由大到小排列。(課程結(jié)束時交)問題怎樣克服軟件的復(fù)雜性?怎樣將現(xiàn)實世界模型在計算機(jī)中自然地表示出來?1.2什么是面向過程和面向?qū)ο?/p>

1.2.2面向?qū)ο蠓椒陀^世界是由對象構(gòu)成的,每一個對象都有自己的運動規(guī)律和內(nèi)部狀態(tài),不同對象之間可以相互作用或互相通信。面向?qū)ο笫且环N適用于直觀模型化的設(shè)計方法。1.2什么是面向過程和面向?qū)ο笞鳛榭朔浖?fù)雜性的手段,在面向?qū)ο蠹夹g(shù)中,利用了如下對象的性質(zhì):將密切相關(guān)的數(shù)據(jù)和過程封裝起來定義為一個實體;定義了一個實體后,即使不知道此實體的功能是怎樣實現(xiàn)的,也能使用它們。1.2什么是面向過程和面向?qū)ο竺嫦驅(qū)ο笤O(shè)計非常注重設(shè)計方法,因為它要產(chǎn)生一種與現(xiàn)實具有自然關(guān)系的軟件系統(tǒng),而現(xiàn)實就是一種模型實際上,用面向?qū)ο蠓椒ň幊痰年P(guān)鍵是模型化程序員的責(zé)任是構(gòu)造現(xiàn)實的軟件模型。此時,計算機(jī)的觀點是不重要的,而現(xiàn)實生活的觀點才是最重要的。1.2什么是面向過程和面向?qū)ο罅?xí)題1.2除了C語言,讀者還用過或者知道哪些程序設(shè)計語言可以歸類為面向過程的語言?與C語言相比,它們都有哪些異同?習(xí)題1.3除了本書介紹的C++,讀者還用過或者知道哪些程序設(shè)計語言可以歸類為面向?qū)ο蟮恼Z言?它們各自擁有什么鮮明的特點?1.3面向?qū)ο蠛诵母拍詈诵牡母拍睿簲?shù)據(jù)封裝(抽象)(dataencapsulation)繼承(inheritance)多態(tài)性(poly-morphism)泛型編程(genericprogramming)1.3面向?qū)ο蠛诵母拍?.3.1數(shù)據(jù)封裝數(shù)據(jù)封裝將一組數(shù)據(jù)和這組數(shù)據(jù)有關(guān)的操作集合封裝在一起,形成一個能動的實體,稱為“對象”。用戶不必知道對象行為的實現(xiàn)細(xì)節(jié),只需根據(jù)對象提供的外部特性接口訪問對象。C++用類類型(class)來完成封裝。類的概念面向?qū)ο蠓椒ㄖ械?類"具有相同屬性和行為的一組對象的集合為屬于該類的全部對象提供了抽象的描述,包括屬性和行為兩個主要部分。類與對象的關(guān)系:

猶如模具與鑄件之間的關(guān)系,是抽象與具體的關(guān)系,一個屬于某類的對象稱為該類的一個實例。類和對象的例子

姓名年齡身高體重回答身高回答體重類:人對象:張三對象:李四對象:王五請大家自己構(gòu)思一個類和對象的例子1.3面向?qū)ο蠛诵母拍頲lassClock{

public:voidSetTime(intNewH,intNewM,intNewS);

voidShowTime();

private:intHour,Minute,Second;};1.3面向?qū)ο蠛诵母拍?.3.1數(shù)據(jù)封裝習(xí)題1.4請讀者仔細(xì)研究一下自己使用的手機(jī),看看它是怎樣實現(xiàn)封裝的。1)使用手機(jī)時,您需要知道它的工作原理嗎?2)您需要知道手機(jī)的內(nèi)部結(jié)構(gòu)嗎?如果不知道,您還可以使用手機(jī)嗎?3)您的手機(jī)對用戶暴露了哪些可操作的接口?4)所有手機(jī)相同的接口是否都提供了相同或相似的功能?1.3面向?qū)ο蠛诵母拍?.3.2繼承整體和部分一般和特殊如果存在類A和類B,并且:(1)類A的所有屬性和方法均包含在類B中;(2)類B中可以有類A沒有的屬性或方法那么,類B繼承類A,同時稱類B為類A的子類、類A為類B的父類。1.3面向?qū)ο蠛诵母拍?.3.2繼承自然界中的繼承昆蟲1.3面向?qū)ο蠛诵母拍罘诸悩涞奶攸c:最高層(根結(jié)點)具有最普遍的特性其下的每一層中,每個節(jié)點擁有的描述都比它之前的層更具體一旦某個特征定義下來,所有在它之下的種類都要包含該特征1.3面向?qū)ο蠛诵母拍罾^承的術(shù)語基類(baseclass):抽象出共同特征派生類(derivedclass):派生類表達(dá)其差別Person類Student類1.3面向?qū)ο蠛诵母拍盍?xí)題1.5在現(xiàn)實世界中,讀者還可以觀察到哪些事務(wù)具有本小節(jié)描述的層次結(jié)構(gòu)?它們具有繼承的特性嗎?

姓名年齡身高體重回答身高回答體重類:人類:教師類:學(xué)生

所教課程回答所教課程

年級回答幾年級學(xué)生研究生博士研究生本科生碩士研究生1.3面向?qū)ο蠛诵母拍?.3.3多態(tài)性多態(tài)的概念:所謂多態(tài),簡單地講,就是指一個名字(或符號)具有多種含義多態(tài)的實現(xiàn)方式函數(shù)重載運算符重載為什么需要多態(tài)?用戶關(guān)心的是函數(shù)的功能及其使用接口,而并不需要了解該函數(shù)的使用接口與函數(shù)的哪一種實現(xiàn)方法相匹配(binding)1.3面向?qū)ο蠛诵母拍頒++中的多態(tài)靜態(tài)多態(tài):普通函數(shù)重載動態(tài)重載:虛函數(shù)函數(shù)重載的例子intf(){return0;}intf(inta){return++a;}提問:請大家觀察以上兩個重載的函數(shù)有什么異同?1.3面向?qū)ο蠛诵母拍盍?xí)題1.6在現(xiàn)實世界中,讀者還可以觀察到哪些事務(wù)具有本小節(jié)描述的“一個接口,多種實現(xiàn)”的特性?這些特性是否可以視為一種多態(tài)形式?例如:加號+->實數(shù)的加法:2+3=5->字符串的加法:“123”+“abc”=“123abc”多態(tài)的例子classPerson{

publicvoidinform(){

System.out.println("father");

}

}

classStudentextendsPerson{

publicvoidinform(){

System.out.println("son");

}

}

publicclassTest{

publicstaticvoidmain(String[]args){

Personp=newStudent();

rm();

}

}1.3面向?qū)ο蠛诵母拍?.3.4泛型編程泛型編程的概念:以獨立于任何特定類型的方式編寫代碼。泛型編程的實現(xiàn)方式函數(shù)模板類模板1.3面向?qū)ο蠛诵母拍罾壕帉懬笠粋€數(shù)的絕對值函數(shù)。不使用泛型編程:intabs(inta){returna>0?a:-a}longabs(longa){returna>0?a:-a}doubleabs(doublea){returna>0?a:-a}1.3面向?qū)ο蠛诵母拍罘盒偷睦樱汉瘮?shù)模板template<typenameT>Tabs(Ta){returna>0?a:-a;}提問:以上函數(shù)模板有什么特征?編輯將源程序輸入到計算機(jī)中,生成后綴為cpp的文件。編譯將程序的源代碼轉(zhuǎn)換為機(jī)器語言代碼。連接將多個源程序文件以及庫中的某些文件連在一起,生成一個后綴為exe的可執(zhí)行文件。運行調(diào)試1.4C++程序的編寫和運行步驟1.4C++程序概貌1.4.1第一個C++程序例1-1(ex1-1.cpp)1.4.2C++程序的編輯、編譯和鏈接編輯編譯鏈接習(xí)題1.7請讀者嘗試將本小節(jié)的示例程序輸入、編譯和鏈接。注意觀察C++程序與C程序的不同之處1.5貫穿全書的案例一位小學(xué)教師Ken希望完成這樣的任務(wù):(1)針對于小學(xué)生正在學(xué)習(xí)四邊形(quadrangle)的特性,編寫一個小軟件,能夠隨機(jī)在屏幕上顯示矩形(rectangle)、正方形(square)、平行四邊形(parallelogram)、梯形(trapezoid)和菱形(diamond)五種形體之一(2)顯示該形體的特性和關(guān)鍵數(shù)據(jù)(隨機(jī)產(chǎn)生)(3)學(xué)生復(fù)習(xí)形體的特性,然后根據(jù)給出的關(guān)鍵數(shù)據(jù)計算形體的面積,軟件判斷其結(jié)果的正確性(4)在學(xué)習(xí)過程中,軟件記錄產(chǎn)生的每一個形體,在學(xué)生選擇不再繼續(xù)后,將其學(xué)習(xí)的過程重放一遍,用以重溫,加深印象。1.5貫穿全書的案例請各位同學(xué)仔細(xì)閱讀這個貫穿全書的例子,同時用C的知識思考一下,如何去完成任務(wù)本次課程內(nèi)容回顧面向?qū)ο蟮乃枷肜斫馀c面向過程方法的區(qū)別面向?qū)ο蟮幕靖拍睿ㄖ攸c)掌握對象、類、抽象、封裝、繼承、多態(tài)C++程序的編寫和運行步驟(了解)1、下列不屬于面向?qū)ο蠹夹g(shù)的基本特征的是()。

A.

封裝性B.

模塊性

C.

多態(tài)性D.

繼承性2、()是對具有相同屬性和行為的對象集合的抽象描述。A.系統(tǒng)B.實體C.對象D.類3、封裝的目的是實現(xiàn)信息的有效()共享B.隱藏C.操作D.繼承課堂練習(xí)C++程序設(shè)計與實踐第二章C++的數(shù)據(jù)類型上節(jié)課知識點回顧面向過程編程方法與面向?qū)ο缶幊谭椒ǖ膮^(qū)別;面向過程:自頂向下抽象,分解面向?qū)ο螅耗M現(xiàn)實世界的對象面向?qū)ο蟮膸讉€核心概念封裝(抽象):類和對象繼承多態(tài)泛型編程繼承與派生的例子第二章C++的數(shù)據(jù)類型本章要點C++的數(shù)據(jù)類型。C++提供多種數(shù)據(jù)類型,以適應(yīng)不同程序的需要。標(biāo)準(zhǔn)C++增加了bool類型和引用類型。標(biāo)識符。標(biāo)識符是程序的基本元素,用以表示一個程序分量。const說明符。C++使用const說明符來定義常量。const還可以修飾指針,使指針指向的單元或是指針本身成為常量。引用類型。引用是一個單元的別名。使用引用就是使用被引用單元本身。引用可以單獨使用,但更多的是作為函數(shù)參數(shù)和函數(shù)的返回值使用。new和delete運算符。使用這兩個運算符可以更好地進(jìn)行動態(tài)內(nèi)存管理。類型轉(zhuǎn)換。除了C風(fēng)格的類型轉(zhuǎn)換方式外,C++引入了類型安全的顯式類型轉(zhuǎn)換機(jī)制。2.1C++數(shù)據(jù)類型概覽C++擁有如下數(shù)據(jù)類型:簡單類型:包括整數(shù)類型(integral)、浮點類型(floatpoint)、枚舉類型(enumeratione)地址類型:包括引用類型(reference)、指針類型(pointer)結(jié)構(gòu)化類型:包括數(shù)組類型(array)、結(jié)構(gòu)體類型(structure)、聯(lián)合體類型(union)、類類型(class)空類型(void)。這種類型只有空類型一種。2.2標(biāo)識符、變量和常量標(biāo)識符(identifier)是高級程序設(shè)計語言用到的詞匯。程序員自定義的標(biāo)識符通常用來代替字面(literal)值參與運算。標(biāo)識符表示的數(shù)據(jù)有可變和不可變之分。不可變數(shù)據(jù)稱為“常量(constant)”,而可變數(shù)據(jù)稱為“變量(variable)”。2.2標(biāo)識符、變量和常量2.2.1標(biāo)識符標(biāo)識符是由字母A-Z,a-z和數(shù)字0-9混合而成的,另外可以加入下劃線’_’。不過,所有的標(biāo)識符必須以字母或者是下劃線開頭。C++保留了一些預(yù)先定義好的標(biāo)識符,稱為“關(guān)鍵字(keywords)”或“保留字(reservedwords)

”C++的保留字參考教材附件12.2標(biāo)識符、變量和常量2.2.2常量字面常量(literalconstant)r*r*3.14命名常量(namedconstant)constfloatPI=3.14;提問:請大家說說命名常量的優(yōu)點。2.2標(biāo)識符、變量和常量2.2.3變量變量定義的語法:類型名變量列表;變量的內(nèi)存映像:intcounter;100……0x0013FF78counter變量的值內(nèi)存單元的符號名,即變量名整型單元的大小在32位機(jī)上是4字節(jié)變量的32位地址,以第一個字節(jié)的地址來表示2.2標(biāo)識符、變量和常量2.2.4變量的初始化復(fù)制初始化(copy-initialization):inti=1,j=i;charch

='A';直接初始化(direct-initialization):inti(1),j(i);charch('A');完成習(xí)題2.32.3簡單數(shù)據(jù)類型C++三種簡單數(shù)據(jù)類型:整數(shù)類型、浮點類型、枚舉類型。2.3.1整數(shù)類型2.3.1整數(shù)類型

字符類型字符常量單引號括起來的一個字符,如:'a','D','?','$'字符變量用來存放字符常量

例:charc1,c2;

c1='a';

c2='A';字符數(shù)據(jù)在內(nèi)存中的存儲形式以ASCII碼存儲,占1字節(jié),用7個二進(jìn)制位2.3.1整數(shù)類型字符數(shù)據(jù)的使用方法字符數(shù)據(jù)和整型數(shù)據(jù)之間可以運算。字符數(shù)據(jù)與整型數(shù)據(jù)可以互相賦值。字符串常量例:"CHINA"

"a"

'a'所以:charc;

c="a";CHINA\0a

\0a2.3.1整數(shù)類型

Bool

類型布爾類型的表達(dá)范圍非常有限,只能取false(0)和true(非0)兩個值true和false是字面常量標(biāo)識符,并不是字符串凡是會產(chǎn)生邏輯值的地方都產(chǎn)生bool類型的結(jié)果2.3簡單數(shù)據(jù)類型2.3.2浮點類型#include<iostream>usingnamespacestd;voidmain(void){constintPRICE=30;intnum,total;floatv,r,h;num=10;total=num*PRICE;cout<<total<<endl;r=2.5;h=3.2;v=3.14159*r*r*h;cout<<v<<endl;}實型常量float4字節(jié)

3.4×10±387位有效數(shù)字double8字節(jié)

1.7×10±30815位有效數(shù)字longdouble

8字節(jié)

1.7×10±30815位有效數(shù)字實型變量缺省為double型后綴F(或f)

為float型后綴L(或l)

為longdouble

型2.3簡單數(shù)據(jù)類型2.3.3枚舉類型枚舉類型用來表示對象的狀態(tài)。枚舉類型的定義:enum

TrafficLight{RED,GREEN,AMBER};TrafficLight是類型名;RED、GREEN、AMBER是枚舉常量,不是字符串,也不是整型常量枚舉類型的例子enum

TrafficLight{RED,GREEN,AMBER};TrafficLightt1,t2;t1=RED;t2=t1+1;t2=TrafficLight(t1+1)完成習(xí)題2.42.4地址類型2.4.1指針類型變量的內(nèi)存映像intcounter=100;100……counter0x0013FF790x0013FF780x0013FF7B0x0013FF7Acounter由4個字節(jié)組成每個字節(jié)都有各自唯一的地址變量counter的地址2.4地址類型指針的聲明指針:用來表示內(nèi)存地址,用于間接訪問內(nèi)存單元指針變量:用于存放地址的變量指針變量的聲明:數(shù)據(jù)類型*標(biāo)識符;2.4地址類型1、指針的聲明語法形式

存儲類型數(shù)據(jù)類型*指針名=初始地址例:int*pa=&a;1.存儲類型是指指針變量本身的存儲類型,2.?dāng)?shù)據(jù)類型是指該指針可以指向該數(shù)據(jù)類型的變量。3.*號表示后面的變量是指針變量。4.初始值通常為某個變量名或為NULL。如:int*p;/*p為指向整型變量的指針*/char*s;/*s為指向整型字符型變量的指針*/float*t;/*t為指向單精度浮點型變量的指針*/68指針變量的賦值指針變量一旦定義,必須采用賦值的方式將其與某個變量實體相聯(lián)系,才能使用。指針變量的賦值方式:指針變量名=&普通變量名;如:inti,j,*p,*q=&j;p=&i;或:inti,*p;*p=i;兩種形式都是將變量i的地址賦給了指針p。指針變量是用來保存某個變量的地址的,而地址是內(nèi)存單元的編號,因此指針變量的值的數(shù)據(jù)類型是無符號的整型。

&的位置1、&出現(xiàn)在變量聲明語句中被聲明變量左邊表示聲明的是引用如:int&f;2、&給變量賦初值出現(xiàn)在等號右邊或執(zhí)行語句中表示取對象地址2.4地址類型4.const作用于指針三種形式:1)constint*p;p是變量,但指向了常量;2)int*constp;p是常量,但指向了變量;3)constint*constp;常量指針指向了常量完成習(xí)題2.52.4地址類型2.4.2引用類型引用的定義簡而言之,引用就是對象的別名,即一個對象擁有多個名字。例如:inta=100;int&ra=a;a和ra是同一個單元的不同名字!100……ara2.4地址類型2.引用的使用inta=1,b=2;int&ra=a;++ra的結(jié)果是2,與++a完全等效。而操作ra=b并非是使ra成為b的引用,而是將b的值賦給ra,也就是直接賦給a。提示:獨立引用必須被初始化!2.4地址類型指針和引用的對比inta=100,*p=&a,&ra=a;a的值是100;對象ra就是對象a,它的值是100;p的值是0x0013FF78,也就是a的地址;*p的值是對象a,它的值是100;0x0013FF781000x0013FF78a(ra)p2.4地址類型3.指向常量的引用constdoubled1=1.0;constdouble&rd1=d1;//正確constdouble&rd2=1.0;//正確doublek=2.0;constdouble&rd3=k+1.0;//正確double&rd4=d1; //錯誤,非常量引用指向常量例2-2地址類型的使用(ex2-2.cpp)2.5結(jié)構(gòu)化類型5.指向數(shù)組的引用inta[10];int(&ra)[10]=a;ra[0]=1;不能定義引用的數(shù)組:int

&ra[10]=a;錯誤6.數(shù)組的初始化inta[3]={1,2,3};intb[]={1,2,3}; //b的長度為32.5結(jié)構(gòu)化類型2.5.3typedeftypedef int INT;typedef double(*DBLARRPTR)[10]; //定義一個指針類型,該類型的指針指向一個長度為的double型一維數(shù)組typedef int& INTREF; //定義了整型引用類型INT anInt;DBLARRPTR dblArr; //dblArr是個數(shù)組,而不是一個簡單變量INTREF ra

=anInt; //ra成為anInt的別名2.6運算符和表達(dá)式2.6.1常用運算符和表達(dá)式元表達(dá)式:字面常量、命名常量、變量賦值表達(dá)式(左值、右值)算術(shù)表達(dá)式關(guān)系表達(dá)式邏輯表達(dá)式條件表達(dá)式逗號表達(dá)式復(fù)合賦值表達(dá)式混合運算表達(dá)式2.6運算符和表達(dá)式2.6.1常用運算符和表達(dá)式賦值表達(dá)式(左值、右值)對象=表達(dá)式左值是賦值符號左邊的值,常量不能作為左值;算術(shù)表達(dá)式基本算術(shù)運算符:+-*/%++--優(yōu)先級與結(jié)合性:先乘除,后加減,同級自左至右2.6運算符和表達(dá)式2.6.2幾種特殊的C++運算符sizeof

inta;

sizeof(a);

sizeof(int);提示:在不同的操作系統(tǒng)、編譯環(huán)境、硬件平臺上,sizeof運算符可能會有得到不同的結(jié)果!2.6運算符和表達(dá)式2.new和delete double*p,*q,*t; p=newdouble;

q=newdouble(1.0);

t=newdouble[10];

deletep;

delete[]t;提示:new和delete應(yīng)該成對出現(xiàn)!2.6運算符和表達(dá)式3.類型強(qiáng)制轉(zhuǎn)化運算符inta=1,*p=&a;doubleb=2,*q;constintc=3;a=(int)b;//C風(fēng)格a=int(b);//C++風(fēng)格a=static_cast<int>(b);//類型安全a=const_cast<int>(c);//類型安全q=reinterpret_cast<double*>(p);

//危險dynamic_cast:將基類指針/引用轉(zhuǎn)換為派生類指針/引用,以后再講本章課程的小結(jié)1、C++基本數(shù)據(jù)類型2、標(biāo)示符3、const說明符4、指針和引用5、new和delete6、強(qiáng)制類型轉(zhuǎn)換課堂小練習(xí)1#include<iostream>usingnamespacestd;voidmain(){ inti=1;

cout<<"\n"<<i++<<"\n";

cout<<i++<<"\n";

cout<<++i<<"\n";

cout<<--i<<"\n";

cout<<i--<<"\n";

cout<<i<<"\n";}輸出結(jié)果:課堂小練習(xí)2主函數(shù)中初始化一個矩陣并將每個元素都輸出,然后調(diào)用子函數(shù),分別計算每一行的元素之和,將和直接存放在每行的第一個元素中,返回主函數(shù)之后輸出各行元素的和。課堂練習(xí)題3設(shè)有一個int型數(shù)組a,有10個元素。用三種方法輸出各元素:使用數(shù)組名和下標(biāo)使用數(shù)組名和指針運算使用指針變量課堂練習(xí)題4P35-習(xí)題2.3P41-習(xí)題2.7P48-習(xí)題2.10C++程序設(shè)計與實踐第三章C++語句第三章C++語句本章要點C++的語句。C++繼承了所有的C語句,同時還將變量聲明也視為可執(zhí)行語句C++的控制結(jié)構(gòu)。有順序、選擇和循環(huán)三種結(jié)構(gòu)異常處理語句。新增加的異常處理機(jī)制使程序員可以編寫更加健壯的C++程序3.1C++語句概述在任何合法的C++表達(dá)式后面加上一個分號“;”就能使其構(gòu)成一條簡單而合法的C++語句??刂普Z句需要特別的語法支持。3.1C++語句概述3.1.1表達(dá)式語句; //空語句2; //常量表達(dá)式語句count=10; //賦值語句a+b; //算術(shù)表達(dá)式語句printf("%d",a); //函數(shù)調(diào)用表達(dá)式語句inta,b; //這是一條聲明語句,可以出現(xiàn)任何地方3.1C++語句概述3.1.2復(fù)合語句語句用{}括起來形成復(fù)合語句(compoundstatement),又稱為“語句塊(block)

”。例如:{

inta=1,b=2;

intt; t=a; a=b; b=t;}3.2流程控制結(jié)構(gòu)

順序(sequence)

選擇(selection)

循環(huán)(iteration)

經(jīng)證明,這三種結(jié)構(gòu)的反復(fù)迭代,可以完成所有的任務(wù)3.3異常處理語句3.3.1異常處理的意義出錯處理程序的編寫不再繁瑣。在錯誤有可能出現(xiàn)處寫一些代碼,并在后面的單獨節(jié)中加入出錯處理程序錯誤發(fā)生是不會被忽略的。如果被調(diào)用函數(shù)需發(fā)送一條出錯信息給調(diào)用函數(shù),它可向調(diào)用函數(shù)發(fā)送描述出錯信息的對象。3.3異常處理語句3.3.2異常處理的方法拋出異常如果程序發(fā)生異常情況,而在當(dāng)前的上下文環(huán)境中獲取不到異常處理的足夠信息,我們可以創(chuàng)建一個包含出錯信息的對象并將該對象拋出當(dāng)前上下文環(huán)境,將錯誤信息發(fā)送到更大的上下文環(huán)境中。這稱為異常拋出。異常拋出的語法是:throw表達(dá)式;這里的表達(dá)式可以是任意類型變量,但更為常用的辦法是創(chuàng)建一個新的異常類用異常拋出。3.3異常處理語句2.異常捕獲try{

語句;}[catch(類型1[變量名1]){語句;}catch(類型2[變量名2]){語句;}…catch(類型n[變量名3]){語句;}]try語句括起一個測試塊,其中含有可能出錯的語句。如果有異常發(fā)生,則會拋出特定類型的異常。每一個catch語句是一個異常處理器,相當(dāng)于一個帶參數(shù)的函數(shù),功能是對指定異常類型進(jìn)行處理。一旦一個異常信號被拋出,那么與這個信號有相同類型參數(shù)的catch子句會捕獲這個異常并處理。處理完成后整個異常處理流程結(jié)束。3.3異常處理語句在異常處理結(jié)束后,需要對異常進(jìn)行恢復(fù)。恢復(fù)意味著希望異常處理器能夠修改狀態(tài),然后再次對錯誤函數(shù)進(jìn)行檢測,使之在第二次調(diào)用時能夠成功運行。一般的做法是將測試塊放入循環(huán)中,以便始終裝入測試塊直到恢復(fù)成功并得到滿意的結(jié)果。3.3異常處理語句2.異常規(guī)格說明在函數(shù)頭部說明異常拋出情況。拋出指定類型異常voidf()throw(toobig,toosmall,divzero);拋出任何一種異常voidf();不會有異常拋出voidf()throw();例3-8:異常處理語句的使用(ex3-8.cpp)作業(yè)P60-3.5P67-3.7C++程序設(shè)計與實踐第四章函數(shù)上次課的內(nèi)容回顧C(jī)++的數(shù)據(jù)類型基本類型:整型、浮點型、枚舉型、地址類型:引用、指針結(jié)構(gòu)化類型:數(shù)組、結(jié)構(gòu)體、聯(lián)合體、類void類型基本概念標(biāo)示符常量變量運算符和表達(dá)式上次課的內(nèi)容回顧C(jī)++的基本語句C++的控制結(jié)構(gòu):順序、選擇、循環(huán)C++的異常處理語句上次課的內(nèi)容:異常處理課堂小練習(xí)——處理除零異常#include<iostream.h>int

Div(int

x,inty);voidmain(){ try {cout<<"5/2="<<Div(5,2)<<endl;

cout<<"8/0="<<Div(8,0)<<endl;

cout<<"7/1="<<Div(7,1)<<endl; }

catch(int) {cout<<"exceptofdevidingzero.\n";}

cout<<"thatisok.\n";}int

Div(int

x,inty){ if(y==0)throwy; returnx/y;}程序運行結(jié)果如下:5/2=2exceptofdevidingzero.thatisok.第四章函數(shù)本章要點函數(shù)的原型聲明和定義。C++編譯器根據(jù)函數(shù)原型生成正確的代碼。函數(shù)的參數(shù)和返回值。函數(shù)的參數(shù)和返回值可以是值、指針和引用,它們有不同的作用。C++函數(shù)可以有默認(rèn)參數(shù)函數(shù)重載。函數(shù)重載是指多個函數(shù)擁有相同的名字,但必須有不同的參數(shù)。4.1函數(shù)的原型聲明和定義

函數(shù)是面向?qū)ο蟪绦蛟O(shè)計中,對功能的抽象函數(shù)定義的語法形式[返回值類型標(biāo)識符]指的是函數(shù)體語句執(zhí)行完成后,函數(shù)返回的值的類型,如int,float等,若函數(shù)無返回值,則用空類型void來定義函數(shù)的返回值。缺省情況為int型。4.1函數(shù)的原型聲明和定義

函數(shù)的定義函數(shù)名由任何合法的標(biāo)識符構(gòu)成。建議將函數(shù)名的命名與函數(shù)內(nèi)容有一定關(guān)系。形式參數(shù)表<type1>name1,<type2>name2,...,<typen>namen[形參說明表]是一系列用逗號分開的每個形參變量說明。如:intx,inty,int

z這表示形參變量有三個:x,y,z。它們的類型都是int型。4.1函數(shù)的原型聲明和定義

函數(shù)的返回值由return

語句給出,例如:

return0;無返回值的函數(shù)(void類型),不必寫return語句。函數(shù)返回語句的形式有以下兩種:①函數(shù)無返回值的情況:return;②函數(shù)有返回值的情況:return(表達(dá)式的值);在第②種情況下要注意“表達(dá)式的值”的類型必須與函數(shù)返回值的類型相一致。函數(shù)語句體是放在一對花括號{}中,由局部數(shù)據(jù)類型描述和功能實現(xiàn)兩部分組成。4.1函數(shù)的原型聲明和定義

無返回值函數(shù)通過其副作用來體現(xiàn)其功能voidHi(void){cout<<“Hi!”<<endl;}一個程序只能有一個(main)主函數(shù),主函數(shù)可以聲明為有參函數(shù),也可以聲明為無參函數(shù);可以聲明為有返回值函數(shù),也可以聲明為無返回值函數(shù)。4.1函數(shù)的原型聲明和定義函數(shù)的調(diào)用調(diào)用前先聲明函數(shù)原型:在調(diào)用函數(shù)中,或程序文件中所有函數(shù)之外,按如下形式說明:類型標(biāo)識符被調(diào)用函數(shù)名(含類型說明的形參表);使用位置:函數(shù)調(diào)用之前使用情況:函數(shù)定義出現(xiàn)在函數(shù)調(diào)用之后,或在其它文件調(diào)用形式函數(shù)名(實參列表)實參個數(shù)應(yīng)該與形參個數(shù)相同實參表達(dá)式類型應(yīng)該與形參對應(yīng)表達(dá)式類型相同調(diào)用時實參表達(dá)式的值被傳遞給函數(shù),為對應(yīng)的形參變量所接受函數(shù)調(diào)用兩種情形

作為表達(dá)式的函數(shù)調(diào)用

例:s=min(5,7)*5;這時函數(shù)本身是一個表達(dá)式,或是某個表達(dá)式的一個子表達(dá)式,其值參與表達(dá)式求值

無返回值的函數(shù)不能被作為表達(dá)式加以調(diào)用2.作為語句的函數(shù)調(diào)用通過函數(shù)的副作用發(fā)揮其作用

若調(diào)用的是有返回值的函數(shù),其返回值被舍棄

函數(shù)的作用通過其副作用被實現(xiàn),沒有副作用的函數(shù)作為語句調(diào)用無意義

例:min(5,7);//無意義函數(shù)調(diào)用的執(zhí)行過程main()調(diào)fun()結(jié)束fun()返回①②④⑥⑦保存:返回地址當(dāng)前現(xiàn)場③恢復(fù):主調(diào)程序現(xiàn)場返回地址⑤嵌套調(diào)用和遞歸調(diào)用嵌套調(diào)用

函數(shù)1調(diào)用了函數(shù)2,函數(shù)2再調(diào)用函數(shù)3就形成函數(shù)的嵌套調(diào)用。函數(shù)可以嵌套調(diào)用,但不允許嵌套定義。遞歸調(diào)用函數(shù)直接或間接調(diào)用自身。main{}調(diào)fun1()結(jié)束fun1()調(diào)fun2()返回fun2()返回①②③⑦④⑤⑥⑧⑨嵌套調(diào)用4.2函數(shù)的參數(shù)和返回值4.2.1函數(shù)的參數(shù)函數(shù)的參數(shù)稱為“形式參數(shù)(簡稱形參)”。在編譯時,形式參數(shù)不具有任何實際的值。這些值需要在運行時通過函數(shù)調(diào)用的形式,將實際的值(稱為“實際參數(shù)(簡稱實參)”)傳遞給形式參數(shù),以便完成需要的運算。這個過程稱為“形參和實參的結(jié)合”。4.2函數(shù)的參數(shù)和返回值1.參數(shù)結(jié)合的三種方式1)傳值C++采用傳值(callbyvalue)方式進(jìn)行參數(shù)傳遞。也就是說,在參數(shù)結(jié)合時,形參是實參的一個復(fù)制品,形參和實參是兩個不同的單元。這樣,形參的改變不會影響實參。這樣的形參往往也被稱為“值參數(shù)”或者“輸入?yún)?shù)”。

4.2函數(shù)的參數(shù)和返回值2)傳指針傳遞指針實際上仍屬于傳值的范疇:形參指針是實參指針的拷貝。不過,這兩個指針指向了同一個單元。因此,通過這兩個指針的任何一個都可以間接地改變實參的值。4.2函數(shù)的參數(shù)和返回值3)傳引用實參和形參結(jié)合的第三種也是最好的一種方法就是傳遞引用。我們都知道,引用是一個單元的別名。這種別名結(jié)合也適用于參數(shù)結(jié)合。當(dāng)形參是一個引用時,那么在函數(shù)內(nèi)部,形參就是實參的別名,換句話說,形參就是實參本身,因此對形參的改變就會直接改變實參。提示:引用形參與實參的別名綁定不是永久性的,而只在函數(shù)作用范圍內(nèi)起作用。例4-2:兩個變量交換值(ex4-2.cpp)輸入兩個整數(shù)交換后輸出#include<iostream>usingnamespacestd;voidSwap(int&a,int&b);intmain(){ intx(5),y(10); cout<<"x="<<x<<"y="<<y<<endl;

Swap(x,y); cout<<"x="<<x<<"y="<<y<<endl; return0;}voidSwap(int&a,int&b){ intt; t=a; a=b; b=t;}運行結(jié)果:x=5y=10x=10y=5t=a;x5t5x的別名axy510y的別名x的別名aby的別名x的別名abx10y10a=bb=t;y5t5y的地址bxy105Swap(x,y);4.2函數(shù)的參數(shù)和返回值2.const作用于參數(shù)使用指針和引用參數(shù)具有實參被更改的潛在“危險”。為了避免這種危險,可以給形參加上const約束,這是形參/實參成為只讀參數(shù),從而避免了被更改的問題。例如:voidfunc(const

int*pi){

inta=*pi; //正確 *pi=0; //錯誤,因為pi指向的單元被視為常量 pi=&a; //正確,因為pi不是常量指針}4.2函數(shù)的參數(shù)和返回值3.默認(rèn)參數(shù)C++有默認(rèn)參數(shù)的概念,它是另外一種形式的函數(shù)重載。例如:voidfun(int

num

=0){…}其中,num稱為“默認(rèn)參數(shù)”,0稱為“默認(rèn)值”。那么在調(diào)用函數(shù)fun時,num對應(yīng)的實參可以有,也可以沒有(缺?。?。fun(10);//傳遞顯式的值,則num的初始值為10fun();//無對應(yīng)的實參,則num的初始值為04.2函數(shù)的參數(shù)和返回值3.缺省參數(shù)所有取缺省值的參數(shù)都必須出現(xiàn)在不取缺省值的參數(shù)的右邊例如:voidf1(intx=10,inty); //errorvoidf2(intx,inty=0); //okvoidf3(intx=10,inty=0);//ok例4-3:缺省參數(shù)(ex4-3.cpp)4.2函數(shù)的參數(shù)和返回值1.函數(shù)返回值類型函數(shù)返回一個值類型,實際上是將返回的值放到一個臨時對象中int

Strlen(constchar*str){char*p=const_cast<char*>(str);while(*p!='\0')++p;returnp–str;}4.2函數(shù)的參數(shù)和返回值2.函數(shù)返回指針函數(shù)返回指針,實際上也是返回一個值,只不過這個值是某個單元的地址。char*Strcat(constchar*str1,constchar*str2){ char*str=newchar[Strlen(str1)+Strlen(str2)+1]; char*p=str;

while(*p++=*str1++);//copyeverycharacterintostr,includingendingNULL --p;//sostepback while(*p++=*str2++);

returnstr;}4.2函數(shù)的參數(shù)和返回值3.函數(shù)返回引用函數(shù)返回引用,實際上返回的是一個對象,是個左值,只不過是匿名的例4-4:函數(shù)返回引用(ex4-4.cpp)與返回指針一樣,函數(shù)返回的引用單元也必須在被調(diào)函數(shù)返回后一直有效。4.2函數(shù)的參數(shù)和返回值默認(rèn)形參值與函數(shù)的調(diào)用位置調(diào)用出現(xiàn)在函數(shù)體實現(xiàn)之前時,默認(rèn)形參值必須在函數(shù)原形中給出;而當(dāng)調(diào)用出現(xiàn)在函數(shù)體實現(xiàn)之后時,默認(rèn)形參值需在函數(shù)實現(xiàn)時給出。例:123intadd(intx=5,inty=6);voidmain(void){add();//調(diào)用在實現(xiàn)前}intadd(intx,inty){returnx+y;}intadd(intx=5,inty=6){returnx+y;}voidmain(void){add();//調(diào)用在實現(xiàn)后}4.3函數(shù)重載當(dāng)兩個或多個在相同范圍內(nèi)的聲明用的是同一個名字時,這個名字就被稱為“重載(overloading)”。在C++中,只有函數(shù)能夠被重載,其中包括運算符函數(shù)。例如:doubleabs(doublenum){return((num<0)?-num:num);}longabs(longnum){return((num<0)?-num:num);}4.3函數(shù)重載雖然兩個函數(shù)擁有相同的名字,但它們的參數(shù)類型是不同的。其實,只要編譯器能區(qū)分參數(shù)的類型,或者參數(shù)的個數(shù),那么就可以重載一個函數(shù)。函數(shù)重載有以下禁忌:僅返回值類型不同而其它部分相同的函數(shù)不能重載;同一個作用域中的函數(shù)不能原型一致地重載。如果要重載,那么必須在參數(shù)列表上有所不同。4.3函數(shù)重載1.重載聲明由于函數(shù)重載只以參數(shù)作為參考點,因此這里就對重載函數(shù)的參數(shù)進(jìn)行一些說明。例子中的重載函數(shù)是不能被接受的。1)用typedef定義的類型別名與原類型等效。例如:typedef

intINT;voidf(int

i){…}//函數(shù)定義voidf(INT

i){…}//錯誤,重定義f函數(shù)2)指針和數(shù)組參數(shù)是等效的。例如:voidg(int*);voidg(int[]); //與g(int*)一樣voidg(int[5]); //與g(int*)一樣3)函數(shù)參數(shù)和函數(shù)指針參數(shù)是等效的。例如:voidh(int());voidh(int(*)()); //與h(int())一樣4)在函數(shù)調(diào)用時編譯器無法區(qū)分cv-修飾符。例如:voidk(int){…}voidk(const

int){…}//錯誤,重定義k(int)5)不同函數(shù)的對應(yīng)參數(shù)僅是默認(rèn)參數(shù)的不同時,它們是等效的。例如:voidp(inti=0);voidp();voidq(){ p();} //錯誤,調(diào)用的是p(int)還是p()?4.3函數(shù)重載2.重載匹配方案在調(diào)用重載函數(shù)是,編譯器會首先查詢與給定參數(shù)類型和個數(shù)完全匹配的重載版本。例如,函數(shù)調(diào)用abs(1.0)會匹配abs(double),abs(1L)會匹配abs(long)。但abs(1.0f)會匹配哪一個呢?intadd(intx,inty);intadd(inta,intb);編譯器不以形參名來區(qū)分intadd(intx,inty);voidadd(intx,inty);編譯器不以返回值來區(qū)分函數(shù)重載舉例編寫三個名為add的重載函數(shù),分別實現(xiàn)兩整數(shù)相加、兩實數(shù)相加和兩個復(fù)數(shù)相加的功能。//3_16.cpp#include<iostream>usingnamespacestd;structcomplex{ doublereal; doubleimaginary;};voidmain(void){

intm,n; doublex,y; complexc1,c2,c3; intadd(intm,intn); doubleadd(doublex,doubley); complexadd(complexc1,complexc2); cout<<"Entertwointeger:"; cin>>m>>n; cout<<"integer"<<m<<'+'<<n<<"="<<add(m,n)<<endl;

cout<<"Entertworealnumber:";

cin>>x>>y;

cout<<"realnumber"<<x<<'+'<<y<<"="<<add(x,y)<<endl;

cout<<"Enterthefirstcomplexnumber:";

cin>>c1.real>>c1.imaginary;

cout<<"Enterthesecondcomplexnumber:";

cin>>c2.real>>c2.imaginary; c3=add(c1,c2);

cout<<"complexnumber("<<c1.real<<','<<c1.imaginary<<")+("<<c2.real<<','<<c2.imaginary<<")=("<<c3.real<<','<<c3.imaginary<<")\n";}intadd(intm,intn){returnm+n;}doubleadd(doublex,doubley){returnx+y;}complexadd(complexc1,complexc2){complexc;

c.real=c1.real+c2.real;

c.imaginary=c1.imaginary+c2.imaginary; returnc;}運行例子運行結(jié)果:Entertwointeger:35integer3+5=8Entertworealnumber:2.35.8realnumber2.3+5.8=8.1Enterthefirstcomplexnumber:12.345.6Enterthesecondcomplexnumber:56.767.8complexnumber(12.3,45.6)+(56.7,67.8)=(69,113.4)4.4存儲類修飾符C++的存儲類修飾符有五種,分別是:auto和register:修飾的對象是局部的extern:修飾的對象名出現(xiàn)在同一應(yīng)用的不同文件中static:修飾的對象是靜態(tài)的4.5標(biāo)識符的作用域和生命期4.5.1作用域和生命期一個程序空間定義了一個全局作用域(globalscope),簡稱“全局域”。屬于該程序的任何語法成分都被定義在這個唯一的全局域中。一個名字空間、一個類和一個全局函數(shù)類的成員函數(shù)函數(shù)(包括全局函數(shù))中的語句塊實際上,用一種簡單的觀點來看,除全局域外,一對花括號{}就定義了一個作用域。而在最外層{}之外,就是全局作用域。4.5.1作用域和生命期任何一個標(biāo)識符(亦稱名字)都會被定義在某個作用域中//前面的代碼中不包含標(biāo)識符a的定義a=0;//錯誤,使用了未定義的標(biāo)識符{//定義了一個作用域的開始

inta;//a的作用域和生命期從其定義開始 a=1;//正確}//作用域的結(jié)束,標(biāo)識符a的作用域和生命期也隨之結(jié)束++a;//錯誤,超過了作用域,對象a已經(jīng)失效4.5.2名字限定限定的名字有如下的語法形式:

作用域名::標(biāo)識符如果上述標(biāo)識符來自于一個嵌套的作用域,那么限定名字的語法形式為:

外層作用域名::嵌套作用域名::標(biāo)識符4.6函數(shù)的其他話題4.6.1內(nèi)聯(lián)函數(shù)宏定義的副作用直接將參數(shù)表達(dá)式放入宏體中例:#defineabs(v)((v)<0?-(v):(v))當(dāng)調(diào)用為abs(++a)時,將不能正確工作內(nèi)聯(lián)函數(shù)定義:inlinelongabs(longnum){ return(num<0?-num:num);}4.6.1內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)不是在調(diào)用時發(fā)生控制轉(zhuǎn)移,而是在編譯時將函數(shù)體嵌入在每個調(diào)用處。內(nèi)聯(lián)函數(shù)的定義方法和格式:inline函數(shù)值的類型函數(shù)名(形參及其類型列表){函數(shù)體}作用:提高運行效率4.6函數(shù)的其他話題聲明時使用關(guān)鍵字inline。編譯時在調(diào)用處用函數(shù)體進(jìn)行替換,節(jié)省了參數(shù)傳遞、控制轉(zhuǎn)移等開銷。注意:內(nèi)聯(lián)函數(shù)體內(nèi)不能有循環(huán)語句和switch語句。內(nèi)聯(lián)函數(shù)的定義必須出現(xiàn)在內(nèi)聯(lián)函數(shù)第一次被調(diào)用之前。對內(nèi)聯(lián)函數(shù)不能進(jìn)行異常接口聲明。內(nèi)聯(lián)函數(shù)應(yīng)用舉例#include<iostream>usingnamespacestd;inlinedoubleCalArea(doubleradius){ return3.14*radius*radius;}intmain(){ doubler(3.0); doublearea; area=CalArea(r); cout<<area<<endl; return0;}4.6.3指向函數(shù)的指針和引用void(*fp)();voidfun();fp=fun; //fp指向函數(shù)fun()fp(); //調(diào)用函數(shù)fun()(*fp)(); //調(diào)用函數(shù)fun()void(&rf)()=fun; //請注意括起引用rf的()rf();4.6.4在C++程序中調(diào)用非C++函數(shù)使用鏈接規(guī)格說明,其語法如下:extern字面字符串常量{外部函數(shù)聲明;}例如:extern

"C"

intfun();C++程序?qū)嵗?include<iostream>usingnamespacestd;voidmain(void){

cout<<"Hello!\n";

cout<<"Welcometoc++!\n";}運行結(jié)果:Hello!Welcometoc++!C++程序的結(jié)構(gòu)與基本組成

聲明區(qū)

#include<……>:函數(shù)聲明定義全局變量主程序區(qū)類型main(參數(shù)行){

程序主體;}函數(shù)定義區(qū)函數(shù)定義{

函數(shù)主體;}1.聲明區(qū)聲明區(qū)處在程序文件的所有函數(shù)的外部。(1)包含頭文件:如#include"iostream.h"(2)宏定義:如#definePI3.1415926(3)類定義:如classname{……};(4)結(jié)構(gòu)體定義:如structrecord{……};(5)函數(shù)聲明:如voidprint();(6)全局變量聲明:如floatH=2.58;(7)條件編譯:如#ifdef……等。2.主程序區(qū)主程序以main()函數(shù)開始,是整個程序運行的入口,該函數(shù)中可能包含的內(nèi)容主要有:(1)局部變量的聲明:如:inti=1;(2)函數(shù)調(diào)用:如:y=sin(x);(3)一般運算:如:a=b+c+d/3;(4)結(jié)構(gòu)控制:如:if(a>b)c=a;(5)對象與結(jié)構(gòu)的處理。(6)文件的處理等。3.函數(shù)定義區(qū)

程序中除了main函數(shù)之外,還可以包含其它的函數(shù),每個函數(shù)是由函數(shù)說明和函數(shù)體兩部分構(gòu)成的。如圖所示:函數(shù)定義區(qū)函數(shù)說明intmax(inta,intb)函數(shù)體{intc;c=a+b;return(c);}數(shù)據(jù)的輸入與輸出I/O流在C++中,將數(shù)據(jù)從一個對象到另一個對象的流動抽象為“流”。流在使用前要被建立,使用后要被刪除;從流中獲取數(shù)據(jù)的操作稱為提取操作;向流中添加數(shù)據(jù)的操作稱為插入操作;數(shù)據(jù)的輸入與輸出是通過流來實現(xiàn)的;cin是預(yù)定義的用來處理標(biāo)準(zhǔn)輸入的流類對象--鍵盤;cout是預(yù)定義的用來處理標(biāo)準(zhǔn)輸出的流類對象—屏幕;預(yù)定義的插入符<<“<<”是預(yù)定義的插入符,作用在流類對象cout上,用來實現(xiàn)屏幕輸出。

格式:cout<<表達(dá)式<<表達(dá)式...在輸出語句中,可以串聯(lián)多個插入運算符,輸出多個數(shù)據(jù)項。在插入運算符后面可以寫任意的表達(dá)式,系統(tǒng)會自動計算出它們的值并傳遞給插入符。例如:

cout<<“Hello!\n”;將字符串“Hello!”輸出到屏幕上并換行。

cout<<“a+b”<<a+b;將字符串“a+b”和表達(dá)式a+b的計算結(jié)果依次在屏幕上輸出。預(yù)定義的提取符>>“>>”是預(yù)定義的提取符,作用在流類對象cint上,用來實現(xiàn)鍵盤輸入。

格式:cin>>變量>>變量...

在輸入語句中,可以串聯(lián)多個提取運算符,用于實現(xiàn)給多個變量輸入數(shù)據(jù),變量的類型可以不一致。例如:

inta,b;

cin>>a>>b;要求從鍵盤上輸入兩個int型數(shù),兩數(shù)之間以空格分隔。若輸入56這時,變量a得到的值為5,變量b得到的值為6。簡單的I/O格式控制在數(shù)據(jù)輸入輸出時,cin和cout能對數(shù)據(jù)自動按正確的格式進(jìn)行處理,除此之外,還可按特殊的格式加以處理。這些操縱符可以直接嵌入到輸入輸出語句中實現(xiàn)I/O控制。使用該操縱符,必須在源程序的開頭包含iomainip頭文件。操縱符名含義dec數(shù)值數(shù)據(jù)采用十進(jìn)制hex數(shù)值數(shù)據(jù)采用十六進(jìn)制oct數(shù)值數(shù)據(jù)采用八進(jìn)制ws提取空白符endl插入換行符,并刷新流ends插入空白符setprecision(int)設(shè)置浮點數(shù)的小數(shù)點位數(shù)(包括小數(shù)點)setw(int)設(shè)置域?qū)抍out<<setw(5)<<setprecision(3)<<3.1415<<endl;本次課內(nèi)容總結(jié)1、函數(shù)的聲明、定義和調(diào)用2、函數(shù)的參數(shù)及返回值3、函數(shù)重載習(xí)題講解編寫一個求x的n次方的函數(shù)#include<iostream>usingnamespacestd;doublepower(doublex,intn);//函數(shù)聲明voidmain(void){ cout<<“5tothepower2is”

<<power(5,2)<<endl;//函數(shù)使用}doublepower(doublex,intn)//函數(shù)定義{ doubleval=1.0; while(n--) val=val*x; return(val);}運行結(jié)果:5tothepower2is25習(xí)題講解輸入兩個整數(shù),求平方和。#include<iostream>usingnamespacestd;voidmain(void){

int

a,b;

intfun1(int

x,inty);

cin>>a>>b;

cout<<"a、b的平方和:"

<<fun1(a,b)<<endl;}習(xí)題講解intfun1(int

x,inty)//求平方和{

int

fun2(intm);return(fun2(x)+fun2(y));}int

fun2(intm)//求平方{return(m*m);}運行結(jié)果:34a、b的平方和:25習(xí)題講解求n!分析:計算n!的公式如下:這是一個遞歸形式的公式,應(yīng)該用遞歸函數(shù)實現(xiàn)。源程序:#include<iostream>usingnamespacestd;longfac(intn){longf;if(n<0)

cout<<"n<0,dataerror!"<<endl;

elseif(n==0)f=1;elsef=fac(n-1)*n;return(f);}intmain(){longfac(intn);

intn;longy;

cout<<"Enterapositiveinteger:";

cin>>n;y=fac(n);

cout<<n<<"!="<<y<<endl;}運行結(jié)果:Enterapositiveinteger:88!=40320習(xí)題講解使用內(nèi)聯(lián)函數(shù)計算圓的面積#include<iostream>usingnamespacestd;inlinedoubleCalArea(doubleradius)//計算圓的面積{ return3.14*radius*radius;}習(xí)題講解voidmain(){ doubler(3.0);//r是圓的半徑

doublearea; area=CalArea(r); //調(diào)用內(nèi)聯(lián)函數(shù)求圓的面積,編譯時此處被替換為CalArea函數(shù)體語句

cout<<area<<endl;}第一次課后作業(yè)P76-4.2、4.3P78-4.4要求:作業(yè)的內(nèi)容需要實際編譯通過,給出結(jié)果的截圖。簡單的寫出你的設(shè)計思路。代碼可打印(可手寫)C+

溫馨提示

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

評論

0/150

提交評論