《C++從入門(mén)到精通》配套教學(xué)課件_第1頁(yè)
《C++從入門(mén)到精通》配套教學(xué)課件_第2頁(yè)
《C++從入門(mén)到精通》配套教學(xué)課件_第3頁(yè)
《C++從入門(mén)到精通》配套教學(xué)課件_第4頁(yè)
《C++從入門(mén)到精通》配套教學(xué)課件_第5頁(yè)
已閱讀5頁(yè),還剩261頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

C++從入門(mén)到精通第1章解開(kāi)C++的神秘面紗——

我的第一個(gè)C++程序本章內(nèi)容1.1認(rèn)識(shí)C++1.2C++的優(yōu)勢(shì)1.3常見(jiàn)的C++開(kāi)發(fā)環(huán)境1.4新手的福音——VisualStudio2017集成環(huán)境1.5熟悉VisualStudio2017開(kāi)發(fā)界面1.6實(shí)戰(zhàn)演練——第一個(gè)C++項(xiàng)目1.7理解C++語(yǔ)言的翻譯過(guò)程1.1認(rèn)識(shí)C++人們對(duì)計(jì)算機(jī)技術(shù)追求的腳步并沒(méi)有停止,C++隨著C語(yǔ)言的發(fā)展而來(lái)。1979年,Bjarne博士為了分析Unix的內(nèi)核,苦于當(dāng)時(shí)沒(méi)有合適的工具將Unix的內(nèi)核模塊化,于是他為C加上了一個(gè)類(lèi)似Simula的機(jī)制,而貝爾實(shí)驗(yàn)室對(duì)Bjarne博士的這種創(chuàng)新非常感興趣,專門(mén)為此成立了一個(gè)開(kāi)發(fā)小組。當(dāng)時(shí),這個(gè)語(yǔ)言并不是叫做C++,而是叫做Cwithclass,它僅僅被當(dāng)作C語(yǔ)言的一種補(bǔ)充。

1.2C++的優(yōu)勢(shì)

(1)C++支持?jǐn)?shù)據(jù)封裝,支持?jǐn)?shù)據(jù)封裝就是支持?jǐn)?shù)據(jù)抽象。在C++中,類(lèi)是支持?jǐn)?shù)據(jù)封裝的工具,對(duì)象則是數(shù)據(jù)封裝的實(shí)現(xiàn)。在C++中,將數(shù)據(jù)和對(duì)該數(shù)據(jù)進(jìn)行合法操作的函數(shù)封裝在一起作為一個(gè)類(lèi)的定義,數(shù)據(jù)將被隱藏在封裝體中,該封裝體通過(guò)操作接口與外界交換信息。對(duì)象被說(shuō)明具有一個(gè)給定類(lèi)的變量。在C++中,結(jié)構(gòu)可作為一種特殊的類(lèi),它雖然可以包含函數(shù),但是它沒(méi)有私有或保護(hù)的成員。(2)C++類(lèi)中包含私有、公有和保護(hù)成員。C++類(lèi)中可定義三種不同訪問(wèn)控制權(quán)限的成員。私有(Private)成員,只有在類(lèi)中說(shuō)明的函數(shù)才能訪問(wèn)該類(lèi)的私有成員,而在該類(lèi)外的函數(shù)不可以訪問(wèn)私有成員;另一種是公有(Public)成員,類(lèi)外面也可訪問(wèn)公有成員,成為該類(lèi)的接口;還有一種是保護(hù)(Protected)成員,這種成員只有該類(lèi)的派生類(lèi)可以訪問(wèn),其余的在這個(gè)類(lèi)外不能訪問(wèn)。(3)C++語(yǔ)言中通過(guò)消息處理對(duì)象,每個(gè)對(duì)象根據(jù)所接收到的消息的性質(zhì)來(lái)決定需要采取的行動(dòng),以響應(yīng)這個(gè)消息。(4)C++中允許友元函數(shù)訪問(wèn)封裝性類(lèi)中的私有成員。私有成員一般是不允許該類(lèi)外面的任何函數(shù)訪問(wèn)的,但是友元函數(shù)便可打破這條禁令,它可以訪問(wèn)該類(lèi)的私有成員(包含數(shù)據(jù)成員和成員函數(shù))。(5)C++允許函數(shù)名和運(yùn)算符重載。支持多態(tài)性,C++允許一個(gè)相同的標(biāo)識(shí)符或運(yùn)算符代表多個(gè)不同實(shí)現(xiàn)的函數(shù),這就稱為標(biāo)識(shí)符或運(yùn)算符的重載,用戶可以根據(jù)需要定義標(biāo)識(shí)符重載或運(yùn)算符重載。(6)C++具有繼承性,可以允許單繼承和多繼承。一個(gè)類(lèi)可以根據(jù)需要生成派生類(lèi)。派生類(lèi)繼承了基類(lèi)的所有方法,另外派生類(lèi)自身還可以定義所需要的不包含在父類(lèi)中的新方法。一個(gè)子類(lèi)的每個(gè)對(duì)象包含有從父類(lèi)那里繼承來(lái)的數(shù)據(jù)成員以及自己所特有的數(shù)據(jù)成員。(7)C++語(yǔ)言支持動(dòng)態(tài)聯(lián)編。C++中可以定義虛函數(shù),通過(guò)定義虛函數(shù)來(lái)支持動(dòng)態(tài)聯(lián)編。1.3常見(jiàn)的C++開(kāi)發(fā)環(huán)境

隨著C++的不斷發(fā)展,C++的集成開(kāi)發(fā)環(huán)境也有著長(zhǎng)足的發(fā)展,其開(kāi)發(fā)環(huán)境主要有以下幾種。1.TurboC++2.C++Builder3.Dev-C++4.Code::Blocks5.VisualStudio6.Eclipse7.Qt8.VisualC++1.4新手的福音——VisualStudio2017集成環(huán)境

1.4.1安裝VisualStudio2017的條件1.4.1安裝VisualStudio20171.4.1安裝VisualStudio2017的條件

支持的操作系統(tǒng)Windows101507版或更高版本:家庭版、專業(yè)版、教育版和企業(yè)版(不支持LTSB)WindowsServer2016:Standard和DatacenterWindows8.1(帶有Update2919355):基本版、專業(yè)版和企業(yè)版WindowsServer2012R2(帶有Update2919355):Essentials、Standard、DatacenterWindows7SP1(帶有最新Windows更新):家庭高級(jí)版、專業(yè)版、企業(yè)版、旗艦版

硬件1.8GHz或更快的處理器。推薦使用雙核或更好內(nèi)核2GBRAM;建議4GBRAM(如果在虛擬機(jī)上運(yùn)行,則最低2.5GB)硬盤(pán)空間:1GB到40GB,具體取決于安裝的功能視頻卡支持最小顯卡分辨率720p(1280×720);VisualStudio最適宜的分辨率為WXGA(1366×768)或更高

其他要求安裝VisualStudio要求具有.NETFramework4.5。VisualStudio需要.NETFramework4.6.1,將在安裝過(guò)程中安裝它與Internet相關(guān)的方案都必須安裝InternetExplorer11或MicrosoftEdge。某些功能可能無(wú)法運(yùn)行,除非安裝了這些程序或更高版本1.5熟悉VisualStudio2017開(kāi)發(fā)界面

1.5.1創(chuàng)建項(xiàng)目1.5.2菜單欄1.5.3工具欄1.5.4解決方案資源管理器1.5.5屬性面板1.5.6錯(cuò)誤列表1.5.7輸出面板1.5.1創(chuàng)建項(xiàng)目

1.5.2菜單欄

1.5.3工具欄

1.5.4工具箱面板

1.5.5屬性面板

1.5.6錯(cuò)誤列表

1.5.7輸出面板

1.6實(shí)戰(zhàn)演練——第一個(gè)C++項(xiàng)目

#include<iostream>usingnamespacestd;voidmain(){cout<<"HelloWorld"<<endl;system("pause");}1.7理解C++語(yǔ)言的翻譯過(guò)程(1)字符映射(CharacterMapping)。文件中的物理源字符被映射到源字符集中,其中包括字符運(yùn)算符的替換、控制字符的替換等。(2)行合并(LineSplicing)。在字符映射后,進(jìn)行行合并,以反斜杠\結(jié)束的行為標(biāo)志,和它接下來(lái)的行合并。(3)標(biāo)記化(Tokenization)。在編寫(xiě)C++程序中,需要寫(xiě)各類(lèi)注釋,增加程序的可讀性。每一條注釋被一個(gè)單獨(dú)的空字符所替換。C++雙字符運(yùn)算符被識(shí)別為標(biāo)記。源代碼被分析成預(yù)處理標(biāo)記。(4)預(yù)處理(Preprocessing)。在對(duì)程序進(jìn)行轉(zhuǎn)換后,就過(guò)渡到了重要的預(yù)處理。調(diào)用預(yù)處理指令并擴(kuò)展宏,使用#include指令包含的文件。重復(fù)以上步驟(1)到步驟(4),直到整個(gè)程序都處理完。上述4個(gè)階段統(tǒng)稱為預(yù)處理階段。(5)字符集映射(Character-setMapping)。對(duì)預(yù)處理完的程序,將源字符集成員、轉(zhuǎn)義序列轉(zhuǎn)換成等價(jià)的執(zhí)行字符集成員。(6)字符串連接(StringConcatenation)。下一步,將相鄰的字符串連接成為一個(gè)字符串。(7)翻譯(Translation)。以上各步對(duì)文本進(jìn)行了處理,接下來(lái)進(jìn)行語(yǔ)法和語(yǔ)義分析編譯,并翻譯成目標(biāo)代碼。(8)模板處理(TemplateProcessing)。根據(jù)在程序中引用的模板,進(jìn)行模板實(shí)例的處理。(9)連接(Linkage)。解決外部引用的問(wèn)題,鏈接外部引用實(shí)例,準(zhǔn)備好程序映像以便執(zhí)行。第2章零基礎(chǔ)開(kāi)始學(xué)習(xí)——

C++的程序結(jié)構(gòu)

本章內(nèi)容2.1分析C++程序的結(jié)構(gòu)2.2編譯前的預(yù)處理2.3輸入和輸出數(shù)據(jù)2.4命名空間2.5實(shí)戰(zhàn)演練——經(jīng)典的入門(mén)程序2.1分析C++程序的結(jié)構(gòu)

2.1.1#include指令及頭文件2.1.2main函數(shù)2.1.3變量聲明和定義2.1.4函數(shù)的聲明2.1.5關(guān)于注釋2.2編譯前的預(yù)處理

C++的預(yù)處理(preprocess),是指在C++程序源代碼被編譯之前,由預(yù)處理器(preprocessor)對(duì)C++程序源代碼進(jìn)行的處理。雖然預(yù)處理命令不是C++語(yǔ)言的一部分,但是它有擴(kuò)展C++程序設(shè)計(jì)環(huán)境的作用。提示:預(yù)處理命令是C++統(tǒng)一規(guī)定的,但是它不是C++語(yǔ)言本身的組成部分,不能直接對(duì)它們進(jìn)行編譯(因?yàn)榫幾g程序不能識(shí)別它們)。2.3輸入和輸出數(shù)據(jù)

2.4命名空間

2.4.1命名空間的定義2.4.2using關(guān)鍵字2.4.3命名空間std2.4.1命名空間的定義

在C++中,名稱(name)可以是符號(hào)常量、變量、宏、函數(shù)、結(jié)構(gòu)、枚舉、類(lèi)和對(duì)象等。在大規(guī)模程序的設(shè)計(jì)中,以及在程序員使用各種各樣的C++庫(kù)時(shí)為了避免,這些標(biāo)識(shí)符的命名發(fā)生沖突,標(biāo)準(zhǔn)C++引入了關(guān)鍵字namespace(命名空間/名字空間/名稱空間/名域),可以更好地控制標(biāo)識(shí)符的作用域。原來(lái)C++標(biāo)識(shí)符的作用域分成三級(jí):代碼塊({……},如復(fù)合語(yǔ)句和函數(shù)體、類(lèi)和全局。現(xiàn)在,在其中的類(lèi)和全局之間,標(biāo)準(zhǔn)C++又添加了命名空間這一個(gè)作用域級(jí)別。命名空間可以是全局的,也可以位于另一個(gè)命名空間之中,但是不能位于類(lèi)和代碼塊中。所以,在命名空間中聲明的標(biāo)識(shí)符,默認(rèn)具有外部鏈接特性(除非它引用了常量)。2.4.2using關(guān)鍵字

在C++的命名空間中,為了使用時(shí)的方便,又引入了關(guān)鍵字using。利用using聲明可以在引用命名空間成員時(shí)不必使用命名空間限定符“::”。使用方法如下:usingnamespacestd;2.4.3命名空間stdC++標(biāo)準(zhǔn)中引入命名空間的概念,是為了解決不同模塊或者函數(shù)庫(kù)中相同標(biāo)識(shí)符沖突的問(wèn)題。有了命名空間的概念,標(biāo)識(shí)符就被限制在特定的范圍內(nèi),不會(huì)引起命名沖突。最典型的例子就是std命名空間,C++標(biāo)準(zhǔn)庫(kù)中所有標(biāo)識(shí)符都包含在該命名空間中。如果確信在程序中引用某個(gè)或者某些程序庫(kù)不會(huì)引起命名沖突,那么可以通過(guò)using操作符來(lái)簡(jiǎn)化對(duì)程序庫(kù)中標(biāo)識(shí)符(通常是函數(shù))的使用,例如:usingnamespacestd;那么就可以不用在標(biāo)識(shí)符加前綴std::來(lái)使用C++標(biāo)準(zhǔn)庫(kù)中的函數(shù)了。2.5實(shí)戰(zhàn)演練——經(jīng)典的入門(mén)程序

第3章程序中的數(shù)據(jù)種類(lèi)——

數(shù)據(jù)類(lèi)型本章內(nèi)容3.1標(biāo)識(shí)符3.2變量與常量3.2基本變量類(lèi)型3.3查詢變量的類(lèi)型和內(nèi)存空間大小3.3自定義數(shù)據(jù)類(lèi)型3.4實(shí)戰(zhàn)演練——對(duì)比不同數(shù)據(jù)類(lèi)型的長(zhǎng)度3.1標(biāo)識(shí)符

3.1.1保留字3.1.2標(biāo)識(shí)符命名3.2變量與常量

3.2.1變量3.2.2常量3.3基本變量類(lèi)型

3.3.1整數(shù)類(lèi)型3.3.2字符類(lèi)型3.3.3浮點(diǎn)數(shù)類(lèi)型3.3.4布爾類(lèi)型3.4查詢變量的類(lèi)型和內(nèi)存空間大小

首先,在主程序中,定義了一個(gè)unsignedlong類(lèi)型的變量a,初始化為0。下面又定義了一個(gè)float類(lèi)型的變量b,該變量初始化為0.0F。調(diào)用typeid和sizeof將兩個(gè)變量的類(lèi)型名和空間大小輸出。3.5自定義數(shù)據(jù)類(lèi)型

在現(xiàn)實(shí)生活中,信息的概念可能是長(zhǎng)度、數(shù)量和面積等。在C++語(yǔ)言中,信息被抽象為int、float和double等基本數(shù)據(jù)類(lèi)型。從基本數(shù)據(jù)類(lèi)型名稱上,不能夠看出其所代表的物理屬性,并且int、float和double為系統(tǒng)關(guān)鍵字,不可以修改。為了解決用戶自定義數(shù)據(jù)類(lèi)型名稱的需求,C++語(yǔ)言中引入類(lèi)型重定義語(yǔ)句typedef,可以將已有的類(lèi)型名用新的類(lèi)型名代替,從而豐富數(shù)據(jù)類(lèi)型所包含的屬性信息。typedef的語(yǔ)法描述:typedef類(lèi)型名稱類(lèi)型標(biāo)識(shí)符;typedef為系統(tǒng)保留字,“類(lèi)型名稱”為已知數(shù)據(jù)類(lèi)型名稱,包括基本數(shù)據(jù)類(lèi)型和用戶自定義數(shù)據(jù)類(lèi)型,“類(lèi)型標(biāo)識(shí)符”為新的類(lèi)型名稱。3.6實(shí)戰(zhàn)演練——對(duì)比不同數(shù)據(jù)類(lèi)型的長(zhǎng)度

從運(yùn)行結(jié)果來(lái)看,int、long、float類(lèi)型變量占4個(gè)字節(jié)、double類(lèi)型變量占8個(gè)字節(jié),short類(lèi)型變量占2個(gè)字節(jié),char和bool類(lèi)型變量占1個(gè)字節(jié)??梢?jiàn),不同數(shù)據(jù)類(lèi)型,所占用的字節(jié)數(shù)也不相同。第4章誰(shuí)來(lái)操作數(shù)據(jù)——

靈活使用運(yùn)算符本章內(nèi)容4.1運(yùn)算符概述4.2運(yùn)算符優(yōu)先級(jí)和結(jié)合性4.3實(shí)戰(zhàn)演練——綜合運(yùn)用運(yùn)算符4.1運(yùn)算符概述

4.1.1賦值運(yùn)算符4.1.2算術(shù)運(yùn)算符4.1.3關(guān)系運(yùn)算符4.1.4邏輯運(yùn)算符4.1.5自增和自減運(yùn)算符4.1.6位邏輯運(yùn)算符4.1.7移位運(yùn)算符4.1.8三元運(yùn)算符4.1.9逗號(hào)運(yùn)算符4.1.10類(lèi)型轉(zhuǎn)換運(yùn)算符4.2運(yùn)算符優(yōu)先級(jí)和結(jié)合性

4.2.1運(yùn)算符優(yōu)先級(jí)4.2.2運(yùn)算符結(jié)合性4.2.1運(yùn)算符優(yōu)先級(jí)

當(dāng)不同的運(yùn)算符混合運(yùn)算時(shí),運(yùn)算順序是根據(jù)運(yùn)算符的優(yōu)先級(jí)而定的,優(yōu)先級(jí)高的運(yùn)算符先運(yùn)算,優(yōu)先級(jí)低的運(yùn)算符后運(yùn)算。在一個(gè)表達(dá)式中,如果各運(yùn)算符有相同的優(yōu)先級(jí),運(yùn)算順序是從左向右,還是從右向左,是由運(yùn)算符的結(jié)合性確定的。4.2.2運(yùn)算符結(jié)合性因此引入運(yùn)算符結(jié)合性的概念。運(yùn)算符的結(jié)合性是指同一優(yōu)先級(jí)的運(yùn)算符在表達(dá)式中操作的組織方向,即當(dāng)一個(gè)運(yùn)算對(duì)象兩側(cè)運(yùn)算符的優(yōu)先級(jí)別相同時(shí),運(yùn)算對(duì)象與運(yùn)算符的結(jié)合順序。C++語(yǔ)言規(guī)定了各種運(yùn)算符的結(jié)合方向(結(jié)合性)。大多數(shù)運(yùn)算符結(jié)合方向是“自左至右”,即先左后右。例如,a-b+c,b兩側(cè)-和+兩種運(yùn)算符的優(yōu)先級(jí)相同,按先左后右結(jié)合方向,b先與減號(hào)結(jié)合,執(zhí)行a-b的運(yùn)算,再執(zhí)行加c的運(yùn)算。除了自左至右的結(jié)合性外,C++語(yǔ)言有三類(lèi)運(yùn)算符參與運(yùn)算的結(jié)合方向是從右至左,即單目運(yùn)算符>條件運(yùn)算符>賦值運(yùn)算符。4.3實(shí)戰(zhàn)演練——綜合運(yùn)用運(yùn)算符在該例中,定義了三個(gè)int型變量x、y、min,輸入x和y,使用比較運(yùn)算符比較x和y的大小,把其中較小的值賦給min,在輸出時(shí),仍然使用比較運(yùn)算符,判斷輸出是大于號(hào)還是小于號(hào),最后將min輸出。第5章程序的執(zhí)行方向——

程序流程控制本章內(nèi)容5.1順序語(yǔ)句5.2條件判斷語(yǔ)句5.3循環(huán)語(yǔ)句5.5多重選擇——switch語(yǔ)句5.4跳出循環(huán)5.6實(shí)戰(zhàn)演練——流程控制綜合應(yīng)用5.1順序語(yǔ)句

5.2條件判斷語(yǔ)句

5.2.1if條件5.2.2if-else條件5.2.3條件運(yùn)算符5.3循環(huán)語(yǔ)句

5.3.1for循環(huán)5.3.2while循環(huán)5.3.3do-while循環(huán)5.4跳出循環(huán)

5.4.1continue語(yǔ)句5.4.2break語(yǔ)句5.4.3goto語(yǔ)句5.5多重選擇——switch語(yǔ)句5.6實(shí)戰(zhàn)演練——流程控制綜合應(yīng)用運(yùn)輸公司要對(duì)用戶計(jì)算運(yùn)費(fèi),假設(shè)每噸每公里的價(jià)格為P,貨物重量為W,路程為S,折扣為D。路程折扣s<250d=0250<=s<500d=0.02500<=s<1000d=0.051000<=s<2000d=0.082000<=s<3000d=0.10s>=3000d=0.15第6章C++的靈魂——函數(shù)的應(yīng)用本章內(nèi)容6.1函數(shù)的基本結(jié)構(gòu)6.2變量的作用域6.3特殊函數(shù)調(diào)用方式——遞歸調(diào)用6.4內(nèi)聯(lián)函數(shù)6.5預(yù)處理器6.6函數(shù)的重載6.7實(shí)戰(zhàn)演練——漢諾塔問(wèn)題函數(shù)6.1函數(shù)的基本結(jié)構(gòu)

6.1.1函數(shù)的聲明、定義和調(diào)用6.1.2參數(shù)的傳遞方式6.1.3函數(shù)的默認(rèn)參數(shù)6.1.4函數(shù)的返回值6.1.1函數(shù)的聲明、定義和調(diào)用

聲明是告訴編譯器一些信息,以協(xié)助編譯器進(jìn)行語(yǔ)法分析,避免編譯器報(bào)錯(cuò)。而定義是告訴編譯器生成一些代碼,并且這些代碼將由連接器使用。即聲明是給編譯器用的,定義是給連接器用的。在C++程序中調(diào)用函數(shù)之前,首先要對(duì)函數(shù)進(jìn)行定義。函數(shù)的定義如下。返回類(lèi)型函數(shù)名(參數(shù)){函數(shù)體

return結(jié)果;}6.1.2參數(shù)的傳遞方式

所謂的值傳遞,是指當(dāng)一個(gè)函數(shù)被調(diào)用時(shí),C++根據(jù)形參的類(lèi)型、數(shù)量等特征將實(shí)參一一對(duì)應(yīng)的傳遞給函數(shù),在函數(shù)中調(diào)用。在值傳遞的過(guò)程中,形參只在函數(shù)被調(diào)用時(shí)才分配存儲(chǔ)單元,調(diào)用結(jié)束即被釋。實(shí)參可以是常量、變量、表達(dá)式、函數(shù)(名)等,但它們必須要有確定的值,以便把這些值傳送給形參。實(shí)參和形參在數(shù)量、類(lèi)型、順序上應(yīng)嚴(yán)格一致值。傳遞時(shí)是將實(shí)參的值傳遞給對(duì)應(yīng)的形參,即單向傳遞。函數(shù)并不對(duì)傳遞的實(shí)參進(jìn)行操作,即使形參的值發(fā)生了變化,實(shí)參的值也不會(huì)隨著形參的改變而改變。6.1.3函數(shù)的默認(rèn)參數(shù)

C++允許在函數(shù)定義時(shí)給一個(gè)或者多個(gè)默認(rèn)參數(shù)值。在調(diào)用該函數(shù)時(shí),如果給出實(shí)參,則采用實(shí)參值;如果沒(méi)有給定實(shí)參值,則調(diào)用默認(rèn)參數(shù)值。提示:默認(rèn)參數(shù)只可在函數(shù)聲明中設(shè)定一次。只有在沒(méi)有函數(shù)聲明時(shí),才可以在函數(shù)定義中設(shè)定。函數(shù)默認(rèn)參數(shù)的特點(diǎn)就是在調(diào)用時(shí)可以不提供或提供部分實(shí)參。6.1.4函數(shù)的返回值

C++函數(shù)的返回值分為以下幾種情況。⑴主函數(shù)main的返回值:如果返回0,則表示程序運(yùn)行成功。⑵返回非引用類(lèi)型:函數(shù)的返回值用于初始化在調(diào)用函數(shù)時(shí)創(chuàng)建的臨時(shí)對(duì)象。用函數(shù)返回值初始化臨時(shí)對(duì)象與用實(shí)參初始化形參的方法是一樣的。如果返回類(lèi)型不是引用,在調(diào)用函數(shù)的地方會(huì)將函數(shù)返回值賦給臨時(shí)對(duì)象。且其返回值既可以是局部對(duì)象,也可以是求解表達(dá)式的結(jié)果。⑶返回引用:當(dāng)函數(shù)返回引用類(lèi)型時(shí),沒(méi)有復(fù)制返回值。相反,返回的就是對(duì)象本身。6.2變量的作用域

6.2.1局部變量6.2.2靜態(tài)局部變量6.2.3外部變量6.2.4寄存器變量6.2.1局部變量

局部變量是指限制在某一范圍內(nèi)使用的變量,局部變量經(jīng)常被稱為自動(dòng)變量,因?yàn)樗鼈冊(cè)谶M(jìn)入作用域時(shí)自動(dòng)生成,采用堆棧方式分配內(nèi)存空間,離開(kāi)作用域時(shí),釋放內(nèi)存空間,值也自動(dòng)消失。關(guān)鍵字auto可以顯式地說(shuō)明這個(gè)問(wèn)題,但是局部變量默認(rèn)為auto,所以沒(méi)有必要聲明為auto。6.2.2靜態(tài)局部變量

關(guān)靜態(tài)變量也是一種局部變量,在變量前面加上關(guān)鍵字static,那么這個(gè)變量就被定義為靜態(tài)變量。通常,在函數(shù)中定義的局部變量在函數(shù)作用域結(jié)束的時(shí)候釋放掉內(nèi)存空間,那么該變量也就隨之消失了。當(dāng)再次調(diào)用該函數(shù)的時(shí)候,會(huì)重新初始化局部變量,之后才可以使用。靜態(tài)變量與局部變量的不同之處在于,只要程序一直在執(zhí)行,那么靜態(tài)變量定義的值就一直有效,不會(huì)隨著函數(shù)的結(jié)束而消失。主要原因是,靜態(tài)變量在內(nèi)存中存放是有固定地址的,而不像局部變量一樣使用堆棧方式存取。6.2.3外部變量

extern告訴編譯器存在著一個(gè)變量和函數(shù),即使編譯器在當(dāng)前的文件中沒(méi)有看到它,這個(gè)變量或函數(shù)可能在一個(gè)文件或者在當(dāng)前文件的后面定義。例如externinti,編譯器會(huì)知道i肯定作為全局變量存在于某處。當(dāng)編譯器看到變量i的定義時(shí),并沒(méi)有看到別的聲明,所以知道它在文件的前面已經(jīng)找到了同樣聲明的i。當(dāng)一個(gè)變量成為外部變量之后,不必再次為它分配內(nèi)存就可以引用這個(gè)變量了。6.2.4寄存器變量

使用寄存器變量的目的就是將變量放入寄存器中,而加快訪問(wèn)速度。使用關(guān)鍵字“register”來(lái)聲明一個(gè)寄存器變量,如果在聲明寄存器變量時(shí),系統(tǒng)的寄存器被其他數(shù)據(jù)占用,怎寄存器變量就變?yōu)榱司植孔兞?。使用register變量是有限制的:(1)不可能得到或計(jì)算register變量的地址;(2)register變量只能在一個(gè)塊中聲明(不可能有全局的或靜態(tài)的register變量)。然而可以在一個(gè)函數(shù)中(即在參數(shù)表中)使用register變量作為一個(gè)形式參數(shù)。一般地,不應(yīng)當(dāng)推測(cè)編譯器的優(yōu)化器,因?yàn)樗赡鼙茸龅酶谩R虼?,最好避免使用關(guān)鍵字register。6.3特殊函數(shù)調(diào)用方式——遞歸調(diào)用

在任何一個(gè)函數(shù)體內(nèi)不能出現(xiàn)其他函數(shù)的定義。但是,在任何一個(gè)函數(shù)體內(nèi)可以調(diào)用任何函數(shù),包括該函數(shù)本身。在一個(gè)函數(shù)中,如果出現(xiàn)直接或者間接地調(diào)用函數(shù)本身,則稱為遞歸調(diào)用,相應(yīng)的函數(shù)稱為遞歸函數(shù)。提示:在進(jìn)行遞歸調(diào)用時(shí),被調(diào)用函數(shù)的數(shù)據(jù)環(huán)境和調(diào)用函數(shù)的數(shù)據(jù)環(huán)境在結(jié)構(gòu)上是一致的,只是被調(diào)用函數(shù)和調(diào)用函數(shù)傳遞的參數(shù)不同而已。編寫(xiě)一個(gè)遞歸函數(shù),首先得找到遞歸公式,然后設(shè)置初始條件和出口。(1)找遞推公式(往往是找f(n)和f(n-1)之間的關(guān)系)。(2)遞歸結(jié)束條件。如:n!=n*(n-1)!(遞推公式)。1!=1(終止條件)。6.4內(nèi)聯(lián)函數(shù)

函數(shù)的引入可以減少程序的目標(biāo)代碼,實(shí)現(xiàn)程序代碼的共享。但是,函數(shù)調(diào)用也需要一些時(shí)間和空間方面的開(kāi)銷(xiāo),因?yàn)檎{(diào)用函數(shù)實(shí)際上將程序執(zhí)行流程轉(zhuǎn)移到被調(diào)函數(shù)中,被調(diào)函數(shù)的程序代碼執(zhí)行完后,再返回到調(diào)用的地方。這種調(diào)用操作要求調(diào)用前保護(hù)現(xiàn)場(chǎng)并記憶執(zhí)行的地址,返回后恢復(fù)現(xiàn)場(chǎng),并按原來(lái)保存的地址繼續(xù)執(zhí)行。對(duì)于較長(zhǎng)的函數(shù)這種開(kāi)銷(xiāo)可以忽略不計(jì),但是對(duì)于一些函數(shù)體代碼很短,但又被頻繁地調(diào)用的函數(shù),就不能忽視這種開(kāi)銷(xiāo)。引入內(nèi)聯(lián)函數(shù)正是為了解決這個(gè)問(wèn)題,提高程序的運(yùn)行效率。在程序編譯時(shí),編譯器將程序中出現(xiàn)的內(nèi)聯(lián)函數(shù)的調(diào)用表達(dá)式用內(nèi)聯(lián)函數(shù)的函數(shù)體來(lái)進(jìn)行替換。由于在編譯時(shí)將函數(shù)體中的代碼替代到程序中,因此會(huì)增加目標(biāo)程序代碼量,進(jìn)而增加空間開(kāi)銷(xiāo),而在時(shí)間開(kāi)銷(xiāo)上不像函數(shù)調(diào)用時(shí)那么大,可見(jiàn)它是以目標(biāo)代碼的增加為代價(jià)來(lái)?yè)Q取時(shí)間的節(jié)省。6.5預(yù)處理器

6.5.1#define預(yù)處理器6.5.2#define的作用6.5.3const修飾符6.5.1#define預(yù)處理器

#define是宏定義命令,宏定義具有這樣的形式:#defineidentifierreplacement預(yù)處理器無(wú)論在什么時(shí)候遇到了這樣的指令,任何出現(xiàn)identifier的地方都將被替換成replacement。標(biāo)識(shí)符通常為大寫(xiě)字母,使用下劃線代替空格。6.5.2#define的作用

通過(guò)上節(jié)的介紹認(rèn)識(shí)了#define預(yù)處理器,那么為什么要引入這個(gè)預(yù)處理器呢?首先,允許給一些東西命名為描述性的名字,如數(shù)字。舉個(gè)例子:intnYen=nDollars*122;像122這樣的數(shù)字在程序中被稱為魔法數(shù)字。一個(gè)魔法數(shù)字是hard-coded數(shù)字,它在代碼中沒(méi)有任何意義——122表示什么呢?是轉(zhuǎn)換率還是其他什么呢?它是不明確的。在一些復(fù)雜的程序里,通常很難判斷一個(gè)hard-coded數(shù)字具體代表什么。6.5.3const修飾符

1.一般常量一般常量是指簡(jiǎn)單類(lèi)型的常量。這種常量在定義時(shí),修飾符const可以用在類(lèi)型說(shuō)明符前,也可以用在類(lèi)型說(shuō)明符后。如:intconstx=2;或constintx=2;定義或說(shuō)明一個(gè)常數(shù)組可采用如下格式:<類(lèi)型說(shuō)明符>const<數(shù)組名>[<大小>]2.常對(duì)象常對(duì)象是指對(duì)象常量,定義格式如下:<類(lèi)名>const<對(duì)象名>或const<類(lèi)名><對(duì)象名>定義常對(duì)象時(shí),同樣要進(jìn)行初始化,并且該對(duì)象不能再被更新,修飾符const可以放在類(lèi)名后面,也可以放在類(lèi)名前面。6.6函數(shù)的重載

函數(shù)重載是用來(lái)描述同名函數(shù)具有相同或者相似功能,但數(shù)據(jù)類(lèi)型或者是參數(shù)不同的函數(shù)管理操作的稱呼。在同一作用域內(nèi),可以有一組具有相同函數(shù)名、不同參數(shù)列表的函數(shù),這組函數(shù)稱為重載函數(shù)。重載函數(shù)通常用來(lái)命名一組功能相似的函數(shù),這樣做減少了函數(shù)名的數(shù)量,避免了名字空間的污染,對(duì)于程序的可讀性有很大的好處。提示:不要將不同功能的函數(shù)定義為重載函數(shù),以免出現(xiàn)對(duì)調(diào)用結(jié)果的誤解。要進(jìn)行函數(shù)重載,必須遵循以下一些規(guī)則。⑴同名函數(shù)的參數(shù)必須不同,不同之處可以是參數(shù)的類(lèi)型或參數(shù)的個(gè)數(shù)。⑵通過(guò)參數(shù)類(lèi)型的匹配,程序決定使用哪一個(gè)同名函數(shù)。⑶必須附加考慮參數(shù)的默認(rèn)值對(duì)函數(shù)重載的影響。6.7實(shí)戰(zhàn)演練——漢諾塔問(wèn)題函數(shù)

漢諾塔(又稱河內(nèi)塔)問(wèn)題是源于印度一個(gè)古老傳說(shuō)的益智玩具。大梵天創(chuàng)造世界的時(shí)候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤(pán)。大梵天命令婆羅門(mén)把圓盤(pán)從下面開(kāi)始按大小順序重新擺放在另一根柱子上。并且規(guī)定,在小圓盤(pán)上不能放大圓盤(pán),在三根柱子之間一次只能移動(dòng)一個(gè)圓盤(pán)。該問(wèn)題可分解為下面三個(gè)步驟。(1)將A柱上n-1個(gè)盤(pán)子移到B柱上(借助C柱)。(2)把A柱上剩下的一個(gè)盤(pán)子移到C柱上。(3)將n-1個(gè)盤(pán)子從B柱移到C柱上(借助A柱)。第7章特殊的元素集合——數(shù)組與字符串本章內(nèi)容7.1一維數(shù)組7.2二維數(shù)組和多維數(shù)組7.3數(shù)組與函數(shù)7.4字符串類(lèi)7.5實(shí)戰(zhàn)演練1——判斷字符串回文7.6實(shí)戰(zhàn)演練2——輸出斐波那契數(shù)列7.1一維數(shù)組

7.1.1一維數(shù)組的聲明7.1.2數(shù)組初始化7.1.3數(shù)組的操作7.1.1一維數(shù)組的聲明

定義一維數(shù)組的語(yǔ)法格式為:類(lèi)型數(shù)組名[常量表達(dá)式];其中,類(lèi)型是數(shù)組類(lèi)型,即數(shù)組中各元素的數(shù)據(jù)類(lèi)型,可以是整型、浮點(diǎn)型、字符型等基本類(lèi)型。數(shù)組名是一個(gè)標(biāo)識(shí)符,代表著數(shù)組元素在內(nèi)存中的起始地址,它的命名規(guī)則與變量名的命名一樣。常量表達(dá)式又稱下標(biāo)表達(dá)式,表示一維數(shù)組中元素的個(gè)數(shù),即數(shù)組長(zhǎng)度(也稱為數(shù)組大小),用一對(duì)方括號(hào)“[]”括起來(lái)。方括號(hào)“[]”的個(gè)數(shù)代表數(shù)組的維數(shù),一個(gè)方括號(hào)表示一維數(shù)組。7.1.2數(shù)組初始化

數(shù)組的賦值方法可以在數(shù)組定義時(shí)賦值,也可以在定義后賦值。數(shù)組初始化賦值是指在數(shù)組定義時(shí)給數(shù)組元素賦予初值,數(shù)組初始化是在編譯階段進(jìn)行的。這樣將減少運(yùn)行時(shí)間,提高效率。初始化賦值的一般形式為:類(lèi)型說(shuō)明符數(shù)組名[常量表達(dá)式]={值,值……值};其中在{}中的各數(shù)據(jù)值即為各元素的初值,各值之間用逗號(hào)間隔。7.1.3數(shù)組的操作在實(shí)際程序設(shè)計(jì)中,數(shù)組的使用是非常頻繁的。由于數(shù)組元素都具有相同性質(zhì)這個(gè)特性,它們通常需要進(jìn)行重復(fù)操作,因此,數(shù)組操作離不開(kāi)循環(huán)結(jié)構(gòu)。在數(shù)組定義后,只能逐個(gè)訪問(wèn)數(shù)組元素。數(shù)組元素的引用格式如下:數(shù)組名[下標(biāo)]在給數(shù)組元素賦值或?qū)?shù)組元素進(jìn)行引用時(shí),一定要注意下標(biāo)的值不要超過(guò)數(shù)組的范圍,否則會(huì)產(chǎn)生數(shù)組越界問(wèn)題。因?yàn)楫?dāng)數(shù)組下標(biāo)越界時(shí),編譯器并不認(rèn)為它是一個(gè)錯(cuò)誤,但這往往會(huì)帶來(lái)非常嚴(yán)重的后果。7.2二維數(shù)組和多維數(shù)組

7.2.1二維數(shù)組的聲明7.2.2.二維數(shù)組的使用和存取7.2.3多維數(shù)組7.2.1二維數(shù)組的聲明

定義二維數(shù)組的語(yǔ)法格式為:類(lèi)型數(shù)組名[常量表達(dá)式1][常量表達(dá)式2];定義二維數(shù)組的格式與定義一維數(shù)組的格式相同,只是必須指定兩個(gè)常量表達(dá)式。第一個(gè)常量表達(dá)式標(biāo)識(shí)數(shù)組的行數(shù),第二個(gè)常量表達(dá)式標(biāo)識(shí)數(shù)組的列數(shù)。在以上語(yǔ)法中,數(shù)據(jù)類(lèi)型是數(shù)組全體元素的數(shù)據(jù)類(lèi)型。數(shù)組名用標(biāo)識(shí)符表示,兩個(gè)整型常量表達(dá)式分別代表數(shù)組具有的行數(shù)和列數(shù);數(shù)組元素的下標(biāo)一律從0開(kāi)始。7.2.2.二維數(shù)組的使用和存取

二維數(shù)組的初始化的形式:數(shù)據(jù)類(lèi)型數(shù)組名[常量表達(dá)式][常量表達(dá)式]={初始化數(shù)據(jù)};在以上的初始化形式中,在{}中給出各數(shù)組元素的初值,各初值之間用逗號(hào)分開(kāi),把{}中的初值依次賦給各數(shù)組元素。7.2.3多維數(shù)組

在這個(gè)例子中,首先定義了一個(gè)三維數(shù)組arr,該數(shù)組的維數(shù)分別是3、4、2,并且在定義時(shí)對(duì)該數(shù)組進(jìn)行了初始化;接下來(lái),使用for三重循環(huán),將該數(shù)組的每個(gè)元素分別輸出。7.3數(shù)組與函數(shù)

7.3.1一維數(shù)組作為函數(shù)的參數(shù)7.3.2傳送多維數(shù)組到函數(shù)7.3.1一維數(shù)組作為函數(shù)的參數(shù)

數(shù)組作為函數(shù)的參數(shù),難點(diǎn)和重點(diǎn)都在于這兩點(diǎn):(1)理解函數(shù)參數(shù)兩種傳遞方式:傳值與傳址之間區(qū)別。(2)數(shù)組變量本身就是內(nèi)存地址。關(guān)于函數(shù)的參數(shù)傳遞方式,在上一章明確講過(guò),傳值方式下,傳的只是實(shí)參的復(fù)制品(值一樣);傳址方式下,傳的是實(shí)參本身。那么數(shù)組作為函數(shù)的參數(shù)時(shí),是采用什么傳址方式呢?在C/C++中,如果函數(shù)的參數(shù)是數(shù)組,則該參數(shù)固定為傳址方式。7.3.2傳送多維數(shù)組到函數(shù)在這個(gè)例子中,定義了函數(shù)func,該函數(shù)的參數(shù)是一個(gè)int型二維數(shù)組,在該函數(shù)中,對(duì)函數(shù)的參數(shù)進(jìn)行了初始化,每個(gè)元素的值都是它維數(shù)的和。在主程序中,首先定義一個(gè)int型二維數(shù)組,接下來(lái)調(diào)用函數(shù)func,將定義的數(shù)組a作為參數(shù)輸入;使用for雙重循環(huán),將定義的數(shù)組輸出。7.4字符串類(lèi)

7.4.1字符串的聲明7.4.2字符串的輸入和輸出7.4.3字符串處理7.4.1字符串的聲明

字符型數(shù)組即數(shù)組中的每一個(gè)元素是字符,在C++語(yǔ)言中字符型數(shù)組的應(yīng)用很多,字符型數(shù)組用來(lái)存放字符串,沒(méi)有字符串變量,字符串以'\0'為結(jié)束標(biāo)志。定義:chara[10];此時(shí)定義了一個(gè)包含10個(gè)字符元素的字符型數(shù)組。7.4.2字符串的輸入和輸出

本節(jié)介紹字符串的輸入和輸出。字符串的輸入和輸出有兩種方式。 逐個(gè)字符輸入輸出。 將整個(gè)字符串一次輸入或輸出。例如:charc[]="China";cout<<c;就是將整個(gè)字符串一次性輸出。7.4.3字符串處理函數(shù)原型:char*strcat(char*,char*);功能:將字符型數(shù)組(串)2拷貝到字符型數(shù)組1中。例如:staticcharstr1[10];staticcharstr2[]=“china”;strcpy(str1,str2);7.5實(shí)戰(zhàn)演練1——判斷字符串回文

字符串回文是指順讀和反讀都一樣的串,這里不分大小寫(xiě),并濾去所有非字母字符,例如以下都是回文:Madam,I’mAdam.Golf,NoSir,preferprisonflog!注意string是類(lèi),它有自己的構(gòu)造函數(shù)和析構(gòu)函數(shù),如果它作為類(lèi)或結(jié)構(gòu)的成員,要記住它是成員對(duì)象,當(dāng)整個(gè)類(lèi)對(duì)象建立和撤銷(xiāo)時(shí),會(huì)自動(dòng)調(diào)用作為成員對(duì)象的string字符串的構(gòu)造和析構(gòu)函數(shù)。7.6實(shí)戰(zhàn)演練2——輸出斐波那契數(shù)列

斐波那契數(shù)列是意大利數(shù)學(xué)家列昂納多?斐波那契(LeonardoFibonacci)發(fā)現(xiàn)的。它的基本規(guī)律是從第3項(xiàng)開(kāi)始,每一項(xiàng)都等于前兩項(xiàng)之和,第1項(xiàng)和第2項(xiàng)都是1。斐波那契數(shù)列如下所示:1、1、2、3、5、8、13、21、34……下面利用數(shù)組來(lái)輸出該數(shù)列的前30項(xiàng)。第8章靈活調(diào)用內(nèi)存地址——

指針本章內(nèi)容8.1指針概述8.2指針變量8.3指針與函數(shù)8.4指針與數(shù)組8.5指針與字符串8.6const指針8.7void指針8.8指向指針的指針8.8動(dòng)態(tài)內(nèi)存配置8.9實(shí)戰(zhàn)演練——判斷字符串中有多少個(gè)整數(shù)8.1指針概述

8.1.1什么是指針8.1.2為什么要用指針8.1.3指針的地址8.2指針變量

8.2.1指針變量的聲明8.2.2指針變量的使用8.3指針與函數(shù)

8.3.1指針傳送到函數(shù)中8.3.2返回值為指針的函數(shù)8.3.3函數(shù)指針8.4指針與數(shù)組

8.4.1指針的算術(shù)運(yùn)算8.4.2利用指針存儲(chǔ)一維數(shù)組的元素8.4.3利用指針傳輸一維數(shù)組到函數(shù)中8.5指針與字符串

在該例中,首先定義了一個(gè)靜態(tài)字符串變量p,該變量的值定義為;接著使用while循環(huán),將指針p指向字符串最后一個(gè)變量的地址;然后,使用while循環(huán),從后往前循環(huán)遍歷字符串,將字符串反向輸出。8.6const指針

在C++中,如果指針的前面加上const關(guān)鍵字,則表示為const指針。例如:constint*p;這里定義一個(gè)指向整數(shù)常量的指針,該指針指向的值是不能改變的。如果const關(guān)鍵字在變量的前面,則含義和上面的又不相同。例如:int*constp;這里也是定義個(gè)指向整數(shù)常量的指針,它指向的整數(shù)是可以改變的,但是p這個(gè)指針不能指向其他的變量。8.7void指針

一個(gè)指針有兩個(gè)基本屬性:指向變量的地址和長(zhǎng)度。指針是存儲(chǔ)地址的,長(zhǎng)度取決于指針的類(lèi)型。在編譯過(guò)程中,編譯器按照指針類(lèi)型的不同,向后開(kāi)始尋址。void的字面意思是“無(wú)類(lèi)型”,void*則為“無(wú)類(lèi)型指針”,void*可以指向任何類(lèi)型的數(shù)據(jù)。8.8指向指針的指針一個(gè)指針變量可以指向整型變量、實(shí)型變量、字符型變量,當(dāng)然也可以指向指針類(lèi)型變量。當(dāng)這種指針變量用于指向指針類(lèi)型變量時(shí),稱為指向指針的指針變量其實(shí)質(zhì)就是一個(gè)指針變量的地址就是指向該變量的指針時(shí),這就是一種雙重指針的機(jī)制。稱指向指針的指針為二級(jí)指針,這在C++中是允許定義的。二級(jí)指針必須指向一個(gè)一級(jí)指針,而這個(gè)一級(jí)指針存放的是一個(gè)內(nèi)存地址。

8.9動(dòng)態(tài)內(nèi)存配置

8.9.1使用基本數(shù)據(jù)類(lèi)型做動(dòng)態(tài)配置8.9.2使用數(shù)組做動(dòng)態(tài)配置8.9實(shí)戰(zhàn)演練——判斷字符串中有多少個(gè)整數(shù)

輸入一個(gè)字符串,內(nèi)有數(shù)字和非數(shù)字字符,例如:a123jdh34211djfh37641m?kj8E8#*526將其中連續(xù)的數(shù)字作為一個(gè)整數(shù),依次存到一個(gè)數(shù)組a中,如將123放到a[0],34211放到a[1]……統(tǒng)計(jì)共有多少個(gè)整數(shù),并輸出這些數(shù)。第9章靈活定義數(shù)據(jù)類(lèi)型——

結(jié)構(gòu)體、共同體和枚舉類(lèi)型本章內(nèi)容9.1結(jié)構(gòu)體9.2將結(jié)構(gòu)體變量作為函數(shù)參數(shù)9.3共同體9.4枚舉類(lèi)型9.5實(shí)戰(zhàn)演練——學(xué)生信息登記表9.1結(jié)構(gòu)體

9.1.1結(jié)構(gòu)體的聲明9.1.2結(jié)構(gòu)體變量的初始化與使用9.1.3結(jié)構(gòu)體數(shù)組初始化9.1.1結(jié)構(gòu)體的聲明

定義一個(gè)結(jié)構(gòu)體類(lèi)型的一般形式為:struct結(jié)構(gòu)體名{成員項(xiàng)表列};其中,struct是定義結(jié)構(gòu)體的關(guān)鍵字,結(jié)構(gòu)體名是一個(gè)用戶定義的標(biāo)識(shí)符,它規(guī)定了所定義的結(jié)構(gòu)體的名稱。成員列表是用來(lái)定義結(jié)構(gòu)體的組成成員的,每個(gè)成員包括成員名稱以及成員類(lèi)型。9.1.2結(jié)構(gòu)體變量的初始化與使用

初始化的方法是用花括弧將每個(gè)成員的值括起來(lái)。例如:structstu/*定義結(jié)構(gòu)*/{intnum;char*name;charsex;floatscore;}boy2,boy1={102,"Zhangping",'M',78.5};9.1.3結(jié)構(gòu)體數(shù)組初始化結(jié)構(gòu)體數(shù)組的定義方法如下:(1)在定義結(jié)構(gòu)體數(shù)組前,必須首先定義結(jié)構(gòu)體類(lèi)型(2)定義結(jié)構(gòu)體類(lèi)型與定義結(jié)構(gòu)體數(shù)組同時(shí)進(jìn)行(3)定義結(jié)構(gòu)體數(shù)組,而不定義結(jié)構(gòu)體類(lèi)型名9.2將結(jié)構(gòu)體變量作為函數(shù)參數(shù)

9.2.1將整個(gè)結(jié)構(gòu)體傳送到函數(shù)9.2.2傳送結(jié)構(gòu)體的地址到函數(shù)9.2.1將整個(gè)結(jié)構(gòu)體傳送到函數(shù)

這個(gè)程序,首先定義一個(gè)結(jié)構(gòu)體student,該結(jié)構(gòu)體有5個(gè)結(jié)構(gòu)體成員;聲明一個(gè)display函數(shù),該函數(shù)的參數(shù)為student結(jié)構(gòu)體變量;主程序中,初始化一個(gè)結(jié)構(gòu)體變量s1,調(diào)用display函數(shù),把s1作為參數(shù)傳入,將變量s1的成員都輸出。9.2.2傳送結(jié)構(gòu)體的地址到函數(shù)在這個(gè)例子中,首先定義了結(jié)構(gòu)體Student,并且初始化了變量stu;在主程序中,調(diào)用print函數(shù),將stu的地址傳送到print函數(shù);接下來(lái),定義print函數(shù),該函數(shù)參數(shù)值為Student結(jié)構(gòu)體變量的地址,在該函數(shù)中利用參數(shù)的引用來(lái)訪問(wèn)該結(jié)構(gòu)體變量,把結(jié)構(gòu)體變量的成員值輸出。9.3共同體

9.3.1共同體的定義和聲明9.3.2共同體類(lèi)型的初始化和使用9.3.3struct和union的差異9.3.1共同體的定義和聲明

共用體變量定義的一般形式為:union共用體名{類(lèi)型名共用體成員名}變量表列;定義共用體類(lèi)型變量的方法與定義結(jié)構(gòu)體類(lèi)型變量的方法相似。9.3.2共同體類(lèi)型的初始化和使用

引用共用體成員的兩個(gè)運(yùn)算符:“.”和“->”。對(duì)于共用體的應(yīng)用有以下一些形式:形式一:共用體變量.成員名形式二:(*共用體指針變量).成員名形式三:共用體指針變量->成員名9.3.3struct和union的差異Struct和nuion的差異如下。Sruct是指不同的數(shù)據(jù)類(lèi)型的變量按照一定的實(shí)際情況組合在一起的數(shù)據(jù)結(jié)構(gòu),由一種數(shù)據(jù)對(duì)象的不同屬性組成的,所占用的內(nèi)存空間等于各個(gè)成員的所占空間的組合。Union是將不同的數(shù)據(jù)類(lèi)型變量組合到一起,使用共用體的優(yōu)點(diǎn)是可以共享數(shù)據(jù)空間,最大的成員所占用的空間就是共用體的空間,節(jié)省了內(nèi)存空間。9.4枚舉類(lèi)型

9.4.1枚舉類(lèi)型的定義和聲明9.4.2枚舉類(lèi)型的初始化和使用9.4.1枚舉類(lèi)型的定義和聲明

枚舉類(lèi)型是C++提供的一種可由程序員自行定義的數(shù)據(jù)類(lèi)型,是一種簡(jiǎn)單類(lèi)型,而不是構(gòu)造類(lèi)型。枚舉類(lèi)型的定義形式如下:enum枚舉名{

枚舉值名表};其中枚舉值名表格式如下:標(biāo)識(shí)符1,標(biāo)識(shí)符2,......,標(biāo)識(shí)符n9.4.2枚舉類(lèi)型的初始化和使用

枚舉類(lèi)型的初始化形式為:enum[枚舉名]{

標(biāo)識(shí)符1[=整型常量],

標(biāo)識(shí)符2[=整型常量],......

標(biāo)識(shí)符n[=整型常量]};9.5實(shí)戰(zhàn)演練——學(xué)生信息登記表建立50名學(xué)生信息登記表(結(jié)構(gòu)體數(shù)組),每個(gè)學(xué)生的數(shù)據(jù)包括學(xué)號(hào)、姓名、性別和三門(mén)成績(jī),實(shí)現(xiàn)如下效果。(1)從鍵盤(pán)輸入3名學(xué)生的數(shù)據(jù)。(2)顯示每個(gè)學(xué)生三門(mén)課的平均分。(3)顯示每門(mén)課程的全班平均分。(4)按平均分高低排名,并按名次順序輸出學(xué)生所有數(shù)據(jù)。第10章主流的編程思想——

認(rèn)識(shí)面向?qū)ο缶幊瘫菊聝?nèi)容10.1面向?qū)ο缶幊谈攀?0.2認(rèn)識(shí)類(lèi)10.3成員函數(shù)10.4嵌套類(lèi)10.5const成員函數(shù)10.6類(lèi)成員的訪問(wèn)控制10.7靜態(tài)成員10.8友元函數(shù)10.9實(shí)戰(zhàn)演練——棧類(lèi)的實(shí)現(xiàn)10.1面向?qū)ο缶幊谈攀?/p>

10.1.1面向?qū)ο缶幊痰膸讉€(gè)概念10.1.2面向?qū)ο缶幊膛c面向過(guò)程編程的區(qū)別

10.2認(rèn)識(shí)類(lèi)

10.2.1類(lèi)的基本概念10.2.2類(lèi)的定義10.2.3類(lèi)對(duì)象的生成10.2.4類(lèi)對(duì)象指針10.3成員函數(shù)

類(lèi)中含有兩種成分,即數(shù)據(jù)成員和函數(shù)成員。函數(shù)成員又稱為成員函數(shù)。成員函數(shù)的定義有兩種方式。(1)類(lèi)聲明時(shí)給出函數(shù)原型,函數(shù)體在外部定義。函數(shù)定義形式為:返回類(lèi)型類(lèi)名::函數(shù)名(參數(shù)列表){}10.4嵌套類(lèi)

在一個(gè)類(lèi)的內(nèi)部再定義另外一個(gè)類(lèi),稱為嵌套類(lèi)或者嵌套類(lèi)型。嵌套類(lèi)的作用作為外部類(lèi)的底層實(shí)現(xiàn),同時(shí)具有隱藏底層實(shí)現(xiàn)的作用。雖然嵌套類(lèi)是定義在外圍類(lèi)內(nèi)部的,但是它和外部類(lèi)沒(méi)有相互關(guān)聯(lián)的關(guān)系。嵌套類(lèi)的成員與外圍類(lèi)的成員互不相干,嵌套類(lèi)的成員并不屬于外部類(lèi)。如果嵌套類(lèi)與外部類(lèi)相互訪問(wèn),遵循兩個(gè)普通類(lèi)之間相互訪問(wèn)的規(guī)則,兩者對(duì)對(duì)方的數(shù)據(jù)成員并沒(méi)有任何特權(quán)。對(duì)于嵌套類(lèi)內(nèi)部的成員定義,如果不在嵌套類(lèi)內(nèi)部定義,則必須要寫(xiě)到與外圍類(lèi)相同的作用域內(nèi),不能將定義寫(xiě)到外圍類(lèi)中。10.5const成員函數(shù)

在需要定義類(lèi)成員函數(shù)的時(shí)候,有些函數(shù)的作用并不改變類(lèi)的數(shù)據(jù)成員,在C++中稱之為“只讀”函數(shù),通常使用const關(guān)鍵字進(jìn)行標(biāo)識(shí)。在編譯過(guò)程中,如果定義為const的成員函數(shù)企圖修改數(shù)據(jù)成員值,編譯程序就會(huì)報(bào)錯(cuò),這樣提高了程序的可靠性。10.6類(lèi)成員的訪問(wèn)控制

10.6.1私有成員10.6.2公有成員10.6.3保護(hù)成員10.7靜態(tài)成員

10.7.1靜態(tài)數(shù)據(jù)成員10.7.2靜態(tài)成員函數(shù)10.8友元函數(shù)

對(duì)于一般的函數(shù)來(lái)說(shuō),如果想要訪問(wèn)類(lèi)中的保護(hù)數(shù)據(jù)成員,必須通過(guò)類(lèi)的公共函數(shù)來(lái)訪問(wèn),對(duì)于公共函數(shù)來(lái)說(shuō),任何外部函數(shù)都可以調(diào)用,對(duì)安全性有一定的影響。在C++中引入友元函數(shù)的概念,使用friend關(guān)鍵字來(lái)定義友元函數(shù)。通過(guò)友元函數(shù),可以直接調(diào)用類(lèi)中的保護(hù)成員,不需要將成員全部設(shè)置成public,使數(shù)據(jù)的安全性得到了保障。利用友元函數(shù)訪問(wèn)類(lèi)中的數(shù)據(jù)成員,這樣就避免了總是調(diào)用類(lèi)的成員函數(shù)所造成的內(nèi)存開(kāi)銷(xiāo)大,效率低的問(wèn)題。10.9實(shí)戰(zhàn)演練——棧類(lèi)的實(shí)現(xiàn)棧(stack)是程序設(shè)計(jì)過(guò)程中經(jīng)常遇到的一種數(shù)據(jù)結(jié)構(gòu)形式,它對(duì)于數(shù)據(jù)的存放和操作有下面這樣的特點(diǎn)。(1)它只有一個(gè)對(duì)數(shù)據(jù)進(jìn)行存入和取出的端口。(2)后進(jìn)者先出,即最后被存入的數(shù)據(jù)將首先被取出。其形式很像一種存儲(chǔ)硬幣的小容器,每次只可以從頂端壓入一個(gè)硬幣,而取出也只可以從頂端進(jìn)行,即后進(jìn)先出。第11章類(lèi)的特殊函數(shù)——

構(gòu)造函數(shù)和析構(gòu)函數(shù)本章內(nèi)容11.1構(gòu)造函數(shù)初始化類(lèi)對(duì)象11.2析構(gòu)函數(shù)清除類(lèi)對(duì)象11.3默認(rèn)構(gòu)造函數(shù)11.4重載構(gòu)造函數(shù)11.5類(lèi)對(duì)象數(shù)組的初始化11.6拷貝構(gòu)造函數(shù)11.7實(shí)戰(zhàn)演練——構(gòu)造函數(shù)和析構(gòu)函數(shù)的應(yīng)用11.1構(gòu)造函數(shù)初始化類(lèi)對(duì)象

11.1.1什么是構(gòu)造函數(shù)11.1.2使用構(gòu)造函數(shù)11.1.1什么是構(gòu)造函數(shù)

在C++的類(lèi)中,構(gòu)造函數(shù)是一種特殊的函數(shù),它的主要功能就是在創(chuàng)建對(duì)象的時(shí)候,給對(duì)象變量賦值。在定義一個(gè)類(lèi)的對(duì)象時(shí),使用new關(guān)鍵字時(shí),都會(huì)隱式或者顯示的調(diào)用構(gòu)造函數(shù)。一個(gè)類(lèi)中的構(gòu)造韓式可以重載,也就是說(shuō)一個(gè)類(lèi)可以有多個(gè)構(gòu)造函數(shù)。11.1.2使用構(gòu)造函數(shù)C++的構(gòu)造函數(shù)定義格式為:class<類(lèi)名>{public:<類(lèi)名>(參數(shù)表)//...(還可以聲明其他成員函數(shù))};<類(lèi)名>::<函數(shù)名>(參數(shù)表){//函數(shù)體}11.2析構(gòu)函數(shù)清除類(lèi)對(duì)象

析構(gòu)函數(shù)是另外一個(gè)在類(lèi)中比較特殊的函數(shù),它可以理解成為反向的構(gòu)造函數(shù)。調(diào)用的時(shí)機(jī)與構(gòu)造函數(shù)相反,它是在對(duì)象被撤銷(xiāo)的時(shí)候調(diào)用。析構(gòu)函數(shù)的命名規(guī)則就是在類(lèi)名的前面加一個(gè)“~”符號(hào),它的主要作用就是在此對(duì)象撤銷(xiāo)的時(shí)候釋放所占用的資源。在建立一個(gè)類(lèi)的對(duì)象時(shí),首先調(diào)用構(gòu)造函數(shù),對(duì)這個(gè)對(duì)象進(jìn)行進(jìn)行初始化。當(dāng)這個(gè)對(duì)象的生命周期結(jié)束的時(shí)候,則調(diào)用析構(gòu)函數(shù)。11.3默認(rèn)構(gòu)造函數(shù)

在C++中,并不是在一個(gè)類(lèi)中沒(méi)有定義構(gòu)造函數(shù),就一定會(huì)有一個(gè)默認(rèn)的構(gòu)造函數(shù),只有在下面4中情況下,C++才會(huì)構(gòu)造一個(gè)默認(rèn)的構(gòu)造函數(shù):(1)在一個(gè)類(lèi)中,帶有含有默認(rèn)構(gòu)造函數(shù)的成員類(lèi),才會(huì)自動(dòng)生成一個(gè)構(gòu)造函數(shù)。(2)一個(gè)類(lèi)繼承于帶有默認(rèn)構(gòu)造函數(shù)的基類(lèi)。(3)類(lèi)中帶有虛函數(shù)會(huì)生成默認(rèn)構(gòu)造函數(shù)。(4)帶有虛基類(lèi)的類(lèi)會(huì)生成默認(rèn)構(gòu)造函數(shù)。11.4重載構(gòu)造函數(shù)

11.4.1重載構(gòu)造函數(shù)的作用11.4.2重載構(gòu)造函數(shù)的調(diào)用11.5類(lèi)對(duì)象數(shù)組的初始化

11.5.1類(lèi)對(duì)象數(shù)組調(diào)用11.5.2類(lèi)對(duì)象數(shù)組和默認(rèn)構(gòu)造函數(shù)11.5.3類(lèi)對(duì)象數(shù)組和析構(gòu)函數(shù)11.6拷貝構(gòu)造函數(shù)

11.6.1拷貝構(gòu)造函數(shù)的概念11.6.2深拷貝和淺拷貝11.6.1拷貝構(gòu)造函數(shù)的概念

拷貝構(gòu)造函數(shù)的格式如下:class類(lèi)名{public:類(lèi)名(形參參數(shù))//構(gòu)造函數(shù)的聲明/原型類(lèi)名(類(lèi)名&對(duì)象名)//拷貝構(gòu)造函數(shù)的聲明/原型...};11.6.2深拷貝和淺拷貝在程序運(yùn)行過(guò)程中,如果一個(gè)對(duì)象的變量B動(dòng)態(tài)開(kāi)辟了一個(gè)內(nèi)存空間,在進(jìn)行位拷貝時(shí),就把B的值完全賦值給A。在賦值過(guò)程中,就是A中的變量與指向同一內(nèi)存空間。但是,如果B將內(nèi)存釋放,A中的指針就沒(méi)有了指向,也就是野指針,這樣就會(huì)發(fā)生運(yùn)行錯(cuò)誤。從這一個(gè)實(shí)例,就引出了深拷貝和淺拷貝的概念。深拷貝和淺拷貝可以簡(jiǎn)單理解為:如果一個(gè)類(lèi)擁有一個(gè)資源,當(dāng)這個(gè)類(lèi)的對(duì)象發(fā)生復(fù)制過(guò)程的時(shí)候,資源重新分配,這個(gè)過(guò)程就是深拷貝,反之,沒(méi)有重新分配資源,就是淺拷貝。11.7實(shí)戰(zhàn)演練——構(gòu)造函數(shù)和析構(gòu)函數(shù)的應(yīng)用

為了讓大家對(duì)構(gòu)造函數(shù)和析構(gòu)函數(shù)有總體的把握,首先定義一個(gè)類(lèi)。ClassclxBeginEnd{Public:clxBeginEnd();clxBeginEnd(inta);~clxBeginEnd();}第12章賦予新功能——

運(yùn)算符的重載本章內(nèi)容12.1什么是運(yùn)算符重載12.2重載前置運(yùn)算符和后置運(yùn)算符12.3插入運(yùn)算符和折取運(yùn)算符的重載12.4常用運(yùn)算符的重載12.5實(shí)戰(zhàn)演練——重載運(yùn)算符綜合應(yīng)用12.1什么是運(yùn)算符重載

12.1.1運(yùn)算符重載的形式12.1.2可重載的運(yùn)算符12.1.1運(yùn)算符重載的形式

運(yùn)算符重載為類(lèi)的成員函數(shù)的一般格式為:<函數(shù)類(lèi)型>operator<運(yùn)算符>(<參數(shù)表>){<函數(shù)體>}當(dāng)運(yùn)算符重載為類(lèi)的成員函數(shù)時(shí),函數(shù)的參數(shù)個(gè)數(shù)比原來(lái)的操作數(shù)要少一個(gè)(后置單目運(yùn)算符除外),這是因?yàn)槌蓡T函數(shù)用this指針隱式地訪問(wèn)了類(lèi)的一個(gè)對(duì)象,它充當(dāng)了運(yùn)算符函數(shù)最左邊的操作數(shù)。12.1.2可重載的運(yùn)算符+-*/%^&|~!=<

>

+=-=*=/=%=^=&=|=<<

>>

>>=<<===!=<=>=&&||++--->*,->[]()newdeletenew[]delete[]

12.2重載前置運(yùn)算符和后置運(yùn)算符

12.2.1重載前置運(yùn)算符12.2.2重載后置運(yùn)算符12.2.1重載前置運(yùn)算符

在C++中編譯器是根據(jù)運(yùn)算符重載函數(shù)參數(shù)表里是否插入關(guān)鍵字int來(lái)區(qū)分前置還是后置運(yùn)算。成員運(yùn)算符函數(shù)形式:ob.operater++()。友元運(yùn)算符函數(shù)形式:operator++(x&obj)。12.2.2重載后置運(yùn)算符上一節(jié)對(duì)前置運(yùn)算符重載作了闡述。在本節(jié)中將闡述如何對(duì)后置運(yùn)算符進(jìn)行重載?后置運(yùn)算符重載格式如下。成員運(yùn)算符函數(shù)形式:ob.operater++(int)。友元運(yùn)算符函數(shù)形式:operator++(x&obj,int)。12.3插入運(yùn)算符和折取運(yùn)算符的重載

12.3.1插入運(yùn)算符的重載12.3.2折取運(yùn)算符重載12.3.1插入運(yùn)算符的重載

在頭文件iostream中,對(duì)運(yùn)算符<<進(jìn)行重載,能輸出各種標(biāo)準(zhǔn)類(lèi)型的數(shù)據(jù),其原型形式如下:Ostream&operator<<(ostream&類(lèi)型名)12.3.2折取運(yùn)算符重載在頭文件iostream中,對(duì)運(yùn)算符>>進(jìn)行重載,能輸入各種標(biāo)準(zhǔn)類(lèi)型的數(shù)據(jù),其原型形式如下。istream&operator<<(istream&類(lèi)型名&)12.4常用運(yùn)算符的重載

12.4.1“<”運(yùn)算符的重載12.4.2+運(yùn)算符的重載12.4.3=賦值運(yùn)算符重載12.4.1“<”運(yùn)算符的重載

在該例中,定義了一個(gè)test類(lèi),該類(lèi)有兩個(gè)int型的成員,并且定義了該類(lèi)帶參數(shù)的構(gòu)造函數(shù)為該類(lèi)的成員賦值。重載了<運(yùn)算符,只有兩個(gè)成員變量同時(shí)小于另外一個(gè)對(duì)象的成員變量才返回為真。在主程序中,首先聲明了test類(lèi)的兩個(gè)對(duì)象,分別是int1和int2,再對(duì)該類(lèi)對(duì)象進(jìn)行比較,如果為真,輸出“ok!”;如果為假,輸出“false!”。12.4.2+運(yùn)算符的重載

在該例中,定義了一個(gè)test類(lèi),該類(lèi)有兩個(gè)int型的成員,并且定義了該類(lèi)帶參數(shù)的構(gòu)造函數(shù)為該類(lèi)的成員賦值。重載了+運(yùn)算符,將該類(lèi)的兩個(gè)成員分別相加。在主程序中,首先聲明了test類(lèi)的兩個(gè)對(duì)象,分別是int1和int2,int1的成員為(1,2),int2的成員為(2,3),同時(shí)定義了int3,該對(duì)象調(diào)用默認(rèn)構(gòu)造函數(shù)。最后,將int1和int2相加,賦值給int3,并且把int3的值輸出。12.4.3=賦值運(yùn)算符重載

對(duì)于一個(gè)類(lèi)的兩個(gè)對(duì)象,賦值運(yùn)算符=是可以使用的,在編譯過(guò)程中會(huì)生成一個(gè)默認(rèn)的賦值函數(shù),將兩個(gè)對(duì)象的成員逐一賦值,實(shí)現(xiàn)淺拷貝。但是,如果數(shù)據(jù)成員是指針類(lèi)型的變量,這種淺拷貝就會(huì)產(chǎn)生內(nèi)存泄漏的錯(cuò)誤。在這種情況下,就必須重載賦值運(yùn)算符“=”,實(shí)現(xiàn)兩個(gè)對(duì)象的賦值運(yùn)算。12.5實(shí)戰(zhàn)演練——重載運(yùn)算符綜合應(yīng)用

在該例中,首先定義了一個(gè)復(fù)數(shù)類(lèi),該類(lèi)有兩個(gè)數(shù)據(jù)成員,一個(gè)實(shí)部和一個(gè)虛部,成員函數(shù)定義中重載了構(gòu)造函數(shù),定義了重載運(yùn)算符+和和display函數(shù)顯示復(fù)數(shù)。接下來(lái),實(shí)現(xiàn)運(yùn)算符+,是把兩個(gè)復(fù)數(shù)的實(shí)部和虛部相加,運(yùn)算符是把兩個(gè)復(fù)數(shù)的實(shí)部和虛部相減。在主程序中,定義復(fù)數(shù)類(lèi)的對(duì)象c、c1、c2、c3,初始化c1和c,把c1+c賦值給c2,把c-c1賦值給c2,調(diào)用c2和c3的display函數(shù),將結(jié)果輸出。第13章實(shí)現(xiàn)代碼重用——

類(lèi)的繼承本章內(nèi)容13.1繼承的基本概念13.2調(diào)用父類(lèi)中的構(gòu)造函數(shù)13.3子類(lèi)存取父類(lèi)成員13.4多繼承13.5實(shí)戰(zhàn)演練——繼承的綜合應(yīng)用13.1繼承的基本概念

13.1.1基類(lèi)和繼承類(lèi)13.1.2簡(jiǎn)單的基礎(chǔ)實(shí)例13.1.1基類(lèi)和繼承類(lèi)

單繼承的定義如下。.classB:public.{<派生類(lèi)新定義成員>.};多繼承的定義如下。classC:publicA,privateB.{.<派生類(lèi)新定義成員>};13.1.2簡(jiǎn)單的基礎(chǔ)實(shí)例首先,定義一個(gè)類(lèi)Cbase的基類(lèi),在該類(lèi)中定義了兩個(gè)成員,分別是name和age,還定義了兩個(gè)public的函數(shù)和兩個(gè)protected函數(shù)。使用公有繼承的方式,定義了Cbase類(lèi)的繼承類(lèi)CDerive,在該繼承類(lèi)中,調(diào)用了基類(lèi)的保護(hù)成員和私有成員,但是在編譯時(shí),調(diào)用私有成員出錯(cuò),說(shuō)明繼承類(lèi)不能直接訪問(wèn)基類(lèi)的私有成員。在主函數(shù)中,聲明了一個(gè)繼承類(lèi)的對(duì)象,并且通過(guò)繼承類(lèi)分別調(diào)用了基類(lèi)的私有成員、公有成員、保護(hù)成員。13.2調(diào)用父類(lèi)中的構(gòu)造函數(shù)

構(gòu)造函數(shù)也是類(lèi)的一種方法,那么在繼承過(guò)程中,構(gòu)造函數(shù)是怎樣被使用的呢?構(gòu)造函數(shù)用來(lái)初始化類(lèi)的對(duì)象,與基類(lèi)的其他成員不同,它不能被繼承類(lèi)繼承(繼承類(lèi)可以繼承父類(lèi)所有的成員變量和成員方法,但不繼承父類(lèi)的構(gòu)造方法)。因此,在創(chuàng)建子類(lèi)對(duì)象時(shí),為了初始化從父類(lèi)繼承來(lái)的數(shù)據(jù)成員,系統(tǒng)需要調(diào)用其父類(lèi)的構(gòu)造方法。提示:在類(lèi)中對(duì)派生類(lèi)構(gòu)造函數(shù)作聲明時(shí),不包括基類(lèi)構(gòu)造函數(shù)名及其參數(shù)表列。13.3子類(lèi)存取父類(lèi)成員

13.3.1私有成員的存取13.3.2繼承與靜態(tài)成員13.3.1私有成員的存取

父類(lèi)中的private屬性和方法,子類(lèi)雖然繼承了,但這些屬性和方法對(duì)子類(lèi)是隱藏的,其訪問(wèn)權(quán)限仍然只局限在父類(lèi)的內(nèi)部,無(wú)法在子類(lèi)中訪問(wèn)和重寫(xiě)。那么,子類(lèi)如何訪問(wèn)父類(lèi)的私有成員呢?只有在父類(lèi)中建立訪問(wèn)接口函數(shù),通過(guò)該函數(shù)來(lái)訪問(wèn)父類(lèi)的私有成員。13.3.2繼承與靜態(tài)成員對(duì)于父類(lèi)中的靜態(tài)成員,子類(lèi)也是共享此變量的,因?yàn)檫@個(gè)變量在編譯的時(shí)候就進(jìn)行了內(nèi)存分配,所以對(duì)該變量的操作都是對(duì)同一地址段進(jìn)行。當(dāng)然,在子類(lèi)中要使用父類(lèi)的成員變量,肯定不能聲明為private,也不能用private方式繼承。提示:基類(lèi)和其派生類(lèi)將共享該基類(lèi)的靜態(tài)成員變量?jī)?nèi)存。13.4多繼承

多繼承下派生類(lèi)的定義格式如下:class<派生類(lèi)名>:<繼承方式1><基類(lèi)名1>,<繼承方式2><基類(lèi)名2>,…{<派生類(lèi)類(lèi)體>};其中,<繼承方式1><繼承方式2>…是public、private、protected三種繼承方式之一。13.5實(shí)戰(zhàn)演練——繼承的綜合應(yīng)用

定義一個(gè)基類(lèi)Animal,它包含兩個(gè)私有數(shù)據(jù)成員,一個(gè)是string,存儲(chǔ)動(dòng)物的名稱;另一個(gè)是整數(shù)成員weight,包含該動(dòng)物的重量。該類(lèi)還包含一個(gè)公共成員函數(shù)who(),它可以顯示一個(gè)消息,給出Animal對(duì)象的名稱和重量。把Animal用作公共基類(lèi),派生兩個(gè)類(lèi)Lion和Aardvark。再編寫(xiě)一個(gè)main()函數(shù),創(chuàng)建Lion對(duì)象("Leo",400)和Aardvark對(duì)象("Algernon",50)。為派生類(lèi)對(duì)象調(diào)用who()成員,說(shuō)明who()成員在兩個(gè)派生類(lèi)中是繼承得來(lái)的。第14章實(shí)現(xiàn)多態(tài)性——

虛函數(shù)和抽象類(lèi)本章內(nèi)容14.1什么是虛函數(shù)14.2抽象類(lèi)與純虛函數(shù)14.3抽象類(lèi)的多重繼承14.4虛函數(shù)表14.5實(shí)戰(zhàn)演練——抽象類(lèi)的綜合應(yīng)用14.1什么是虛函數(shù)

14.1.1虛函數(shù)的作用14.1.2動(dòng)態(tài)綁定和靜態(tài)綁定14.1.1虛函數(shù)的作用

虛函數(shù)首先是一種成員函數(shù),它可以在該類(lèi)的派生類(lèi)中被重新定義并被賦予另外一種處理功能。class類(lèi)名{public:virtual成員函數(shù)說(shuō)明;}class類(lèi)名:基類(lèi)名{public:virtual成員函數(shù)說(shuō)明;}14.1.2動(dòng)態(tài)綁定和靜態(tài)綁定

C++為了支持多態(tài)性,引入了動(dòng)態(tài)綁定和靜態(tài)綁定。理解它們的區(qū)別有助于更好地理解多態(tài)性,以及在編程的過(guò)程中避免犯錯(cuò)誤。靜態(tài)綁定的是對(duì)象的靜態(tài)類(lèi)型,某特性(如函數(shù))依賴于對(duì)象的靜態(tài)類(lèi)型,發(fā)生在編譯期。動(dòng)態(tài)綁定的是對(duì)象的動(dòng)態(tài)類(lèi)型,某特性(如函數(shù))依賴于對(duì)象的動(dòng)態(tài)類(lèi)型,發(fā)生在運(yùn)行期。只有采用“指針->函數(shù)()”或“引用變量。函數(shù)()”的方式調(diào)用C++類(lèi)中的虛函數(shù)才會(huì)執(zhí)行動(dòng)態(tài)綁定。對(duì)于C++中的非虛函數(shù),因?yàn)槠洳痪邆鋭?dòng)態(tài)綁定的特征,所以不管采用什么樣的方式調(diào)用,都不會(huì)執(zhí)行動(dòng)態(tài)綁定。14.2抽象類(lèi)與純虛函數(shù)

14.2.1定義純虛函數(shù)14.2.2抽象類(lèi)的作用14.2.3虛析構(gòu)函數(shù)14.2.1定義純虛函數(shù)

純虛函數(shù)是一種特殊的虛函數(shù),它的一般格式如下:class<類(lèi)名>{virtual<類(lèi)型><函數(shù)名>(<參數(shù)表>)=0;};提示:純虛函數(shù)應(yīng)該只有聲明,沒(méi)有具體的定義,即使給出了純虛函數(shù)的定義也會(huì)被編譯器忽略。14.2.2抽象類(lèi)的作用

抽象類(lèi)首先是一種類(lèi),它沒(méi)有具體的實(shí)現(xiàn)方法,只是為了作為一個(gè)基類(lèi)來(lái)實(shí)現(xiàn)對(duì)事物的抽象。一個(gè)抽象類(lèi)是不能定義對(duì)象的,只能作為基類(lèi)來(lái)被繼承。抽象類(lèi)的主要作用就是作為基類(lèi)來(lái)被繼承,由它作為一個(gè)公共的接口,每個(gè)派生類(lèi)都是從這個(gè)公共接口派生出來(lái)的。一個(gè)抽象類(lèi),描述了相同屬性的事務(wù)的一組公共操作接口,派生類(lèi)繼承抽象類(lèi),然后將抽象類(lèi)定義的公共接口實(shí)現(xiàn),體現(xiàn)多態(tài)性。當(dāng)一個(gè)類(lèi)繼承了一個(gè)基類(lèi)時(shí),派生類(lèi)就實(shí)現(xiàn)了基類(lèi)中定義的虛函數(shù)。如果一個(gè)派生類(lèi)沒(méi)有將基類(lèi)的純虛函數(shù)全部實(shí)現(xiàn),那么這個(gè)派生類(lèi)仍然是一個(gè)抽象類(lèi),不能用來(lái)定義對(duì)象。如果一個(gè)派生類(lèi)將抽象類(lèi)全部實(shí)現(xiàn)了,那么這個(gè)派生了就不再是抽象類(lèi)了,它可以用來(lái)定義對(duì)象。14.2.3虛析構(gòu)函數(shù)

在C++中,虛函數(shù)不能作為構(gòu)造函數(shù)。原因其實(shí)很簡(jiǎn)單,如果構(gòu)造函數(shù)是虛函數(shù),在初始化對(duì)象的時(shí)候就不能確定正確的成員數(shù)據(jù)類(lèi)型。但是,析構(gòu)函數(shù)卻可以聲明為虛函數(shù),因?yàn)槲鰳?gòu)函數(shù)可以不做具體的操作。提示:如果不需要基類(lèi)對(duì)派生類(lèi)及對(duì)象進(jìn)行操作,則不能定義虛函數(shù)(包括虛析構(gòu)函數(shù)),因?yàn)檫@樣會(huì)增加內(nèi)存開(kāi)銷(xiāo)。使用虛析構(gòu)函數(shù),是為了當(dāng)用一個(gè)基類(lèi)的指針刪除一個(gè)派生類(lèi)的對(duì)象時(shí),派生類(lèi)的析構(gòu)函數(shù)會(huì)被調(diào)用。14.3抽象類(lèi)的多重繼承

在實(shí)際生活當(dāng)中,一個(gè)事務(wù)往往擁有多個(gè)屬性。在面向?qū)ο蟪绦蛟O(shè)計(jì)的方法中,引入了多重繼承的概念來(lái)實(shí)現(xiàn)這種概念。在C++中,一個(gè)派生類(lèi)可以有多個(gè)基類(lèi),這樣的繼承機(jī)構(gòu)稱之為多重繼承。舉個(gè)例子,交通工具類(lèi)可以派生出汽車(chē)和船兩個(gè)子類(lèi),但同時(shí)擁有汽車(chē)和船特性的水陸兩用汽車(chē)就必須繼承來(lái)自汽車(chē)類(lèi)與船類(lèi)的屬性。在多重繼承中,以抽象類(lèi)作為基類(lèi),不實(shí)現(xiàn)抽象類(lèi)中的方法。在這個(gè)例子中,先定義汽車(chē)和船的抽象類(lèi),再定義汽陸兩用船時(shí)即可以多重繼承,然后具體實(shí)現(xiàn)各個(gè)抽象類(lèi)的方法。14.4虛函數(shù)表

14.4.1什么是虛函數(shù)表14.4.2繼承關(guān)系的虛函數(shù)表14.4.1什么是虛函數(shù)表

在C++中,是通過(guò)虛函數(shù)表來(lái)實(shí)現(xiàn)虛函數(shù)的調(diào)用的,虛函數(shù)表簡(jiǎn)稱為V-Table.。在虛函數(shù)表中主要存的就是某個(gè)類(lèi)的虛函數(shù)的地址,保存了這個(gè)虛函數(shù)由哪個(gè)類(lèi)繼承實(shí)現(xiàn),通過(guò)這個(gè)表能夠真實(shí)的反應(yīng)函數(shù)的繼承情況。其實(shí),虛函數(shù)表就是起到一個(gè)地圖的作用,當(dāng)有一個(gè)派生類(lèi)通過(guò)父類(lèi)的指針來(lái)進(jìn)行操作時(shí),就可以查找虛函數(shù)表中地址找到虛函數(shù)所占的內(nèi)存地址了。使用虛函數(shù)表的過(guò)程是這樣的,通過(guò)一個(gè)對(duì)象地址找個(gè)該表的地址,遍歷該表中保存的虛函數(shù)的地址,通過(guò)地址調(diào)用相應(yīng)的函數(shù)。14.4.2繼承關(guān)系的虛函數(shù)表

14.5實(shí)戰(zhàn)演練——抽象類(lèi)的綜合應(yīng)用

在本例中,定義了一個(gè)抽象類(lèi)Shape,該類(lèi)定義了一個(gè)數(shù)據(jù)成員s代表面積,還定義了一個(gè)純虛函數(shù)Area,計(jì)算該圖形的面積。定義一個(gè)矩形的派生類(lèi),在該派生類(lèi)中定義兩個(gè)成員長(zhǎng)和寬,再實(shí)現(xiàn)計(jì)算Area的功能。定義一個(gè)圓形的派生類(lèi),在該派生類(lèi)中定義一個(gè)成員半徑,再實(shí)現(xiàn)計(jì)算Area的功能。定義一個(gè)梯形的派生類(lèi),在該派生類(lèi)中定義上底、下底和高,再實(shí)現(xiàn)計(jì)算Area的功能。在主程序中,聲明了抽象類(lèi)指針,定義了矩形、圓形、梯形類(lèi)的對(duì)象,并且把各種類(lèi)的地址指向抽象類(lèi)指針,調(diào)用抽象類(lèi)的Area函數(shù),把每種圖形面積輸出。第15章數(shù)據(jù)存儲(chǔ)——C++操作文件本章內(nèi)容15.1文件的基本概念15.2文件的打開(kāi)與關(guān)閉15.3文本文件的處理15.4處理二進(jìn)制文件15.5實(shí)戰(zhàn)演練——文件操作15.1文件的基本概念

15.1.1文件I/O15.1.2文件順序讀寫(xiě)15.1.3隨機(jī)文件讀寫(xiě)15.1.1文件I/O

在C++的標(biāo)準(zhǔn)庫(kù)中,對(duì)于文件I/O操作有著比較豐富的類(lèi)。這些類(lèi)都是由一個(gè)抽象類(lèi)作為基類(lèi),然后由這些抽象類(lèi)派生出具體的實(shí)現(xiàn)類(lèi),這樣派生類(lèi)就是用來(lái)實(shí)現(xiàn)對(duì)文件的I/O等操作。文件的I/O操作都是通過(guò)“流”來(lái)操作的,文件流可以在計(jì)算機(jī)的內(nèi)外存之間來(lái)回流動(dòng),實(shí)現(xiàn)文件的I/O操作。在C++中對(duì)文件進(jìn)行操作分為以下幾個(gè)步驟。(1)建立文件流對(duì)象。(2)打開(kāi)或建立文件。(3)進(jìn)行讀寫(xiě)操作。(4)關(guān)閉文件。15.1.2文件順序讀寫(xiě)

在C++的文件中,每條記錄是一個(gè)接著一個(gè)存儲(chǔ)的。在這樣的文件中,如果想要查找一條記錄,那么必須從文件的開(kāi)頭逐一讀取文件的記錄,直至找到該條記錄的位置。順序文件的讀取,可以參見(jiàn)實(shí)例15-1,就是按照順序讀取文件中的每個(gè)字節(jié),然后輸出。15.1.3隨機(jī)文件讀寫(xiě)在本例中,首先定義了一個(gè)函數(shù)讀取某個(gè)文件某一行的內(nèi)容;在主程序中,提示輸入文件名和行數(shù),將該文件的第n行讀出,顯示出來(lái)。15.2文件的打開(kāi)與關(guān)閉

15.2.1文件的打開(kāi)15.2.2文件的關(guān)閉15.3文本文件的處理

15.3.1將變量寫(xiě)入到文件15.3.2將變量寫(xiě)入文件尾部15.3.3從文本文件中讀入變量15.3.4使用get()、getline()和put()函數(shù)15.3.1將變量寫(xiě)入到文件

在本例中,首先定義了一個(gè)ofstream類(lèi)的變量outfile,建立一個(gè)a.txt文件,通過(guò)<<將字符串“abcd”寫(xiě)入該文件中,最后關(guān)閉該文件。從運(yùn)行結(jié)果可以看出,ofstream生成了一個(gè)a.txt文件,并且在該文件中寫(xiě)入了字符串。15.3.2將變量寫(xiě)入文件尾部

在本例中,首先定義了一個(gè)ofstream類(lèi)的變量outfile,采用追加的打開(kāi)方式打開(kāi)了a.txt,通過(guò)<<將字符串“efg”寫(xiě)入該文件中,最后關(guān)閉該文件。15.3.3從文本文件中讀入變量

在本例中,首先定義了一個(gè)ifstream類(lèi)的變量infile,打開(kāi)文本文件a.txt,通過(guò)<<將字符串“君自故鄉(xiāng)來(lái),應(yīng)知故鄉(xiāng)事。來(lái)日綺窗前,寒梅著花未?”循環(huán)地輸出到屏幕上,最后關(guān)閉該文件。15.3.4使用get()、getline()和put()函數(shù)

在C++中,get()函數(shù)是ifstream類(lèi)的一個(gè)成員函數(shù),它的作用就是讀取該類(lèi)的對(duì)象的一個(gè)字符并且將該之作為調(diào)用函數(shù)的返回值。在調(diào)用get()函數(shù)時(shí),get()函數(shù)會(huì)自動(dòng)的向后讀取下一個(gè)字符,直到遇到文件結(jié)束符,則返回EOF作

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論