本書系統地講解了C++的語法規則, 重點介紹了面向對象程序設計方法。全書分為10章, 包括C++編程簡介、C++語言的基礎知識、C++在非面向對象方面的常用新特性、類和對象、關于類和對象的進一步討論、運算符的重載、類的繼承與派生、多態性和虛函數, 以及模板、字符串和異常, C++的輸入與輸出。
1. 本教程對C++語言進行了深入淺出的介紹,把計算思維運用于程序設計,從基礎知識到ANSI-C++標準的*新功能,內容涵蓋了從C語言基礎知識、數組、類等基本概念到多態、模板等高級概念。教程本著實用的原則,每一小節都結合了可以實現的程序實例,以便讀者從第一課開始就可以上機實驗。
2. 重點利用C++進行面向對象編程,適合于大學計算機課程的高級語言程序設計和面向對象程序設計。重點介紹了類與對象、面向對象的三大特性以及C++的更多高級特性。本教材每一章都附有綜合實例和上機操作題,目的是提高學生的實踐動手能力。
3.本書綜合考慮了自學與教學兩方面因素,不僅適合高等學校教學,學生自學,同時也適應有一定開發經驗的程序員作為技術參考使用。
C++語言是一種面向對象的編程語言,它是當今最主流的面向對象編程語言之一,它的功能很強大,很容易被人們理解和接受。目前,大多數高校計算機專業和IT培訓學校都將C++作為基礎的教學內容之一,這對于培養學生的基礎編程能力具有非常重要的意義。
本書從教學的實際需求出發,結合初學者的認知規律,由淺入深、循序漸進地講解了與C++程序設計相關的知識,重點講解了C++面向對象的編程知識,并將C++語言知識和使用的示例有機結合起來,使知識和示例相輔相成,既有利于讀者學習知識,又有利于指導讀者實踐,有效地強化了實踐教學。具體來講,本書具有以下特色:
(1)本書中的所有實例程序都是完整的,通過Visual Studio C++調試,能夠在Windows XP、Windows 7系統下編譯和運行。
(2)結合大量直觀的示例來講解各部分的內容,提供了程序設計實現的具體步驟,使初學者快速掌握C++的編程方法,體會C++的簡單易學。
(3)本書的結構完整,根據循序漸進的認知規律設計各章節的內容。
(4)每章都配有學習目標、綜合實例、本章小結和習題,可以幫助讀者鞏固所學的知識點,鍛煉讀者的實際動手能力。
全書分為10章,各章的基本內容如下。
第1章: 介紹了面向對象的方法及其基本概念、C和C++的關系、C++程序的編寫和實現,概括地說明了Visual Studio 2010集成開發環境,并以示例使讀者熟悉開發C++程序的幾種操作過程。
第2章: 對C++語言的基礎知識進行了介紹,包括標識符與關鍵字、常量與變量、運算符與表達式、語句及其流程控制、函數、構造數據類型、指針、數組與指針的關系、結構體與共用體,旨在使讀者對C++語言有一個初步認識,為全書的學習打下基礎,也為之前學過C語言的同學對C++語言中的C語言知識做一個簡單的復習總結。
第3章: 講解了C++在非面向對象方面的常用新特性,主要講解與C語言的不同,包括簡單的C++輸入與輸出、用const定義常量、函數的重載、有默認參數的函數、引用、動態分配內存、布爾類型、函數原型、作用域運算符、內置函數以及C++的注釋,目的是在第2章的基礎上引入C++在非面向對象方面的新特性。
第4章: 介紹了面向對象的概念、類、對象的創建、類的成員函數、對象成員的引用、構造函數、析構函數、對象數組、對象指針、對象成員、對象創建時內存的動態分配。
第5章: 關于類和對象的進一步討論,主要講解了類的封裝性、作用域和可見性、類的靜態成員、友元、類模板、結構體和類、聯合體和類、共享數據的保護。
第6章: 講解了運算符的重載,主要包括運算符重載的一般概念、重載運算符的實現,以及單目運算符、雙目運算符和特殊運算符的重載。
第7章: 類的繼承與派生,主要包括繼承與派生的概念、單繼承、繼承中的構造函數與析構函數、多繼承與虛基類等。
第8章: 多態性和虛函數,主要講解C++多態的概念、虛函數、虛析構函數、純虛函數和抽象類。
第9章: 模板、字符串和異常,詳細介紹C++函數模板、模板類、C++模板中的函數式參數; 詳細描述C++ 中的string類和字符串,string字符串的訪問和拼接,string字符串的增、刪、改、查等操作; 介紹了C++異常處理、用throw拋出異常和C++中的exception類。
第10章: 詳細介紹了C++的輸入與輸出,不僅介紹了C++輸入輸出的概念,而且詳細講解了與C++輸入輸出有關的類和對象、標準的輸出流、C++格式化輸出,并在本章的最后幾節介紹了文件的概念、文件流類與文件流對象、文件的打開與關閉、對ASCII文件和二進制文件的讀寫操作以及對字符串流的讀寫操作。
本書由張娜編著,作為編者,雖有多年的程序設計語言教學經驗和工程實踐經驗,但也深知在這一領域仍有許多知識尚未融會貫通并正確使用,盡管在編寫過程中參考了多部相關教材和參考書,也和學生進行了深入交流,但由于編者水平有限,書中難免存在一些疏漏和不足之處,敬請廣大讀者批評指正。
編者
2017年5月
第1章C++編程簡介
1.1面向對象的方法
1.1.1面向對象編程
1.1.2面向對象方法的由來
1.1.3面向對象的語言
1.2面向對象的基本概念
1.2.1類和對象
1.2.2面向對象的特點
1.3C和C++的關系
1.4C++程序的編寫和實現
1.4.1用C++語言編寫程序
1.4.2對源程序進行編譯
1.4.3對目標文件進行鏈接
1.4.4運行程序
1.4.5分析運行結果
1.5如何用Visual Studio 2010編寫C++程序
1.5.1Visual Studio 2010編程環境
1.5.2Visual Studio 2010的啟動
1.5.3新建一個C++項目
1.5.4Visual Studio 2010界面介紹
綜合實例
本章小結
習題
第2章C++語言的基礎知識
2.1標識符與關鍵字
2.1.1標識符
2.1.2關鍵字
2.2常量與變量
2.2.1常量
2.2.2變量
2.3運算符與表達式
2.3.1算術運算符
2.3.2關系運算符
2.3.3邏輯運算符
2.3.4條件運算符
2.3.5位運算符
2.4語句及其流程控制
2.4.1語句
2.4.2if…else選擇結構
2.4.3switch選擇結構
2.4.4while語句
2.4.5do…while語句
2.4.6for循環結構
2.4.7程序中止函數exit()
2.5函數
2.5.1函數的結構和函數的定義
2.5.2函數名重載
2.5.3遞歸函數
2.5.4C++庫函數
2.6構造數據類型
2.6.1數組
2.6.2一維數組
2.6.3多維數組
2.7指針
2.7.1指針類型與指針的聲明
2.7.2指針變量的引用
2.7.3指向指針的指針
2.7.4指針的運算
2.8數組與指針的關系
2.8.1一維數組指針的表示法
2.8.2二維數組指針的表示法
2.8.3指針與字符串
2.8.4指針數組
2.8.5指針與函數
2.8.6數組指針作為函數參數
2.8.7指向函數的指針
2.8.8返回指針的函數
2.8.9main函數中的參數
2.9結構體、共用體和枚舉數據類型
2.9.1結構體類型概述
2.9.2結構體類型變量的定義和引用
2.9.3結構體數組
2.9.4結構體型函數參數以及返回結構體類型值的函數
2.9.5結構體變量和指針
2.9.6枚舉類型數據
2.9.7用typedef定義類型
綜合實例
本章小結
習題
第3章C++在非面向對象方面的常用新特性
3.1C++的輸入與輸出簡介
3.1.1用cout輸出數據流
3.1.2用cin輸入數據流
3.2用const定義常量
3.3函數的重載
3.4有默認參數的函數
3.5引用
3.5.1引用的概念
3.5.2將引用作為函數的參數
3.5.3引用和指針的區別
3.5.4常指針與常引用
3.5.5引用小結
3.6動態分配內存
3.6.1new關鍵字
3.6.2delete運算符
3.7布爾類型
3.8函數原型
3.9作用域運算符
3.10內置函數
3.11C++的注釋
綜合實例
本章小結
習題
第4章類和對象
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.2類
4.2.1類和對象的關系
4.2.2類的定義
4.2.3類和結構體的區別
4.3對象的創建
4.4類的成員函數
4.4.1成員函數的特性
4.4.2內部函數
4.4.3在類外定義成員函數
4.4.4成員函數的存儲方式
4.5對象成員的引用
4.5.1通過對象名和成員運算訪問對象中的成員
4.5.2通過對象的引用變量訪問對象中的成員
4.6構造函數
4.6.1對象的初始化
4.6.2構造函數的作用
4.6.3構造函數的種類
4.6.4用參數初始化表對數據成員初始化
4.6.5構造函數的重載
4.6.6使用默認參數的構造函數
4.7析構函數
4.8對象數組
4.8.1對象數組的定義
4.8.2對象數組的初始化
4.9對象指針
4.9.1指向對象的指針
4.9.2指向對象成員的指針
4.9.3this指針
4.10對象成員
4.11對象創建時內存的動態分配
綜合實例
本章小結
習題
第5章關于類和對象的進一步討論
5.1類的封裝性
5.1.1公用接口與私有實現的分離
5.1.2類聲明和成員函數定義的分離
5.2作用域和可見性
5.2.1標識符的作用域
5.2.2可見性
5.2.3程序實體的生存期
5.2.4C++的存儲屬性
5.3類的靜態成員
5.3.1類靜態成員
5.3.2類靜態成員函數
5.4友元
5.4.1友元函數
5.4.2友元類
5.5類模板的基本概念
5.6結構體和類
5.7聯合體和類
5.8共享數據的保護
5.8.1常對象
5.8.2用const修飾的類成員
5.8.3常引用
5.8.4指向對象的常指針
5.8.5指向常對象的指針變量
5.9類模板的進一步討論
綜合實例
本章小結
習題
第6章運算符的重載
6.1運算符重載的一般概念
6.2重載運算符的實現
6.2.1重載為類的成員函數
6.2.2重載為類的友元函數
6.3單目運算符重載
6.4雙目運算符重載
6.5特殊運算符重載
6.5.1賦值運算符重載
6.5.2下標運算符重載
6.5.3比較運算符重載
6.5.4new和delete運算符重載
6.5.5逗號運算符重載
6.5.6類型轉換運算符重載
6.5.7 運算符重載
6.5.8函數調用運算符重載
6.5.9I/O運算符重載
綜合實例
本章小結
習題
第7章類的繼承與派生
7.1繼承與派生的概念
7.2單繼承
7.2.1單繼承和派生
7.2.2重名成員
7.3繼承中的構造函數與析構函數
7.3.1繼承中的構造函數
7.3.2析構函數
7.4多繼承與虛基類
7.4.1多繼承
7.4.2多繼承中的二義性和支配原則
7.4.3虛基類
綜合實例
本章小結
習題
第8章多態性和虛函數
8.1C++多態的概念
8.1.1多態概念的引入
8.1.2構成多態的條件
8.2虛函數
8.3虛析構函數
8.4純虛函數和抽象類
綜合實例
本章小結
習題
第9章模板、字符串和異常
9.1C++函數模板
9.2模板類
9.2.1模板類的定義
9.2.2模板類的實例化
9.3C++模板中的函數式參數
9.4C++中的string類和字符串
9.4.1string類的定義
9.4.2轉換為char數組字符串
9.4.3string字符串的輸入與輸出
9.5C++中string字符串的訪問和拼接
9.5.1訪問字符串中的字符
9.5.2字符串的拼接
9.6C++中string字符串的增、刪、改、查
9.6.1插入字符串
9.6.2刪除字符串
9.6.3提取子字符串
9.6.4字符串的查找
9.7C++異常處理
9.7.1C++的異常引入
9.7.2捕獲異常
9.7.3異常的類型
9.8用throw拋出異常
9.8.1throw關鍵字
9.8.2不被建議的用法
9.9C++中的exception類
綜合實例
本章小結
習題
第10章C++的輸入與輸出
10.1C++輸入與輸出的概念
10.1.1輸入與輸出
10.1.2C++的I/O相對于C的發展
10.2與C++輸入和輸出有關的類和對象
10.2.1輸入輸出流類的概念
10.2.2與iostream類庫有關的頭文件
10.2.3在iostream頭文件中定義的流對象
10.2.4在iostream頭文件中重載運算符
10.3C++標準輸出流詳解
10.3.1cout流對象
10.3.2cerr流對象
10.3.3clog流對象
10.4C++格式化輸出
10.4.1用控制符控制輸出格式
10.4.2用流對象的成員函數控制輸出格式
10.5用C++流成員函數put輸出單個字符
10.6cin輸入流詳解
10.7用get()函數讀入一個字符
10.7.1不帶參數的get函數
10.7.2有一個參數的get函數
10.7.3有三個參數的get函數
10.8用getline()函數讀入一行字符
10.9一些與輸入有關的istream類成員函數
10.9.1eof函數
10.9.2peek函數
10.9.3putback函數
10.9.4ignore函數
10.10C++中文件的概念
10.11C++中的文件流類與文件流對象
10.12文件的打開與關閉
10.12.1打開文件
10.12.2關閉磁盤文件
10.13對ASCII文件的讀寫操作
10.14對二進制文件的讀寫操作
10.14.1用成員函數read和write讀寫二進制文件
10.14.2與文件指針有關的流成員函數
10.14.3隨機訪問二進制數據文件
10.15對字符串流的讀寫操作
10.15.1建立輸出字符串流對象
10.15.2建立輸入字符串流對象
10.15.3建立輸入輸出字符串流對象
綜合實例
本章小結
習題
第5章關于類和對象的進一步討論
本章學習目標:
掌握類的封裝性概念;
掌握作用域與可見性;
理解并會用友元;
理解模板的概念。
5.1類的封裝性
5.1.1公用接口與私有實現的分離
C++的封裝性是把數據和有關這些數據的操作封裝在一個類中,或者說類的作用是把數據和算法封裝在用戶聲明的抽象數據類型中。
實際上,用戶往往并不關心類的內部是如何實現的,而只需知道調用哪個函數會得到什么結果,或者能實現什么功能。類似于電視機類,用戶只需知道如何用,而不用去關心它內部的電路板是如何工作的。所以在聲明了一個類以后,用戶主要通過調用公有的成員函數來實現類提供的功能(例如對數據成員設置值、顯示數據成員的值、對數據進行加工等)。因此,公有成員函數是用戶使用類的公有接口(public interface),或者說是類的對外接口。
當然并不是必須要把所有成員函數都指定為public(公有)的,如果指定為private,這時這些成員函數就不是公有接口了。
在類中被操作的數據是私有的,實現的細節對用戶來說是隱蔽的,這種實現稱為私有實現(private implementation)。這種“類的公有接口與私有實現的分離”形成了信息隱蔽。在類外雖然不能直接訪問私有數據成員,但可以通過調用公有成員函數來引用甚至修改私有數據成員。
軟件工程的一個最基本的原則就是將接口與實現分離,信息隱蔽是軟件工程中的一個非常重要的概念。它的好處如下:
(1) 如果想修改或擴充類的功能,只需修改本類中有關的數據成員和與它有關的成員函數,程序中類外的部分不必修改。
(2) 如果在編譯時發現類中的數據讀寫有錯,不必檢查整個程序,只需檢查本類中訪問這些數據的少數成員函數。
5.1.2類聲明和成員函數定義的分離
1. 類聲明和成員函數分離的一般做法
在面向對象的程序開發中,一般做法是將類的聲明(其中包含成員函數的聲明)放在指定的頭文件中,如果用戶想用該類,只要把有關的頭文件包含進來即可。
由于在頭文件中包含了類的聲明,因此在程序中就可以用該類來定義對象。由于在類體中包含了對成員函數的聲明,在程序中就可以調用這些對象的公有成員函數。
為了實現信息隱蔽,對類成員函數的定義一般不放在頭文件中,而放在另一個文件中。
【例5.1】類聲明和成員函數定義分離的例子。
可以分別寫兩個文件student.h和student.cpp,為了組成一個完整的源程序,還應當包括主函數的源文件main.h。其編譯環境的解決方案資源管理器如圖5.1所示。
……