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

下載本文檔

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

文檔簡介

C++從入門到精通第1章解開C++的神秘面紗——

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

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

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

隨著C++的不斷發(fā)展,C++的集成開發(fā)環(huán)境也有著長足的發(fā)展,其開發(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更新):家庭高級版、專業(yè)版、企業(yè)版、旗艦版

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

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

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

1.5.2菜單欄

1.5.3工具欄

1.5.4工具箱面板

1.5.5屬性面板

1.5.6錯誤列表

1.5.7輸出面板

1.6實戰(zhàn)演練——第一個C++項目

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

C++的程序結構

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

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

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

2.4命名空間

2.4.1命名空間的定義2.4.2using關鍵字2.4.3命名空間std2.4.1命名空間的定義

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

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

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

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

3.1.1保留字3.1.2標識符命名3.2變量與常量

3.2.1變量3.2.2常量3.3基本變量類型

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

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

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

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

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

4.1.1賦值運算符4.1.2算術運算符4.1.3關系運算符4.1.4邏輯運算符4.1.5自增和自減運算符4.1.6位邏輯運算符4.1.7移位運算符4.1.8三元運算符4.1.9逗號運算符4.1.10類型轉換運算符4.2運算符優(yōu)先級和結合性

4.2.1運算符優(yōu)先級4.2.2運算符結合性4.2.1運算符優(yōu)先級

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

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

5.2條件判斷語句

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

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

5.4.1continue語句5.4.2break語句5.4.3goto語句5.5多重選擇——switch語句5.6實戰(zhàn)演練——流程控制綜合應用運輸公司要對用戶計算運費,假設每噸每公里的價格為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ù)的應用本章內(nèi)容6.1函數(shù)的基本結構6.2變量的作用域6.3特殊函數(shù)調(diào)用方式——遞歸調(diào)用6.4內(nèi)聯(lián)函數(shù)6.5預處理器6.6函數(shù)的重載6.7實戰(zhàn)演練——漢諾塔問題函數(shù)6.1函數(shù)的基本結構

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

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

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

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

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

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

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

局部變量是指限制在某一范圍內(nèi)使用的變量,局部變量經(jīng)常被稱為自動變量,因為它們在進入作用域時自動生成,采用堆棧方式分配內(nèi)存空間,離開作用域時,釋放內(nèi)存空間,值也自動消失。關鍵字auto可以顯式地說明這個問題,但是局部變量默認為auto,所以沒有必要聲明為auto。6.2.2靜態(tài)局部變量

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

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

使用寄存器變量的目的就是將變量放入寄存器中,而加快訪問速度。使用關鍵字“register”來聲明一個寄存器變量,如果在聲明寄存器變量時,系統(tǒng)的寄存器被其他數(shù)據(jù)占用,怎寄存器變量就變?yōu)榱司植孔兞俊J褂胷egister變量是有限制的:(1)不可能得到或計算register變量的地址;(2)register變量只能在一個塊中聲明(不可能有全局的或靜態(tài)的register變量)。然而可以在一個函數(shù)中(即在參數(shù)表中)使用register變量作為一個形式參數(shù)。一般地,不應當推測編譯器的優(yōu)化器,因為它可能比做得更好。因此,最好避免使用關鍵字register。6.3特殊函數(shù)調(diào)用方式——遞歸調(diào)用

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

斐波那契數(shù)列是意大利數(shù)學家列昂納多?斐波那契(LeonardoFibonacci)發(fā)現(xiàn)的。它的基本規(guī)律是從第3項開始,每一項都等于前兩項之和,第1項和第2項都是1。斐波那契數(shù)列如下所示:1、1、2、3、5、8、13、21、34……下面利用數(shù)組來輸出該數(shù)列的前30項。第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動態(tài)內(nèi)存配置8.9實戰(zhàn)演練——判斷字符串中有多少個整數(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指針的算術運算8.4.2利用指針存儲一維數(shù)組的元素8.4.3利用指針傳輸一維數(shù)組到函數(shù)中8.5指針與字符串

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

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

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

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

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

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

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

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

定義一個結構體類型的一般形式為:struct結構體名{成員項表列};其中,struct是定義結構體的關鍵字,結構體名是一個用戶定義的標識符,它規(guī)定了所定義的結構體的名稱。成員列表是用來定義結構體的組成成員的,每個成員包括成員名稱以及成員類型。9.1.2結構體變量的初始化與使用

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

9.2.1將整個結構體傳送到函數(shù)9.2.2傳送結構體的地址到函數(shù)9.2.1將整個結構體傳送到函數(shù)

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

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

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

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

9.4.1枚舉類型的定義和聲明9.4.2枚舉類型的初始化和使用9.4.1枚舉類型的定義和聲明

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

枚舉值名表};其中枚舉值名表格式如下:標識符1,標識符2,......,標識符n9.4.2枚舉類型的初始化和使用

枚舉類型的初始化形式為:enum[枚舉名]{

標識符1[=整型常量],

標識符2[=整型常量],......

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

認識面向對象編程本章內(nèi)容10.1面向對象編程概述10.2認識類10.3成員函數(shù)10.4嵌套類10.5const成員函數(shù)10.6類成員的訪問控制10.7靜態(tài)成員10.8友元函數(shù)10.9實戰(zhàn)演練——棧類的實現(xiàn)10.1面向對象編程概述

10.1.1面向對象編程的幾個概念10.1.2面向對象編程與面向過程編程的區(qū)別

10.2認識類

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

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

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

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

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

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

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

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

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

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

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

在C++中,并不是在一個類中沒有定義構造函數(shù),就一定會有一個默認的構造函數(shù),只有在下面4中情況下,C++才會構造一個默認的構造函數(shù):(1)在一個類中,帶有含有默認構造函數(shù)的成員類,才會自動生成一個構造函數(shù)。(2)一個類繼承于帶有默認構造函數(shù)的基類。(3)類中帶有虛函數(shù)會生成默認構造函數(shù)。(4)帶有虛基類的類會生成默認構造函數(shù)。11.4重載構造函數(shù)

11.4.1重載構造函數(shù)的作用11.4.2重載構造函數(shù)的調(diào)用11.5類對象數(shù)組的初始化

11.5.1類對象數(shù)組調(diào)用11.5.2類對象數(shù)組和默認構造函數(shù)11.5.3類對象數(shù)組和析構函數(shù)11.6拷貝構造函數(shù)

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

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

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

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

12.1.1運算符重載的形式12.1.2可重載的運算符12.1.1運算符重載的形式

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

>

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

>>

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

12.2重載前置運算符和后置運算符

12.2.1重載前置運算符12.2.2重載后置運算符12.2.1重載前置運算符

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

12.3.1插入運算符的重載12.3.2折取運算符重載12.3.1插入運算符的重載

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

12.4.1“<”運算符的重載12.4.2+運算符的重載12.4.3=賦值運算符重載12.4.1“<”運算符的重載

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

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

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

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

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

13.1.1基類和繼承類13.1.2簡單的基礎實例13.1.1基類和繼承類

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

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

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

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

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

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

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

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

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

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

14.2.1定義純虛函數(shù)14.2.2抽象類的作用14.2.3虛析構函數(shù)14.2.1定義純虛函數(shù)

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

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

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

在實際生活當中,一個事務往往擁有多個屬性。在面向對象程序設計的方法中,引入了多重繼承的概念來實現(xiàn)這種概念。在C++中,一個派生類可以有多個基類,這樣的繼承機構稱之為多重繼承。舉個例子,交通工具類可以派生出汽車和船兩個子類,但同時擁有汽車和船特性的水陸兩用汽車就必須繼承來自汽車類與船類的屬性。在多重繼承中,以抽象類作為基類,不實現(xiàn)抽象類中的方法。在這個例子中,先定義汽車和船的抽象類,再定義汽陸兩用船時即可以多重繼承,然后具體實現(xiàn)各個抽象類的方法。14.4虛函數(shù)表

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

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

14.5實戰(zhàn)演練——抽象類的綜合應用

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

15.1.1文件I/O15.1.2文件順序讀寫15.1.3隨機文件讀寫15.1.1文件I/O

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

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

15.2.1文件的打開15.2.2文件的關閉15.3文本文件的處理

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

在本例中,首先定義了一個ofstream類的變量outfile,建立一個a.txt文件,通過<<將字符串“abcd”寫入該文件中,最后關閉該文件。從運行結果可以看出,ofstream生成了一個a.txt文件,并且在該文件中寫入了字符串。15.3.2將變量寫入文件尾部

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

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

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

溫馨提示

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

評論

0/150

提交評論