版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C++程序設(shè)計(jì)與實(shí)踐第一章引論課程簡(jiǎn)介C++語言是在軟件設(shè)計(jì)中的主流程序設(shè)計(jì)語言,以C語言為基礎(chǔ),加入面向?qū)ο蟪绦蛟O(shè)計(jì)的封裝性、繼承性、多態(tài)性的思想,適用于大型軟件開發(fā)和應(yīng)用要求熟練掌握C++程序設(shè)計(jì)語言的基本語法規(guī)則、類和對(duì)象定義和相關(guān)運(yùn)算法則,熟練掌握面向?qū)ο蟪绦蛟O(shè)計(jì)的核心概念:封裝、繼承、多態(tài),掌握泛型編程的概念和方法。掌握應(yīng)用面向?qū)ο笏枷脒M(jìn)行較大軟件開發(fā)的能力學(xué)時(shí)分配總學(xué)時(shí)64學(xué)時(shí):
課堂教學(xué)32學(xué)時(shí)(8周)+實(shí)驗(yàn)32學(xué)時(shí)第1章引論(2)
第2章C++的數(shù)據(jù)類型(2)第3章C++語句(2)
第4章函數(shù)(2)第5章類和對(duì)象(4)
第6章深入類和對(duì)象(4)第7章運(yùn)算符重載(4)
第8章繼承和派生(4)第9章虛函數(shù)和多態(tài)性(4)
第10章模板和泛型編程(4)考核方式平時(shí)考核(10%):點(diǎn)名、作業(yè)中期考核(10%):隨堂考試期末考核(50%):考試實(shí)驗(yàn)成績(jī)(30%):實(shí)驗(yàn)課程的參考教材白忠建C++程序設(shè)計(jì)與實(shí)踐機(jī)械工業(yè)出版社2012年5月BjarneStroustrup/王剛等C++程序設(shè)計(jì)原理與實(shí)踐機(jī)械工業(yè)出版社2010年7月BjarneStroustrup/裘宗燕C++程序設(shè)計(jì)語言機(jī)械工業(yè)出版社2010年3月PPT和課程的相關(guān)資料,我會(huì)放到網(wǎng)盤上/s/1eQFDT1w第一章引論本章要點(diǎn)對(duì)象的概念。對(duì)象是一個(gè)主動(dòng)的實(shí)體,是面向?qū)ο蠹夹g(shù)的基礎(chǔ)概念。面向過程技術(shù)與面向?qū)ο蠹夹g(shù)的異同。面向過程技術(shù)以過程(函數(shù)、子例程等)為中心;而面向?qū)ο蠹夹g(shù)以對(duì)象為中心。面向?qū)ο蟮暮诵母拍?。?shù)據(jù)封裝、繼承和多態(tài)是每一種面向?qū)ο蟮某绦蛟O(shè)計(jì)語言必須實(shí)現(xiàn)的核心概念?,F(xiàn)代的觀點(diǎn)認(rèn)為泛型編程也是核心之一。C++程序的概貌。C++程序與C程序有相似之處,但也有很大的不同,輸入和輸出的區(qū)別就是其中之一。1.1什么是對(duì)象在現(xiàn)實(shí)的世界中,我們時(shí)時(shí)刻刻對(duì)在面對(duì)一些客觀實(shí)體客體,都擁有不同的特性,還擁有獨(dú)特的行為。他們構(gòu)成了我們所認(rèn)識(shí)的外部世界1.1什么是對(duì)象對(duì)象(Object)將這些不依賴于人類意識(shí)而存在的客體稱為“對(duì)象”關(guān)系對(duì)象之間存在著一張復(fù)雜的關(guān)系網(wǎng),而網(wǎng)中的對(duì)象隨時(shí)隨地都在發(fā)生信息交流,他們之間互相構(gòu)成了服務(wù)與被服務(wù)的關(guān)系。可以這么說,對(duì)象加上對(duì)象之間的關(guān)系就構(gòu)成了現(xiàn)實(shí)世界1.1什么是對(duì)象圖1-2對(duì)象和對(duì)象間的關(guān)系構(gòu)成現(xiàn)實(shí)世界a)孤立對(duì)象構(gòu)成的世界一片死寂b)對(duì)象間的聯(lián)系形成復(fù)雜的信息網(wǎng)絡(luò)1.1什么是對(duì)象同一個(gè)群體中的所有對(duì)象對(duì)具有相似的共性和行為模式屬于這個(gè)抽象類別的具象(個(gè)體)無條件地?fù)碛羞@些共性,而具象同時(shí)還擁有各自不同的個(gè)性思考:王同學(xué)和李同學(xué)的共性和差異1.1什么是對(duì)象抽象和對(duì)象的關(guān)系抽象是所有對(duì)象的模板(類)對(duì)象是抽象的一個(gè)具體實(shí)例描述抽象特性的術(shù)語屬性:靜態(tài)的行為:動(dòng)態(tài)的1.1什么是對(duì)象1.1什么是對(duì)象一個(gè)對(duì)象是一個(gè)主動(dòng)的實(shí)體,它能夠主動(dòng)發(fā)起動(dòng)作,從而引起它內(nèi)部狀態(tài)的改變。對(duì)象和其他對(duì)象是有聯(lián)系的,他們之間要產(chǎn)生互動(dòng),從而驅(qū)動(dòng)問題向能夠解決的方向發(fā)展。從以上觀點(diǎn)出發(fā),我們可以發(fā)現(xiàn),真實(shí)世界中充滿了對(duì)象,并且一切皆可成為對(duì)象。1.1什么是對(duì)象習(xí)題1.1除了書中的例子,在現(xiàn)實(shí)世界中,還能發(fā)現(xiàn)事物可以稱為對(duì)象?1.2什么是面向過程和面向?qū)ο?/p>
實(shí)際問題往往以數(shù)值計(jì)算為主體。數(shù)值計(jì)算主要依賴兩類事物:數(shù)據(jù)計(jì)算方法對(duì)以上兩者關(guān)系的處理方式衍生了多種程序設(shè)計(jì)方法,而其中最流行的,就是面向過程和面向?qū)ο蟮姆椒?。有沒有同學(xué)能說出其中的差別?1.2什么是面向過程和面向?qū)ο?/p>
1.2.1面向過程方法面向過程的觀點(diǎn)以計(jì)算方法為重。例如C語言中,最顯著的語法成分就是“過程”,又或稱為“函數(shù)”,它們成為程序的主宰。數(shù)據(jù)沒有仿真實(shí)際對(duì)象,而是退化成僅包含基本屬性的最小數(shù)據(jù)包,其中沒有包含對(duì)象應(yīng)有的行為。1.2什么是面向過程和面向?qū)ο蟠嬖诒锥耍好枋鰧?duì)象特性的數(shù)據(jù)包沒有任何或者只有很弱的保護(hù)措施。對(duì)象的屬性和行為之間的聯(lián)系非常松散。 映射關(guān)系扭曲。面向過程的程序設(shè)計(jì)方法基本思路:自頂向下,逐步求精——功能分解重點(diǎn):如何實(shí)現(xiàn)細(xì)節(jié)過程,將數(shù)據(jù)與函數(shù)分開。形式:主模塊+若干個(gè)子模塊(main()+子函數(shù))優(yōu)點(diǎn):便于開發(fā)和維護(hù),當(dāng)程序規(guī)模不大時(shí),程序的流程很清楚。缺點(diǎn):效率低,程序的可重用性差、數(shù)據(jù)安全性差等請(qǐng)同學(xué)寫一個(gè)C程序,有三個(gè)客戶購買了物品,分別花費(fèi)了X元,Y元,Z元,請(qǐng)求出其中花費(fèi)最多的用戶,并將客戶名按花費(fèi)由大到小排列。(課程結(jié)束時(shí)交)問題怎樣克服軟件的復(fù)雜性?怎樣將現(xiàn)實(shí)世界模型在計(jì)算機(jī)中自然地表示出來?1.2什么是面向過程和面向?qū)ο?/p>
1.2.2面向?qū)ο蠓椒陀^世界是由對(duì)象構(gòu)成的,每一個(gè)對(duì)象都有自己的運(yùn)動(dòng)規(guī)律和內(nèi)部狀態(tài),不同對(duì)象之間可以相互作用或互相通信。面向?qū)ο笫且环N適用于直觀模型化的設(shè)計(jì)方法。1.2什么是面向過程和面向?qū)ο笞鳛榭朔浖?fù)雜性的手段,在面向?qū)ο蠹夹g(shù)中,利用了如下對(duì)象的性質(zhì):將密切相關(guān)的數(shù)據(jù)和過程封裝起來定義為一個(gè)實(shí)體;定義了一個(gè)實(shí)體后,即使不知道此實(shí)體的功能是怎樣實(shí)現(xiàn)的,也能使用它們。1.2什么是面向過程和面向?qū)ο竺嫦驅(qū)ο笤O(shè)計(jì)非常注重設(shè)計(jì)方法,因?yàn)樗a(chǎn)生一種與現(xiàn)實(shí)具有自然關(guān)系的軟件系統(tǒng),而現(xiàn)實(shí)就是一種模型實(shí)際上,用面向?qū)ο蠓椒ň幊痰年P(guān)鍵是模型化程序員的責(zé)任是構(gòu)造現(xiàn)實(shí)的軟件模型。此時(shí),計(jì)算機(jī)的觀點(diǎn)是不重要的,而現(xiàn)實(shí)生活的觀點(diǎn)才是最重要的。1.2什么是面向過程和面向?qū)ο罅?xí)題1.2除了C語言,讀者還用過或者知道哪些程序設(shè)計(jì)語言可以歸類為面向過程的語言?與C語言相比,它們都有哪些異同?習(xí)題1.3除了本書介紹的C++,讀者還用過或者知道哪些程序設(shè)計(jì)語言可以歸類為面向?qū)ο蟮恼Z言?它們各自擁有什么鮮明的特點(diǎn)?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)的操作集合封裝在一起,形成一個(gè)能動(dòng)的實(shí)體,稱為“對(duì)象”。用戶不必知道對(duì)象行為的實(shí)現(xiàn)細(xì)節(jié),只需根據(jù)對(duì)象提供的外部特性接口訪問對(duì)象。C++用類類型(class)來完成封裝。類的概念面向?qū)ο蠓椒ㄖ械?類"具有相同屬性和行為的一組對(duì)象的集合為屬于該類的全部對(duì)象提供了抽象的描述,包括屬性和行為兩個(gè)主要部分。類與對(duì)象的關(guān)系:
猶如模具與鑄件之間的關(guān)系,是抽象與具體的關(guān)系,一個(gè)屬于某類的對(duì)象稱為該類的一個(gè)實(shí)例。類和對(duì)象的例子
姓名年齡身高體重回答身高回答體重類:人對(duì)象:張三對(duì)象:李四對(duì)象:王五請(qǐng)大家自己構(gòu)思一個(gè)類和對(duì)象的例子1.3面向?qū)ο蠛诵母拍頲lassClock{
public:voidSetTime(intNewH,intNewM,intNewS);
voidShowTime();
private:intHour,Minute,Second;};1.3面向?qū)ο蠛诵母拍?.3.1數(shù)據(jù)封裝習(xí)題1.4請(qǐng)讀者仔細(xì)研究一下自己使用的手機(jī),看看它是怎樣實(shí)現(xiàn)封裝的。1)使用手機(jī)時(shí),您需要知道它的工作原理嗎?2)您需要知道手機(jī)的內(nèi)部結(jié)構(gòu)嗎?如果不知道,您還可以使用手機(jī)嗎?3)您的手機(jī)對(duì)用戶暴露了哪些可操作的接口?4)所有手機(jī)相同的接口是否都提供了相同或相似的功能?1.3面向?qū)ο蠛诵母拍?.3.2繼承整體和部分一般和特殊如果存在類A和類B,并且:(1)類A的所有屬性和方法均包含在類B中;(2)類B中可以有類A沒有的屬性或方法那么,類B繼承類A,同時(shí)稱類B為類A的子類、類A為類B的父類。1.3面向?qū)ο蠛诵母拍?.3.2繼承自然界中的繼承昆蟲1.3面向?qū)ο蠛诵母拍罘诸悩涞奶攸c(diǎn):最高層(根結(jié)點(diǎn))具有最普遍的特性其下的每一層中,每個(gè)節(jié)點(diǎn)擁有的描述都比它之前的層更具體一旦某個(gè)特征定義下來,所有在它之下的種類都要包含該特征1.3面向?qū)ο蠛诵母拍罾^承的術(shù)語基類(baseclass):抽象出共同特征派生類(derivedclass):派生類表達(dá)其差別Person類Student類1.3面向?qū)ο蠛诵母拍盍?xí)題1.5在現(xiàn)實(shí)世界中,讀者還可以觀察到哪些事務(wù)具有本小節(jié)描述的層次結(jié)構(gòu)?它們具有繼承的特性嗎?
姓名年齡身高體重回答身高回答體重類:人類:教師類:學(xué)生
所教課程回答所教課程
年級(jí)回答幾年級(jí)學(xué)生研究生博士研究生本科生碩士研究生1.3面向?qū)ο蠛诵母拍?.3.3多態(tài)性多態(tài)的概念:所謂多態(tài),簡(jiǎn)單地講,就是指一個(gè)名字(或符號(hào))具有多種含義多態(tài)的實(shí)現(xiàn)方式函數(shù)重載運(yùn)算符重載為什么需要多態(tài)?用戶關(guān)心的是函數(shù)的功能及其使用接口,而并不需要了解該函數(shù)的使用接口與函數(shù)的哪一種實(shí)現(xiàn)方法相匹配(binding)1.3面向?qū)ο蠛诵母拍頒++中的多態(tài)靜態(tài)多態(tài):普通函數(shù)重載動(dòng)態(tài)重載:虛函數(shù)函數(shù)重載的例子intf(){return0;}intf(inta){return++a;}提問:請(qǐng)大家觀察以上兩個(gè)重載的函數(shù)有什么異同?1.3面向?qū)ο蠛诵母拍盍?xí)題1.6在現(xiàn)實(shí)世界中,讀者還可以觀察到哪些事務(wù)具有本小節(jié)描述的“一個(gè)接口,多種實(shí)現(xiàn)”的特性?這些特性是否可以視為一種多態(tài)形式?例如:加號(hào)+->實(shí)數(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泛型編程泛型編程的概念:以獨(dú)立于任何特定類型的方式編寫代碼。泛型編程的實(shí)現(xiàn)方式函數(shù)模板類模板1.3面向?qū)ο蠛诵母拍罾壕帉懬笠粋€(gè)數(shù)的絕對(duì)值函數(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ì)算機(jī)中,生成后綴為cpp的文件。編譯將程序的源代碼轉(zhuǎn)換為機(jī)器語言代碼。連接將多個(gè)源程序文件以及庫中的某些文件連在一起,生成一個(gè)后綴為exe的可執(zhí)行文件。運(yùn)行調(diào)試1.4C++程序的編寫和運(yùn)行步驟1.4C++程序概貌1.4.1第一個(gè)C++程序例1-1(ex1-1.cpp)1.4.2C++程序的編輯、編譯和鏈接編輯編譯鏈接習(xí)題1.7請(qǐng)讀者嘗試將本小節(jié)的示例程序輸入、編譯和鏈接。注意觀察C++程序與C程序的不同之處1.5貫穿全書的案例一位小學(xué)教師Ken希望完成這樣的任務(wù):(1)針對(duì)于小學(xué)生正在學(xué)習(xí)四邊形(quadrangle)的特性,編寫一個(gè)小軟件,能夠隨機(jī)在屏幕上顯示矩形(rectangle)、正方形(square)、平行四邊形(parallelogram)、梯形(trapezoid)和菱形(diamond)五種形體之一(2)顯示該形體的特性和關(guān)鍵數(shù)據(jù)(隨機(jī)產(chǎn)生)(3)學(xué)生復(fù)習(xí)形體的特性,然后根據(jù)給出的關(guān)鍵數(shù)據(jù)計(jì)算形體的面積,軟件判斷其結(jié)果的正確性(4)在學(xué)習(xí)過程中,軟件記錄產(chǎn)生的每一個(gè)形體,在學(xué)生選擇不再繼續(xù)后,將其學(xué)習(xí)的過程重放一遍,用以重溫,加深印象。1.5貫穿全書的案例請(qǐng)各位同學(xué)仔細(xì)閱讀這個(gè)貫穿全書的例子,同時(shí)用C的知識(shí)思考一下,如何去完成任務(wù)本次課程內(nèi)容回顧面向?qū)ο蟮乃枷肜斫馀c面向過程方法的區(qū)別面向?qū)ο蟮幕靖拍睿ㄖ攸c(diǎn))掌握對(duì)象、類、抽象、封裝、繼承、多態(tài)C++程序的編寫和運(yùn)行步驟(了解)1、下列不屬于面向?qū)ο蠹夹g(shù)的基本特征的是()。
A.
封裝性B.
模塊性
C.
多態(tài)性D.
繼承性2、()是對(duì)具有相同屬性和行為的對(duì)象集合的抽象描述。A.系統(tǒng)B.實(shí)體C.對(duì)象D.類3、封裝的目的是實(shí)現(xiàn)信息的有效()共享B.隱藏C.操作D.繼承課堂練習(xí)C++程序設(shè)計(jì)與實(shí)踐第二章C++的數(shù)據(jù)類型上節(jié)課知識(shí)點(diǎn)回顧面向過程編程方法與面向?qū)ο缶幊谭椒ǖ膮^(qū)別;面向過程:自頂向下抽象,分解面向?qū)ο螅耗M現(xiàn)實(shí)世界的對(duì)象面向?qū)ο蟮膸讉€(gè)核心概念封裝(抽象):類和對(duì)象繼承多態(tài)泛型編程繼承與派生的例子第二章C++的數(shù)據(jù)類型本章要點(diǎn)C++的數(shù)據(jù)類型。C++提供多種數(shù)據(jù)類型,以適應(yīng)不同程序的需要。標(biāo)準(zhǔn)C++增加了bool類型和引用類型。標(biāo)識(shí)符。標(biāo)識(shí)符是程序的基本元素,用以表示一個(gè)程序分量。const說明符。C++使用const說明符來定義常量。const還可以修飾指針,使指針指向的單元或是指針本身成為常量。引用類型。引用是一個(gè)單元的別名。使用引用就是使用被引用單元本身。引用可以單獨(dú)使用,但更多的是作為函數(shù)參數(shù)和函數(shù)的返回值使用。new和delete運(yùn)算符。使用這兩個(gè)運(yùn)算符可以更好地進(jìn)行動(dòng)態(tài)內(nèi)存管理。類型轉(zhuǎn)換。除了C風(fēng)格的類型轉(zhuǎn)換方式外,C++引入了類型安全的顯式類型轉(zhuǎn)換機(jī)制。2.1C++數(shù)據(jù)類型概覽C++擁有如下數(shù)據(jù)類型:簡(jiǎn)單類型:包括整數(shù)類型(integral)、浮點(diǎn)類型(floatpoint)、枚舉類型(enumeratione)地址類型:包括引用類型(reference)、指針類型(pointer)結(jié)構(gòu)化類型:包括數(shù)組類型(array)、結(jié)構(gòu)體類型(structure)、聯(lián)合體類型(union)、類類型(class)空類型(void)。這種類型只有空類型一種。2.2標(biāo)識(shí)符、變量和常量標(biāo)識(shí)符(identifier)是高級(jí)程序設(shè)計(jì)語言用到的詞匯。程序員自定義的標(biāo)識(shí)符通常用來代替字面(literal)值參與運(yùn)算。標(biāo)識(shí)符表示的數(shù)據(jù)有可變和不可變之分。不可變數(shù)據(jù)稱為“常量(constant)”,而可變數(shù)據(jù)稱為“變量(variable)”。2.2標(biāo)識(shí)符、變量和常量2.2.1標(biāo)識(shí)符標(biāo)識(shí)符是由字母A-Z,a-z和數(shù)字0-9混合而成的,另外可以加入下劃線’_’。不過,所有的標(biāo)識(shí)符必須以字母或者是下劃線開頭。C++保留了一些預(yù)先定義好的標(biāo)識(shí)符,稱為“關(guān)鍵字(keywords)”或“保留字(reservedwords)
”C++的保留字參考教材附件12.2標(biāo)識(shí)符、變量和常量2.2.2常量字面常量(literalconstant)r*r*3.14命名常量(namedconstant)constfloatPI=3.14;提問:請(qǐng)大家說說命名常量的優(yōu)點(diǎn)。2.2標(biāo)識(shí)符、變量和常量2.2.3變量變量定義的語法:類型名變量列表;變量的內(nèi)存映像:intcounter;100……0x0013FF78counter變量的值內(nèi)存單元的符號(hào)名,即變量名整型單元的大小在32位機(jī)上是4字節(jié)變量的32位地址,以第一個(gè)字節(jié)的地址來表示2.2標(biāo)識(shí)符、變量和常量2.2.4變量的初始化復(fù)制初始化(copy-initialization):inti=1,j=i;charch
='A';直接初始化(direct-initialization):inti(1),j(i);charch('A');完成習(xí)題2.32.3簡(jiǎn)單數(shù)據(jù)類型C++三種簡(jiǎn)單數(shù)據(jù)類型:整數(shù)類型、浮點(diǎn)類型、枚舉類型。2.3.1整數(shù)類型2.3.1整數(shù)類型
字符類型字符常量單引號(hào)括起來的一個(gè)字符,如:'a','D','?','$'字符變量用來存放字符常量
例:charc1,c2;
c1='a';
c2='A';字符數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式以ASCII碼存儲(chǔ),占1字節(jié),用7個(gè)二進(jìn)制位2.3.1整數(shù)類型字符數(shù)據(jù)的使用方法字符數(shù)據(jù)和整型數(shù)據(jù)之間可以運(yùn)算。字符數(shù)據(jù)與整型數(shù)據(jù)可以互相賦值。字符串常量例:"CHINA"
"a"
'a'所以:charc;
c="a";CHINA\0a
\0a2.3.1整數(shù)類型
Bool
類型布爾類型的表達(dá)范圍非常有限,只能取false(0)和true(非0)兩個(gè)值true和false是字面常量標(biāo)識(shí)符,并不是字符串凡是會(huì)產(chǎn)生邏輯值的地方都產(chǎn)生bool類型的結(jié)果2.3簡(jiǎn)單數(shù)據(jù)類型2.3.2浮點(diǎn)類型#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;}實(shí)型常量float4字節(jié)
3.4×10±387位有效數(shù)字double8字節(jié)
1.7×10±30815位有效數(shù)字longdouble
8字節(jié)
1.7×10±30815位有效數(shù)字實(shí)型變量缺省為double型后綴F(或f)
為float型后綴L(或l)
為longdouble
型2.3簡(jiǎn)單數(shù)據(jù)類型2.3.3枚舉類型枚舉類型用來表示對(duì)象的狀態(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個(gè)字節(jié)組成每個(gè)字節(jié)都有各自唯一的地址變量counter的地址2.4地址類型指針的聲明指針:用來表示內(nèi)存地址,用于間接訪問內(nèi)存單元指針變量:用于存放地址的變量指針變量的聲明:數(shù)據(jù)類型*標(biāo)識(shí)符;2.4地址類型1、指針的聲明語法形式
存儲(chǔ)類型數(shù)據(jù)類型*指針名=初始地址例:int*pa=&a;1.存儲(chǔ)類型是指指針變量本身的存儲(chǔ)類型,2.?dāng)?shù)據(jù)類型是指該指針可以指向該數(shù)據(jù)類型的變量。3.*號(hào)表示后面的變量是指針變量。4.初始值通常為某個(gè)變量名或?yàn)镹ULL。如:int*p;/*p為指向整型變量的指針*/char*s;/*s為指向整型字符型變量的指針*/float*t;/*t為指向單精度浮點(diǎn)型變量的指針*/68指針變量的賦值指針變量一旦定義,必須采用賦值的方式將其與某個(gè)變量實(shí)體相聯(lián)系,才能使用。指針變量的賦值方式:指針變量名=&普通變量名;如:inti,j,*p,*q=&j;p=&i;或:inti,*p;*p=i;兩種形式都是將變量i的地址賦給了指針p。指針變量是用來保存某個(gè)變量的地址的,而地址是內(nèi)存單元的編號(hào),因此指針變量的值的數(shù)據(jù)類型是無符號(hào)的整型。
&的位置1、&出現(xiàn)在變量聲明語句中被聲明變量左邊表示聲明的是引用如:int&f;2、&給變量賦初值出現(xiàn)在等號(hào)右邊或執(zhí)行語句中表示取對(duì)象地址2.4地址類型4.const作用于指針三種形式:1)constint*p;p是變量,但指向了常量;2)int*constp;p是常量,但指向了變量;3)constint*constp;常量指針指向了常量完成習(xí)題2.52.4地址類型2.4.2引用類型引用的定義簡(jiǎn)而言之,引用就是對(duì)象的別名,即一個(gè)對(duì)象擁有多個(gè)名字。例如:inta=100;int&ra=a;a和ra是同一個(gè)單元的不同名字!100……ara2.4地址類型2.引用的使用inta=1,b=2;int&ra=a;++ra的結(jié)果是2,與++a完全等效。而操作ra=b并非是使ra成為b的引用,而是將b的值賦給ra,也就是直接賦給a。提示:獨(dú)立引用必須被初始化!2.4地址類型指針和引用的對(duì)比inta=100,*p=&a,&ra=a;a的值是100;對(duì)象ra就是對(duì)象a,它的值是100;p的值是0x0013FF78,也就是a的地址;*p的值是對(duì)象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; //錯(cuò)誤,非常量引用指向常量例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;錯(cuò)誤6.數(shù)組的初始化inta[3]={1,2,3};intb[]={1,2,3}; //b的長(zhǎng)度為32.5結(jié)構(gòu)化類型2.5.3typedeftypedef int INT;typedef double(*DBLARRPTR)[10]; //定義一個(gè)指針類型,該類型的指針指向一個(gè)長(zhǎng)度為的double型一維數(shù)組typedef int& INTREF; //定義了整型引用類型INT anInt;DBLARRPTR dblArr; //dblArr是個(gè)數(shù)組,而不是一個(gè)簡(jiǎn)單變量INTREF ra
=anInt; //ra成為anInt的別名2.6運(yùn)算符和表達(dá)式2.6.1常用運(yùn)算符和表達(dá)式元表達(dá)式:字面常量、命名常量、變量賦值表達(dá)式(左值、右值)算術(shù)表達(dá)式關(guān)系表達(dá)式邏輯表達(dá)式條件表達(dá)式逗號(hào)表達(dá)式復(fù)合賦值表達(dá)式混合運(yùn)算表達(dá)式2.6運(yùn)算符和表達(dá)式2.6.1常用運(yùn)算符和表達(dá)式賦值表達(dá)式(左值、右值)對(duì)象=表達(dá)式左值是賦值符號(hào)左邊的值,常量不能作為左值;算術(shù)表達(dá)式基本算術(shù)運(yùn)算符:+-*/%++--優(yōu)先級(jí)與結(jié)合性:先乘除,后加減,同級(jí)自左至右2.6運(yùn)算符和表達(dá)式2.6.2幾種特殊的C++運(yùn)算符sizeof
inta;
sizeof(a);
sizeof(int);提示:在不同的操作系統(tǒng)、編譯環(huán)境、硬件平臺(tái)上,sizeof運(yùn)算符可能會(huì)有得到不同的結(jié)果!2.6運(yùn)算符和表達(dá)式2.new和delete double*p,*q,*t; p=newdouble;
q=newdouble(1.0);
t=newdouble[10];
deletep;
delete[]t;提示:new和delete應(yīng)該成對(duì)出現(xiàn)!2.6運(yùn)算符和表達(dá)式3.類型強(qiáng)制轉(zhuǎn)化運(yù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);
//危險(xiǎn)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ù)中初始化一個(gè)矩陣并將每個(gè)元素都輸出,然后調(diào)用子函數(shù),分別計(jì)算每一行的元素之和,將和直接存放在每行的第一個(gè)元素中,返回主函數(shù)之后輸出各行元素的和。課堂練習(xí)題3設(shè)有一個(gè)int型數(shù)組a,有10個(gè)元素。用三種方法輸出各元素:使用數(shù)組名和下標(biāo)使用數(shù)組名和指針運(yùn)算使用指針變量課堂練習(xí)題4P35-習(xí)題2.3P41-習(xí)題2.7P48-習(xí)題2.10C++程序設(shè)計(jì)與實(shí)踐第三章C++語句第三章C++語句本章要點(diǎn)C++的語句。C++繼承了所有的C語句,同時(shí)還將變量聲明也視為可執(zhí)行語句C++的控制結(jié)構(gòu)。有順序、選擇和循環(huán)三種結(jié)構(gòu)異常處理語句。新增加的異常處理機(jī)制使程序員可以編寫更加健壯的C++程序3.1C++語句概述在任何合法的C++表達(dá)式后面加上一個(gè)分號(hào)“;”就能使其構(gòu)成一條簡(jiǎn)單而合法的C++語句。控制語句需要特別的語法支持。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異常處理的意義出錯(cuò)處理程序的編寫不再繁瑣。在錯(cuò)誤有可能出現(xiàn)處寫一些代碼,并在后面的單獨(dú)節(jié)中加入出錯(cuò)處理程序錯(cuò)誤發(fā)生是不會(huì)被忽略的。如果被調(diào)用函數(shù)需發(fā)送一條出錯(cuò)信息給調(diào)用函數(shù),它可向調(diào)用函數(shù)發(fā)送描述出錯(cuò)信息的對(duì)象。3.3異常處理語句3.3.2異常處理的方法拋出異常如果程序發(fā)生異常情況,而在當(dāng)前的上下文環(huán)境中獲取不到異常處理的足夠信息,我們可以創(chuàng)建一個(gè)包含出錯(cuò)信息的對(duì)象并將該對(duì)象拋出當(dāng)前上下文環(huán)境,將錯(cuò)誤信息發(fā)送到更大的上下文環(huán)境中。這稱為異常拋出。異常拋出的語法是:throw表達(dá)式;這里的表達(dá)式可以是任意類型變量,但更為常用的辦法是創(chuàng)建一個(gè)新的異常類用異常拋出。3.3異常處理語句2.異常捕獲try{
語句;}[catch(類型1[變量名1]){語句;}catch(類型2[變量名2]){語句;}…catch(類型n[變量名3]){語句;}]try語句括起一個(gè)測(cè)試塊,其中含有可能出錯(cuò)的語句。如果有異常發(fā)生,則會(huì)拋出特定類型的異常。每一個(gè)catch語句是一個(gè)異常處理器,相當(dāng)于一個(gè)帶參數(shù)的函數(shù),功能是對(duì)指定異常類型進(jìn)行處理。一旦一個(gè)異常信號(hào)被拋出,那么與這個(gè)信號(hào)有相同類型參數(shù)的catch子句會(huì)捕獲這個(gè)異常并處理。處理完成后整個(gè)異常處理流程結(jié)束。3.3異常處理語句在異常處理結(jié)束后,需要對(duì)異常進(jìn)行恢復(fù)?;謴?fù)意味著希望異常處理器能夠修改狀態(tài),然后再次對(duì)錯(cuò)誤函數(shù)進(jìn)行檢測(cè),使之在第二次調(diào)用時(shí)能夠成功運(yùn)行。一般的做法是將測(cè)試塊放入循環(huán)中,以便始終裝入測(cè)試塊直到恢復(fù)成功并得到滿意的結(jié)果。3.3異常處理語句2.異常規(guī)格說明在函數(shù)頭部說明異常拋出情況。拋出指定類型異常voidf()throw(toobig,toosmall,divzero);拋出任何一種異常voidf();不會(huì)有異常拋出voidf()throw();例3-8:異常處理語句的使用(ex3-8.cpp)作業(yè)P60-3.5P67-3.7C++程序設(shè)計(jì)與實(shí)踐第四章函數(shù)上次課的內(nèi)容回顧C(jī)++的數(shù)據(jù)類型基本類型:整型、浮點(diǎn)型、枚舉型、地址類型:引用、指針結(jié)構(gòu)化類型:數(shù)組、結(jié)構(gòu)體、聯(lián)合體、類void類型基本概念標(biāo)示符常量變量運(yùn)算符和表達(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;}程序運(yùn)行結(jié)果如下:5/2=2exceptofdevidingzero.thatisok.第四章函數(shù)本章要點(diǎn)函數(shù)的原型聲明和定義。C++編譯器根據(jù)函數(shù)原型生成正確的代碼。函數(shù)的參數(shù)和返回值。函數(shù)的參數(shù)和返回值可以是值、指針和引用,它們有不同的作用。C++函數(shù)可以有默認(rèn)參數(shù)函數(shù)重載。函數(shù)重載是指多個(gè)函數(shù)擁有相同的名字,但必須有不同的參數(shù)。4.1函數(shù)的原型聲明和定義
函數(shù)是面向?qū)ο蟪绦蛟O(shè)計(jì)中,對(duì)功能的抽象函數(shù)定義的語法形式[返回值類型標(biāo)識(shí)符]指的是函數(shù)體語句執(zhí)行完成后,函數(shù)返回的值的類型,如int,float等,若函數(shù)無返回值,則用空類型void來定義函數(shù)的返回值。缺省情況為int型。4.1函數(shù)的原型聲明和定義
函數(shù)的定義函數(shù)名由任何合法的標(biāo)識(shí)符構(gòu)成。建議將函數(shù)名的命名與函數(shù)內(nèi)容有一定關(guān)系。形式參數(shù)表<type1>name1,<type2>name2,...,<typen>namen[形參說明表]是一系列用逗號(hào)分開的每個(gè)形參變量說明。如:intx,inty,int
z這表示形參變量有三個(gè):x,y,z。它們的類型都是int型。4.1函數(shù)的原型聲明和定義
函數(shù)的返回值由return
語句給出,例如:
return0;無返回值的函數(shù)(void類型),不必寫return語句。函數(shù)返回語句的形式有以下兩種:①函數(shù)無返回值的情況:return;②函數(shù)有返回值的情況:return(表達(dá)式的值);在第②種情況下要注意“表達(dá)式的值”的類型必須與函數(shù)返回值的類型相一致。函數(shù)語句體是放在一對(duì)花括號(hào){}中,由局部數(shù)據(jù)類型描述和功能實(shí)現(xiàn)兩部分組成。4.1函數(shù)的原型聲明和定義
無返回值函數(shù)通過其副作用來體現(xiàn)其功能voidHi(void){cout<<“Hi!”<<endl;}一個(gè)程序只能有一個(gè)(main)主函數(shù),主函數(shù)可以聲明為有參函數(shù),也可以聲明為無參函數(shù);可以聲明為有返回值函數(shù),也可以聲明為無返回值函數(shù)。4.1函數(shù)的原型聲明和定義函數(shù)的調(diào)用調(diào)用前先聲明函數(shù)原型:在調(diào)用函數(shù)中,或程序文件中所有函數(shù)之外,按如下形式說明:類型標(biāo)識(shí)符被調(diào)用函數(shù)名(含類型說明的形參表);使用位置:函數(shù)調(diào)用之前使用情況:函數(shù)定義出現(xiàn)在函數(shù)調(diào)用之后,或在其它文件調(diào)用形式函數(shù)名(實(shí)參列表)實(shí)參個(gè)數(shù)應(yīng)該與形參個(gè)數(shù)相同實(shí)參表達(dá)式類型應(yīng)該與形參對(duì)應(yīng)表達(dá)式類型相同調(diào)用時(shí)實(shí)參表達(dá)式的值被傳遞給函數(shù),為對(duì)應(yīng)的形參變量所接受函數(shù)調(diào)用兩種情形
作為表達(dá)式的函數(shù)調(diào)用
例:s=min(5,7)*5;這時(shí)函數(shù)本身是一個(gè)表達(dá)式,或是某個(gè)表達(dá)式的一個(gè)子表達(dá)式,其值參與表達(dá)式求值
無返回值的函數(shù)不能被作為表達(dá)式加以調(diào)用2.作為語句的函數(shù)調(diào)用通過函數(shù)的副作用發(fā)揮其作用
若調(diào)用的是有返回值的函數(shù),其返回值被舍棄
函數(shù)的作用通過其副作用被實(shí)現(xiàn),沒有副作用的函數(shù)作為語句調(diào)用無意義
例:min(5,7);//無意義函數(shù)調(diào)用的執(zhí)行過程main()調(diào)fun()結(jié)束fun()返回①②④⑥⑦保存:返回地址當(dāng)前現(xiàn)場(chǎng)③恢復(fù):主調(diào)程序現(xiàn)場(chǎng)返回地址⑤嵌套調(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ù)(簡(jiǎn)稱形參)”。在編譯時(shí),形式參數(shù)不具有任何實(shí)際的值。這些值需要在運(yùn)行時(shí)通過函數(shù)調(diào)用的形式,將實(shí)際的值(稱為“實(shí)際參數(shù)(簡(jiǎn)稱實(shí)參)”)傳遞給形式參數(shù),以便完成需要的運(yùn)算。這個(gè)過程稱為“形參和實(shí)參的結(jié)合”。4.2函數(shù)的參數(shù)和返回值1.參數(shù)結(jié)合的三種方式1)傳值C++采用傳值(callbyvalue)方式進(jìn)行參數(shù)傳遞。也就是說,在參數(shù)結(jié)合時(shí),形參是實(shí)參的一個(gè)復(fù)制品,形參和實(shí)參是兩個(gè)不同的單元。這樣,形參的改變不會(huì)影響實(shí)參。這樣的形參往往也被稱為“值參數(shù)”或者“輸入?yún)?shù)”。
4.2函數(shù)的參數(shù)和返回值2)傳指針傳遞指針實(shí)際上仍屬于傳值的范疇:形參指針是實(shí)參指針的拷貝。不過,這兩個(gè)指針指向了同一個(gè)單元。因此,通過這兩個(gè)指針的任何一個(gè)都可以間接地改變實(shí)參的值。4.2函數(shù)的參數(shù)和返回值3)傳引用實(shí)參和形參結(jié)合的第三種也是最好的一種方法就是傳遞引用。我們都知道,引用是一個(gè)單元的別名。這種別名結(jié)合也適用于參數(shù)結(jié)合。當(dāng)形參是一個(gè)引用時(shí),那么在函數(shù)內(nèi)部,形參就是實(shí)參的別名,換句話說,形參就是實(shí)參本身,因此對(duì)形參的改變就會(huì)直接改變實(shí)參。提示:引用形參與實(shí)參的別名綁定不是永久性的,而只在函數(shù)作用范圍內(nèi)起作用。例4-2:兩個(gè)變量交換值(ex4-2.cpp)輸入兩個(gè)整數(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;}運(yùn)行結(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ù)具有實(shí)參被更改的潛在“危險(xiǎn)”。為了避免這種危險(xiǎn),可以給形參加上const約束,這是形參/實(shí)參成為只讀參數(shù),從而避免了被更改的問題。例如:voidfunc(const
int*pi){
inta=*pi; //正確 *pi=0; //錯(cuò)誤,因?yàn)閜i指向的單元被視為常量 pi=&a; //正確,因?yàn)閜i不是常量指針}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時(shí),num對(duì)應(yīng)的實(shí)參可以有,也可以沒有(缺?。?。fun(10);//傳遞顯式的值,則num的初始值為10fun();//無對(duì)應(yīng)的實(shí)參,則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ù)返回一個(gè)值類型,實(shí)際上是將返回的值放到一個(gè)臨時(shí)對(duì)象中int
Strlen(constchar*str){char*p=const_cast<char*>(str);while(*p!='\0')++p;returnp–str;}4.2函數(shù)的參數(shù)和返回值2.函數(shù)返回指針函數(shù)返回指針,實(shí)際上也是返回一個(gè)值,只不過這個(gè)值是某個(gè)單元的地址。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ù)返回引用,實(shí)際上返回的是一個(gè)對(duì)象,是個(gè)左值,只不過是匿名的例4-4:函數(shù)返回引用(ex4-4.cpp)與返回指針一樣,函數(shù)返回的引用單元也必須在被調(diào)函數(shù)返回后一直有效。4.2函數(shù)的參數(shù)和返回值默認(rèn)形參值與函數(shù)的調(diào)用位置調(diào)用出現(xiàn)在函數(shù)體實(shí)現(xiàn)之前時(shí),默認(rèn)形參值必須在函數(shù)原形中給出;而當(dāng)調(diào)用出現(xiàn)在函數(shù)體實(shí)現(xiàn)之后時(shí),默認(rèn)形參值需在函數(shù)實(shí)現(xiàn)時(shí)給出。例:123intadd(intx=5,inty=6);voidmain(void){add();//調(diào)用在實(shí)現(xiàn)前}intadd(intx,inty){returnx+y;}intadd(intx=5,inty=6){returnx+y;}voidmain(void){add();//調(diào)用在實(shí)現(xiàn)后}4.3函數(shù)重載當(dāng)兩個(gè)或多個(gè)在相同范圍內(nèi)的聲明用的是同一個(gè)名字時(shí),這個(gè)名字就被稱為“重載(overloading)”。在C++中,只有函數(shù)能夠被重載,其中包括運(yùn)算符函數(shù)。例如:doubleabs(doublenum){return((num<0)?-num:num);}longabs(longnum){return((num<0)?-num:num);}4.3函數(shù)重載雖然兩個(gè)函數(shù)擁有相同的名字,但它們的參數(shù)類型是不同的。其實(shí),只要編譯器能區(qū)分參數(shù)的類型,或者參數(shù)的個(gè)數(shù),那么就可以重載一個(gè)函數(shù)。函數(shù)重載有以下禁忌:僅返回值類型不同而其它部分相同的函數(shù)不能重載;同一個(gè)作用域中的函數(shù)不能原型一致地重載。如果要重載,那么必須在參數(shù)列表上有所不同。4.3函數(shù)重載1.重載聲明由于函數(shù)重載只以參數(shù)作為參考點(diǎn),因此這里就對(duì)重載函數(shù)的參數(shù)進(jìn)行一些說明。例子中的重載函數(shù)是不能被接受的。1)用typedef定義的類型別名與原類型等效。例如:typedef
intINT;voidf(int
i){…}//函數(shù)定義voidf(INT
i){…}//錯(cuò)誤,重定義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)用時(shí)編譯器無法區(qū)分cv-修飾符。例如:voidk(int){…}voidk(const
int){…}//錯(cuò)誤,重定義k(int)5)不同函數(shù)的對(duì)應(yīng)參數(shù)僅是默認(rèn)參數(shù)的不同時(shí),它們是等效的。例如:voidp(inti=0);voidp();voidq(){ p();} //錯(cuò)誤,調(diào)用的是p(int)還是p()?4.3函數(shù)重載2.重載匹配方案在調(diào)用重載函數(shù)是,編譯器會(huì)首先查詢與給定參數(shù)類型和個(gè)數(shù)完全匹配的重載版本。例如,函數(shù)調(diào)用abs(1.0)會(huì)匹配abs(double),abs(1L)會(huì)匹配abs(long)。但abs(1.0f)會(huì)匹配哪一個(gè)呢?intadd(intx,inty);intadd(inta,intb);編譯器不以形參名來區(qū)分intadd(intx,inty);voidadd(intx,inty);編譯器不以返回值來區(qū)分函數(shù)重載舉例編寫三個(gè)名為add的重載函數(shù),分別實(shí)現(xiàn)兩整數(shù)相加、兩實(shí)數(shù)相加和兩個(gè)復(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;}運(yùn)行例子運(yùn)行結(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存儲(chǔ)類修飾符C++的存儲(chǔ)類修飾符有五種,分別是:auto和register:修飾的對(duì)象是局部的extern:修飾的對(duì)象名出現(xiàn)在同一應(yīng)用的不同文件中static:修飾的對(duì)象是靜態(tài)的4.5標(biāo)識(shí)符的作用域和生命期4.5.1作用域和生命期一個(gè)程序空間定義了一個(gè)全局作用域(globalscope),簡(jiǎn)稱“全局域”。屬于該程序的任何語法成分都被定義在這個(gè)唯一的全局域中。一個(gè)名字空間、一個(gè)類和一個(gè)全局函數(shù)類的成員函數(shù)函數(shù)(包括全局函數(shù))中的語句塊實(shí)際上,用一種簡(jiǎn)單的觀點(diǎn)來看,除全局域外,一對(duì)花括號(hào){}就定義了一個(gè)作用域。而在最外層{}之外,就是全局作用域。4.5.1作用域和生命期任何一個(gè)標(biāo)識(shí)符(亦稱名字)都會(huì)被定義在某個(gè)作用域中//前面的代碼中不包含標(biāo)識(shí)符a的定義a=0;//錯(cuò)誤,使用了未定義的標(biāo)識(shí)符{//定義了一個(gè)作用域的開始
inta;//a的作用域和生命期從其定義開始 a=1;//正確}//作用域的結(jié)束,標(biāo)識(shí)符a的作用域和生命期也隨之結(jié)束++a;//錯(cuò)誤,超過了作用域,對(duì)象a已經(jīng)失效4.5.2名字限定限定的名字有如下的語法形式:
作用域名::標(biāo)識(shí)符如果上述標(biāo)識(shí)符來自于一個(gè)嵌套的作用域,那么限定名字的語法形式為:
外層作用域名::嵌套作用域名::標(biāo)識(shí)符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)時(shí),將不能正確工作內(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)用時(shí)發(fā)生控制轉(zhuǎn)移,而是在編譯時(shí)將函數(shù)體嵌入在每個(gè)調(diào)用處。內(nèi)聯(lián)函數(shù)的定義方法和格式:inline函數(shù)值的類型函數(shù)名(形參及其類型列表){函數(shù)體}作用:提高運(yùn)行效率4.6函數(shù)的其他話題聲明時(shí)使用關(guān)鍵字inline。編譯時(shí)在調(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)用之前。對(duì)內(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; //請(qǐng)注意括起引用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";}運(yù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ù)開始,是整個(gè)程序運(yùn)行的入口,該函數(shù)中可能包含的內(nèi)容主要有:(1)局部變量的聲明:如:inti=1;(2)函數(shù)調(diào)用:如:y=sin(x);(3)一般運(yùn)算:如:a=b+c+d/3;(4)結(jié)構(gòu)控制:如:if(a>b)c=a;(5)對(duì)象與結(jié)構(gòu)的處理。(6)文件的處理等。3.函數(shù)定義區(qū)
程序中除了main函數(shù)之外,還可以包含其它的函數(shù),每個(gè)函數(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ù)從一個(gè)對(duì)象到另一個(gè)對(duì)象的流動(dòng)抽象為“流”。流在使用前要被建立,使用后要被刪除;從流中獲取數(shù)據(jù)的操作稱為提取操作;向流中添加數(shù)據(jù)的操作稱為插入操作;數(shù)據(jù)的輸入與輸出是通過流來實(shí)現(xiàn)的;cin是預(yù)定義的用來處理標(biāo)準(zhǔn)輸入的流類對(duì)象--鍵盤;cout是預(yù)定義的用來處理標(biāo)準(zhǔn)輸出的流類對(duì)象—屏幕;預(yù)定義的插入符<<“<<”是預(yù)定義的插入符,作用在流類對(duì)象cout上,用來實(shí)現(xiàn)屏幕輸出。
格式:cout<<表達(dá)式<<表達(dá)式...在輸出語句中,可以串聯(lián)多個(gè)插入運(yùn)算符,輸出多個(gè)數(shù)據(jù)項(xiàng)。在插入運(yùn)算符后面可以寫任意的表達(dá)式,系統(tǒng)會(huì)自動(dòng)計(jì)算出它們的值并傳遞給插入符。例如:
cout<<“Hello!\n”;將字符串“Hello!”輸出到屏幕上并換行。
cout<<“a+b”<<a+b;將字符串“a+b”和表達(dá)式a+b的計(jì)算結(jié)果依次在屏幕上輸出。預(yù)定義的提取符>>“>>”是預(yù)定義的提取符,作用在流類對(duì)象cint上,用來實(shí)現(xiàn)鍵盤輸入。
格式:cin>>變量>>變量...
在輸入語句中,可以串聯(lián)多個(gè)提取運(yùn)算符,用于實(shí)現(xiàn)給多個(gè)變量輸入數(shù)據(jù),變量的類型可以不一致。例如:
inta,b;
cin>>a>>b;要求從鍵盤上輸入兩個(gè)int型數(shù),兩數(shù)之間以空格分隔。若輸入56這時(shí),變量a得到的值為5,變量b得到的值為6。簡(jiǎn)單的I/O格式控制在數(shù)據(jù)輸入輸出時(shí),cin和cout能對(duì)數(shù)據(jù)自動(dòng)按正確的格式進(jìn)行處理,除此之外,還可按特殊的格式加以處理。這些操縱符可以直接嵌入到輸入輸出語句中實(shí)現(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è)置浮點(diǎn)數(shù)的小數(shù)點(diǎn)位數(shù)(包括小數(shù)點(diǎn))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í)題講解編寫一個(gè)求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);}運(yùn)行結(jié)果:5tothepower2is25習(xí)題講解輸入兩個(gè)整數(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);}運(yùn)行結(jié)果:34a、b的平方和:25習(xí)題講解求n!分析:計(jì)算n!的公式如下:這是一個(gè)遞歸形式的公式,應(yīng)該用遞歸函數(shù)實(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;}運(yùn)行結(jié)果:Enterapositiveinteger:88!=40320習(xí)題講解使用內(nèi)聯(lián)函數(shù)計(jì)算圓的面積#include<iostream>usingnamespacestd;inlinedoubleCalArea(doubleradius)//計(jì)算圓的面積{ return3.14*radius*radius;}習(xí)題講解voidmain(){ doubler(3.0);//r是圓的半徑
doublearea; area=CalArea(r); //調(diào)用內(nèi)聯(lián)函數(shù)求圓的面積,編譯時(shí)此處被替換為CalArea函數(shù)體語句
cout<<area<<endl;}第一次課后作業(yè)P76-4.2、4.3P78-4.4要求:作業(yè)的內(nèi)容需要實(shí)際編譯通過,給出結(jié)果的截圖。簡(jiǎn)單的寫出你的設(shè)計(jì)思路。代碼可打印(可手寫)C+
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 45123-2024公共安全生物特征識(shí)別應(yīng)用算法評(píng)測(cè)數(shù)據(jù)庫要求
- 二零二五年度高風(fēng)險(xiǎn)投資財(cái)產(chǎn)分割離婚協(xié)議書3篇
- 二零二五年股權(quán)質(zhì)押貸款資產(chǎn)評(píng)估及處置合同3篇
- 二零二五年度高端家具定制加工廠合作協(xié)議2篇
- 2024版場(chǎng)攤位租賃合同范文
- 二零二五年環(huán)境監(jiān)測(cè)兼職工程師合同保密與監(jiān)測(cè)數(shù)據(jù)協(xié)議3篇
- 2025年度物業(yè)與業(yè)主之間物業(yè)服務(wù)合同續(xù)約協(xié)議范本18篇
- 2025年度跨境電商平臺(tái)運(yùn)營(yíng)及品牌推廣合同3篇
- 2024版廣告代理業(yè)務(wù)合同
- 二零二五年度物流運(yùn)輸反擔(dān)保合同與運(yùn)輸工具抵押協(xié)議2篇
- 2025年河北供水有限責(zé)任公司招聘筆試參考題庫含答案解析
- Unit3 Sports and fitness Discovering Useful Structures 說課稿-2024-2025學(xué)年高中英語人教版(2019)必修第一冊(cè)
- (完整版)形式發(fā)票模版(國(guó)際件通用)
- 武漢東湖賓館建設(shè)項(xiàng)目委托代建合同
- 安徽大學(xué)大學(xué)生素質(zhì)教育學(xué)分認(rèn)定辦法
- 巴布亞新幾內(nèi)亞離網(wǎng)光儲(chǔ)微網(wǎng)供電方案
- 高度限位裝置類型及原理
- 中文版gcs electrospeed ii manual apri rev8v00印刷稿修改版
- 新生兒預(yù)防接種護(hù)理質(zhì)量考核標(biāo)準(zhǔn)
- 除氧器出水溶解氧不合格的原因有哪些
- 沖擊式機(jī)組水輪機(jī)安裝概述與流程
評(píng)論
0/150
提交評(píng)論