- C++從入門到精通(第4版)
- 明日科技
- 5872字
- 2020-03-06 11:54:02
第1章
緒論
(
視頻講解:1小時18分鐘)
C++是當今流行的編程語言,它是在C語言基礎上發(fā)展起來的,隨著面向對象編程思想的發(fā)展,C++也融入了新的編程理念,這些理念有利于程序的開發(fā)。C++從語言角度來說也是一個規(guī)范,隨著規(guī)范的發(fā)布,許多C++編譯器不斷涌現(xiàn),不同的C++編譯器也帶來不同的語言特性,這給程序員帶來了廣闊的選擇空間。
通過閱讀本章,您可以:
了解C++的發(fā)展歷程
了解為C++發(fā)展做出杰出貢獻的人物
掌握主要的C++編譯器及開發(fā)環(huán)境
掌握C++項目文件及編譯工程
1.1 C++歷史背景
要學一門語言,首先要對這門語言有一定的了解,要知道這門語言能做什么,要怎樣才能學好。本節(jié)將對C++語言的歷史背景進行簡單的介紹,使讀者對C++語言有一個簡單而直接的印象。
1.1.1 20世紀最偉大的發(fā)明
計算機的出現(xiàn)給我們的生活帶來了巨大的變化,它是如何發(fā)展起來的呢?開始時人們致力研究的能夠進行四則運算的機器,是通過機械齒輪運作的加法器,而后是精度只有12位的乘法計算器,直到1847年Charles Babbages開發(fā)出能計算31位精度的機械式差分機,這臺差分機被普遍認為是世界上第一臺機械式計算機。隨著電子物理的發(fā)展,真空二極管、真空三極管問世,到1939年第一部用真空管計算的機器被研制出來,該機器是能進行16位加法運算的機器;隨后,用氖氣燈(霓虹燈)的存儲器、復雜數(shù)字計算機(斷電器計數(shù)機)、可編寫程序的計數(shù)機,被一一研制出來。1946年,第一臺電子管計算機ENIAC在美國被研制出來,這臺計算機占地170平方米,重30噸,有1.8萬個電子管,用十進制計算,每秒運算5000次。計算機從此進入了電子計算機時代,經(jīng)歷了真空管計算機、晶體管計算機、集成電路計算機、大規(guī)模集成電路計算機4個階段,每一個階段都是隨著電子物理的發(fā)展而發(fā)展的,晶體管的出現(xiàn)取代了電子管,將電子元件結合到一片小小的硅片上,形成集成電路(IC),在一塊芯片上容納幾百個或是幾千個電子元件形成了大規(guī)模集成電路(LSI),直到現(xiàn)在已經(jīng)出現(xiàn)了很薄的電子芯片,可謂是發(fā)展迅速。
現(xiàn)在計算機已經(jīng)應用到各個領域,科學計算、信號檢測、數(shù)據(jù)管理、輔助設計都在使用計算機,人們的生活已經(jīng)漸漸離不開它,所以說計算機是20世紀最偉大的發(fā)明。
1.1.2 C++發(fā)展歷程
早期的計算機程序語言就是計算機控制指令,每條指令就是一組二進制數(shù),不同的計算機都有不同的計算機指令集。使用二進制指令集開發(fā)程序是一件很頭痛的事,需要記住大量的二進制數(shù),為了便于記憶,人們將二進制數(shù)用字母組合代替,以字符串關鍵字代替二進制機器碼的編程語言稱為匯編語言,匯編語言被稱為是低級語言,雖然匯編語言比機器碼容易記憶,但仍然具有可讀性差的缺點,大量的跳轉指令和地址值很難讓程序員在很短的時間理解程序的意思,于是編程語言進入了高級語言時代。
第一種高級語言是美國尤尼法克公司在1952年研制成功的Short Code,但被廣泛使用的高級語言是FORTRAN,它是由美國科學家John Backus設計并在IBM公司的計算機上實現(xiàn)的,但FORTRAN語言和ALGOL60主要應用于科學和工程計算,隨后出現(xiàn)了Pascal和C語言。C語言是在其他語言基礎上發(fā)展起來的。首先是Richard Martin開發(fā)一種高級語言BCPL,隨后Ken Thompson使用BCPL語言對其進行了簡化,形成一門新的語言—B語言,但B語言沒有類型的概念,Dennis Ritchie對B語言進行研究和改進,在B語言基礎上添加了結構和類型,并將這個改進后的語言命名為C語言,寓意很簡單,因為字母C是字母B的下一個字母,預示著語言的發(fā)展。
本書所講述的C++語言就是從C語言發(fā)展過來的。Stroustrup經(jīng)過鉆研在C語言中加入了類的概念,C++最初的名字是C with Class,到1983年12月由Rick Mascitti建議改名為C Plus Plus,即C++。最開始提出類概念的語言是Simula,它具有很高的靈活性,但無法勝任比較大型的程序。此后在Simula語言基礎上發(fā)展的語言Smalltalk才是真正的面向對象語言,但Smalltalk-80不支持多繼承。
C++從Simula繼承了類的概念,從Algol68繼承了運算符重載、引用以及在任何地方聲明變量的能力,從BCPL獲得了//注釋,從Ada得到了模板、名字空間,從Ada、Clu和ML取來了異常。
1.1.3 C++中的杰出人物

Dennis M. Ritchie
Dennis M. Ritchie被稱為C語言之父,UNIX之父,生于1941年9月9日,哈佛大學數(shù)學博士,曾任朗訊科技公司貝爾實驗室(原AT&T實驗室)下屬的計算機科學研究中心系統(tǒng)軟件研究部的主任一職。他開發(fā)了C語言,并著有《C程序設計語言》(The C Programming Language)一書,還和Ken Thompson一起開發(fā)了UNIX操作系統(tǒng)。他因杰出的工作得到了眾多計算機組織的公認和表彰,1983年,獲得美國計算機協(xié)會頒發(fā)的圖靈獎(又稱計算機界的諾貝爾獎),還獲得過C&C基金獎、電氣與電子工程師學會優(yōu)秀獎章、美國國家技術獎章等多項大獎。

Bjarne Stroustrup
Bjarne Stroustrup 1950年出生于丹麥,先后畢業(yè)于丹麥阿魯斯大學和英國劍橋大學,AT&T大規(guī)模程序設計研究部門負責人,AT&T貝爾實驗室和ACM成員。1979年,Stroustrup開始開發(fā)一種語言,當時稱為C with Class,后來演化為C++。1998年,ANSI/ISO C++標準建立,同年,Stroustrup推出其經(jīng)典著作The C++ Programming Language的第3版。

Scott Meyers
Scott Meyers是世界頂級的C++軟件開發(fā)技術權威之一,他擁有Brown University的計算機科學博士學位,其著作Effective C++和More Effective C++很受編程人員的喜愛。Scott Meyers曾經(jīng)是C++ Report的專欄作家,為C/C++Users Journal和Dr. Dobb’s Journal撰過稿,為全球范圍內的客戶提供咨詢活動。他還是Advisory Boards for NumeriX LLC和InfoCruiser公司的成員。

Andrei Alexandrescu
Andrei Alexandrescu被認為是新一代C++天才的代表人物,2001年撰寫了經(jīng)典名著Modern C++ Design,其中對Template技術進行了精湛運用,第一次將模板作為參數(shù)在模板編程中使用,該書震撼了整個C++社群,開辟了C++編程領域的Modern C++新時代。此外,他還與Herb Sutter合著了C++ Coding Standards。他在對象拷貝(object copying)、對齊約束(alignment constraint)、多線程編程、異常安全和搜索等領域做出了巨大貢獻。

Herb Sutter
Herb Sutter是C++ Standard Committee的主席,作為ISO/ANSI C++標準委員會的委員,Herb Sutter是C++程序設計領域屈指可數(shù)的大師之一。他的Exceptional系列3本書(Exceptional C++、More Exceptional C++和Exceptional C++ Style)成為C++程序員必讀書。他是深受程序員喜愛的技術講師和作家,是C/C++ Users Journal的撰稿編輯和專欄作者,曾發(fā)表了上百篇軟件開發(fā)方面的技術文章和論文。他還擔任Microsoft Visual C++架構師,和Stan Lippman一道在微軟公司主持VC 2005(即C++/CLI)的設計。

Andrew Koenig
Andrew Koenig是AT&T公司Shannon實驗室大規(guī)模編程研究部門中的成員,同時也是C++標準委員會的項目編輯,是一位真正的C++內部權威。Andrew Koenig的編程經(jīng)驗超過30年,其中有15年在使用C++,已經(jīng)出版了超過150篇和C++有關的論文,并且在世界范圍內就這個主題進行過多次演講,對C++的最大貢獻是帶領Alexander Stepanov將STL引入C++標準。
1.2 常用開發(fā)環(huán)境
在使用C++語言時,需要選擇一款開發(fā)環(huán)境,那么有哪些環(huán)境可供用戶選擇呢?下面就對一些常用的C++語言開發(fā)環(huán)境進行簡單的介紹。
1.2.1 Visual C++ 6.0
Visual C++ 6.0是由微軟公司開發(fā)的C++開發(fā)環(huán)境,它是Visual Studio集成開發(fā)環(huán)境中的一員。Visual C++ 6.0可以創(chuàng)建Windows應用程序、DLL動態(tài)鏈接庫、COM組件以及ActiveX控件等。Visual C++ 6.0開發(fā)環(huán)境如圖1.1所示。

圖1.1 Visual C++ 6.0開發(fā)環(huán)境
1.2.2 Visual Studio 2017
Visual Studio 2017是目前比較流行的開發(fā)環(huán)境,它更加支持C++標準規(guī)范,而且還支持托管程序的編譯和WebService。應該說Visual Studio 2017更加強大,無論是功能上還是編譯速率上都有很大提高。Visual Studio 2017開發(fā)環(huán)境如圖1.2所示。

圖1.2 Visual Studio 2017開發(fā)環(huán)境
1.2.3 GCC/G++
Linux系統(tǒng)中一般都會帶有C/C++的編譯器,能夠編譯C代碼的是GCC,能夠編譯C++代碼的是G++,如果是在沒有GDK或GDE等界面系統(tǒng)的Linux系統(tǒng)下,編寫代碼需要使用VI文本命令,它和DOS下的TYPE命令很像,由于沒有鼠標,只能順序地編寫代碼,使用它編寫代碼對于程序員來說相當?shù)夭环奖恪5谟薪缑娴腖inux系統(tǒng)下,系統(tǒng)都會提供可視化的文本編輯器,其中比較有名的就是emacs,因為emacs集成了編譯代碼的菜單,通過emacs可以直接編寫代碼并編輯,并且可以直接執(zhí)行編譯后的程序。emacs開發(fā)環(huán)境如圖1.3所示。

圖1.3 emacs開發(fā)環(huán)境
1.2.4 Dev-C
Dev-C是將Linux系統(tǒng)的GCC/G++移到Windows系統(tǒng)后的產(chǎn)物,具體來講,編譯代碼的程序是GCC.exe和G++.exe,這兩個程序屬于開源項目mingw, Dev-C只是能夠調用GCC.exe和G++.exe來編譯程序的代碼編輯器。Dev-C開發(fā)環(huán)境如圖1.4所示。

圖1.4 Dev-C開發(fā)環(huán)境
1.2.5 Eclipse
Eclipse是IBM開發(fā)的、早期用來編寫Java代碼的編輯器,但由于CDT插件的出現(xiàn),使Eclipse也可以用來編寫C/C++代碼,同Dev-C一樣,Eclipse也使用開源項目下的GCC.exe和G++.exe來編譯代碼,所以在使用Eclipse前一定要注意設置好相關路徑。Eclipse開發(fā)環(huán)境如圖1.5所示。

圖1.5 Eclipse開發(fā)環(huán)境
1.3 認知C++程序代碼
C++程序代碼是由預編譯指令、宏定義指令、注釋、主函數(shù)、自定義函數(shù)等很多部分組成的,這些部分都是后文講述的主要內容。下面是一段很短但涉及C++語言概念比較多的代碼,如圖1.6所示。
如圖1.6所示的代碼中還有頭文件引用、函數(shù)作用空間、庫函數(shù)調用、賦值運算、關系判斷、流輸出等很多C++語言方面的概念,各概念之間通過一定規(guī)則羅列在一起,編譯器會根據(jù)這些規(guī)則將代碼編譯成能夠在機器上執(zhí)行的應用程序。

圖1.6 代碼介紹
1.4 C++工程項目文件
Windows操作系統(tǒng)主要是用來管理數(shù)據(jù)的,而數(shù)據(jù)是以文件的形式存儲在磁盤上的。文件可以通過擴展名來區(qū)分不同的類型,C++的代碼文件就有兩種類型,一種是源文件,一種是頭文件。頭文件中添加的是定義和聲明函數(shù)部分,源文件中則是在頭文件中定義函數(shù)的實現(xiàn)部分;源文件主要以cpp為擴展名,而頭文件主要以h為擴展名。有的開發(fā)環(huán)境可能使用cxx、cHH來作為源文件的擴展名。
對一個比較大的工程而言,它的源文件和頭文件可能會比較多,為了管理這些源文件,不同的編譯器還提供了管理代碼的工程項目文件,不同開發(fā)環(huán)境的工程項目文件也會不同。
(1)Dev-C的工程項目文件如圖1.7所示。

main.cpp:源文件。
Sample.dev:工程文件。
Makefile.win:make程序執(zhí)行時使用的文件,用于自動編譯源代碼文件。
main.o:編譯后的目標文件。
Sample.exe:連接后生成的程序。
(2)Visual C++ 6.0的工程項目文件如圖1.8所示。

圖1.8 Visual C++ 6.0的工程項目文件
Debug:存儲編譯后程序文件夾,帶有調試信息的程序。
Release:存儲編譯后程序文件夾,最終程序。
Sample.cpp:源文件。
Sample.dsp: Visual C++ 6.0的工程文件。
Sample.dsw: Visual C++ 6.0的工作空間文件。
Sample.ncb: Visual C++ 6.0的用于聲明的數(shù)據(jù)庫文件。
Sample.opt: Visual C++ 6.0存儲用戶選項的文件。
StdAfx.cpp:向導生成的標準源文件,代碼中涉及MFC類庫內容時使用該文件。
StdAfx.h:向導生成的標準頭文件。
注意
Debug與Release的區(qū)別在于,Debug是含有調試信息的應用程序,Debug文件夾下的程序可以設置斷點調試,而且Debug文件夾下的程序要比Release文件夾下的程序大。
(3)Eclipse的工程項目文件如圖1.9所示。

圖1.9 Eclipse的工程項目文件
.cproject: Eclipse工程相關信息文件。
.project: Eclipse工程文件。
Makefile:make程序執(zhí)行時使用的文件,用于自動編譯源代碼文件。
Sample.cpp:源文件。
Sample.exe:連接后生成的程序。
Sample.o:編譯后的目標文件。
通過工程項目文件的擴展名,就可以知道代碼文件使用哪種開發(fā)環(huán)境管理。
1.5 使用Visual C++ 6.0創(chuàng)建程序
Visual C++ 6.0可以通過兩種方式創(chuàng)建輸出Hello World!程序,一種是使用向導直接創(chuàng)建,一種是創(chuàng)建空工程后,手動向工程中添加源文件并寫入代碼。
1.使用Visual C++ 6.0創(chuàng)建輸出Hello World!程序
具體創(chuàng)建步驟如下:
(1)啟動Visual C++ 6.0,選擇File→New命令,彈出創(chuàng)建工程向導,如圖1.10所示。

圖1.10 Visual C++ 6.0創(chuàng)建工程向導
(2)在左側的工程列表中選擇Win32 Console Application工程類型,在Project name中輸入工程名Sample,在Location中設置工程的保存路徑D:\桌面\LIZI\Sample。然后單擊OK按鈕,彈出Win32 Console Application-Step 1of 1對話框,如圖1.11所示。

圖1.11 Visual C++ 6.0工程向導對話框
(3)向導可以創(chuàng)建4種類型的工程。
An empty project:創(chuàng)建一個空的工程,工程中沒有任何源文件和頭文件。
A simple application:創(chuàng)建的工程中含有兩個源文件(Sample.cpp和StdAfx.cpp)和一個頭文件(StdAfx.h),并且Sample.cpp源文件中有一個不做任何操作的main函數(shù)。
A "Hello,World!" application:創(chuàng)建的工程中也含有兩個源文件(Sample.cpp和StdAfx.cpp)和一個頭文件(StdAfx.h),但Sample.cpp源文件中的main函數(shù)有一條輸出Hello,World!字符的printf語句。
An application that supports MFC:創(chuàng)建了支持MFC類庫的工程。MFC類庫由微軟公司開發(fā),使用MFC類庫可以加快程序開發(fā)的速度。
(4)選擇A "Hello,World!" application工程類型,單擊Finish按鈕,向導會創(chuàng)建能夠在控制臺輸出Hello World!字符串的應用程序。創(chuàng)建完的工程如圖1.12所示。

圖1.12 創(chuàng)建完的工程
(5)此時通過選擇Build→Execute命令執(zhí)行應用程序就可以看到程序運行結果,如圖1.13所示。

圖1.13 程序運行結果
2.創(chuàng)建空工程,手動添加代碼文件實現(xiàn)在控制臺輸出字符串Hello World!
創(chuàng)建步驟如下:
(1)啟動Visual C++ 6.0,選擇File→New命令,彈出創(chuàng)建工程向導。
(2)在列表中選擇Win32 Console Application工程類型,在Project name中輸入工程名Sample,在Location中設置工程的保存路徑D:\桌面\LIZI\SAMPLE\Sample。然后單擊OK按鈕,彈出Win32 Console Application-Step 1of 1對話框。
(3)在彈出的對話框中選擇An empty project工程類型,單擊Finish按鈕,向導會創(chuàng)建一個空的工程。
(4)通過向導向工程中添加源文件。選擇File→New命令,彈出創(chuàng)建工程向導,選擇Files選項卡,在列表中選擇C++ Source File,在File中輸入文件名Sample,如圖1.14所示。

圖1.14 添加文件對話框
(5)單擊OK按鈕后,向導會向工程中添加Sample.cpp文件。
(6)在Sample文件中輸入如下代碼:

(7)選擇Build→Execute命令執(zhí)行應用程序就可以看到程序運行結果。
1.6 編譯與連接過程
開發(fā)應用程序可以分為編輯、編譯、連接、執(zhí)行4個步驟。
(1)編輯
編輯就是在文本編輯器中輸入代碼,并對代碼字符進行增、刪、改,然后將輸入的內容保存成文件。如圖1.15所示,輸入Hello World程序代碼,并將代碼保存成Sample.cpp文件。

圖1.15 編輯代碼
(2)編譯
編譯就是將代碼文件編譯成目標文件。如圖1.16所示,編譯過程就是將Sample.cpp編譯成Sample.obj。
在Visual C++ 6.0開發(fā)環(huán)境中,單擊編譯按鈕后Visual C++ 6.0開發(fā)環(huán)境對輸入的代碼進行編譯,如圖1.17所示。

圖1.16 編譯文件

圖1.17 執(zhí)行編譯命令
單擊編譯按鈕后Visual C++ 6.0開發(fā)環(huán)境自動對代碼進行編譯和連接,整個編譯過程如圖1.18所示。

圖1.18 編譯過程
(3)連接
連接就是將編譯后的目標文件連接成可執(zhí)行的應用程序。如將Sample.obj和lib庫文件連接成Sample.exe可執(zhí)行程序。lib庫是編譯好的提供給用戶使用的目標模塊,在有多個源文件的工程,例如Sample1.cpp、Sample2.cpp、Sample3.cpp,會編譯成多個目標模塊Sample1.obj、Sample2.obj、Sample3.obj,鏈接器會將程序所涉及的目標模塊連接成可執(zhí)行程序,如圖1.19所示。

圖1.19 連接過程
(4)執(zhí)行
執(zhí)行就是執(zhí)行生成的應用程序。Visual C++ 6.0開發(fā)環(huán)境下集成了運行按鈕,單擊運行按鈕后開發(fā)環(huán)境自動執(zhí)行生成的程序,運行按鈕如圖1.20所示。

圖1.20 運行按鈕
1.7 C++的特點
C++語言的運算符十分豐富,共有30多個,有算術、關系、邏輯、位、賦值、指針、條件、逗號、下標、類型轉換等多種類型。
C++語言的數(shù)據(jù)結構多樣,有整型、實型、字符型、枚舉類型等基本類型,有數(shù)組、結構體、共用體等構造類型以及指針類型,還為用戶提供了自定義數(shù)據(jù)類型,能夠實現(xiàn)復雜的數(shù)據(jù)結構,還可以定義類實現(xiàn)面向對象編程,類和指針結合可以實現(xiàn)高效的程序。
C++語言的控制語句形式多樣,使用方便。有兩路分支、多路分支和虛幻結構幾種控制語句,便于結構化模塊的實現(xiàn)和控制,結合面向對象編程便于程序的編制和維護。
C++語言是一種面向對象的程序設計語言,采用抽象和實際相結合,各對象間使用消息進行通信,對象通過繼承方法增加了代碼的復用。
C++語言繼承了C語言的特性,可以直接訪問地址,進行位運算,從而能對硬件進行操作。C++語句具有編寫簡單方便、便于理解的優(yōu)點,還具有低級語言的與硬件結合緊密的優(yōu)點。
C++語句具有很強的移植性,用C++編寫的程序基本不用太多修改就可以用于不同型號的計算機上,C++標準可在多種操作系統(tǒng)下使用。
1.8 小結
任何編程語言都有它的時代性,都是不斷發(fā)展的,C++現(xiàn)在是一個成熟的語言,首先要理解C++語言新的編程理念,然后選擇自己喜歡的開發(fā)環(huán)境,可以選擇微軟公司的Visual C++ 6.0,還可以選擇Dev-C或Eclipse。
- Computer Vision for the Web
- Pandas Cookbook
- C++面向對象程序設計(微課版)
- Apache Spark 2 for Beginners
- Implementing Cisco Networking Solutions
- Java程序設計與實踐教程(第2版)
- STM32F0實戰(zhàn):基于HAL庫開發(fā)
- Bootstrap 4:Responsive Web Design
- Creating Data Stories with Tableau Public
- Unity Character Animation with Mecanim
- 實戰(zhàn)Java高并發(fā)程序設計(第2版)
- Natural Language Processing with Python Quick Start Guide
- MyBatis 3源碼深度解析
- Learning C++ by Creating Games with UE4
- 基于MATLAB的控制系統(tǒng)仿真及應用