C++是一種靜態數據類型檢查的、支持多重編程范式的程序設計語言,支持過程化程序設計、數據抽象、面向對象程序設計、制作圖標等泛型程序設計的多種程序設計風格。
MFC(Microsoft Foundation Classes),是一個微軟公司提供的類庫,以C++類的形式封裝了Windows的API,並且包含一個應用程序框架,以減少應用程序開發人員的工作量,同VCL類似,是一種應用程序框架。其中包含的類包含大量Windows句柄封裝類和很多Windows的內建控件和組件的封裝類。此外MFC的部分類為MFC/ATL 通用,可以在Win32 應用程序中單獨包含並使用這些類。
由於它的易用性,初學者常誤認為VC++開發必須使用MFC,這種想法是錯誤的。作為Application Framework,MFC的使用只能提高某些情況下的開發效率,只起到輔助作用,而不能替代整個Win32 程序設計。
從C到C++
計算機誕生初期,人們要使用計算機必須用機器語言或匯編語言編寫程序。
世界上第一種計算機高級語言誕生於1954年,它是FORTRAN語言。
BASIC語言是1964年在FORTRAN語言的基礎上簡化而成的。
C語言是1972年由美國貝爾實驗室的D.M.Ritchie研制成功的。
C++是由AT&T Bell(貝爾)實驗室的Bjarne Stroustrup博士及其同事於20世紀80年代初在C語言的基礎上開發成功的,C++保留了C語言原有的所有優點,增加了面向對象的機制。
面向對象程序設計,是針對開發較大規模的程序而提出來的,目的是提高軟件開發的效率。不要把面向對象和面向過程對立起來,面向對象和面向過程不是矛盾的,而是各有用途、互為補充的。學習C++,既要會利用C++進行面向過程的結構化程序設計,也要會利用C++進行面向對象的程序設計。
如果要用C++創建窗口,我們需要使用到系統API或者使用封裝了這些API的一些庫,前者如Win32程序設計,后者如MFC、wxWidgets。
其實我認為學習C++的初期當然是熟悉C++的語法,中期是學習STL等庫、系統API以及熟悉C++的面向對象的思想和一般的設計方法;后期是伴隨着你C++生涯的一生的,因為它沒有終點的,這時候除了要繼續加深對C++的理解之外,還需要去學習各種各樣的基於C++的庫,因為你需要在這些庫的幫助下使用C++去實現更具體的東西,比如一些GUI庫如MFC、QT、wxWidgets,一些游戲引擎如Ogre、Unreal、Bigworld等,一些網絡庫如ASIO、RakNet、ACE等。這些庫大多有一個特點就是它們都是基於C++,封裝了底層的API使得我們可以不必每次都去使用繁雜的API來實現我們想要的功能。當然,你也可以用C++去封裝這些API,讓自己成為一個庫作者,方便他人。
C++發展歷史
C++語言發展大概可以分為三個階段:
第一階段
從80年代到1995年。這一階段C++語言基本上是傳統類型上的面向對象語言,並且憑借着接近C語言的效率,在工業界使用的開發語言中占據了相當大份額;
第二階段
從1995年到2000年,這一階段由於標准模板庫(STL)和后來的Boost等程序庫的出現,泛型程序設計在C++中占據了越來越多的比重性。當然,同時由於Java、C#等語言的出現和硬件價格的大規模下降,C++受到了一定的沖擊;
第三階段
從2000年至今,由於以Loki、MPL等程序庫為代表的產生式編程和模板元編程的出現,C++出現了發展歷史上又一個新的高峰,這些新技術的出現以及和原有技術的融合,使C++已經成為當今主流程序設計語言中最復雜的一員。
編程技巧
使用new和delete進行動態內存分配和釋放
使用inline內聯函數替代宏調用
對於頻繁使用的函數,C語言建議使用宏調用代替函數調用以加快代碼執行,減少調用開銷。但是宏調用有許多的弊端,可能引起不期望的副作用。例如宏:#define abs(a)(a)<0?(-a):(a)),當使用abs(i++)時,這個宏就會出錯。
所以在C++中應該使用inline內聯函數替代宏調用,這樣既可達到宏調用的目的,又避免了宏調用的弊端。
使用內聯函數只須把inline關鍵字放在函數返回類型的前面。
使用函數重載
用引用(reference)代替指針進行參數傳遞
使用缺省參數
所有的缺省參數必須出現在不缺省參數的右邊。
使用STL
STL(Standard Template Library,標准模板庫), STL的代碼從廣義上講分為三類:algorithm(算法)、container(容器)和iterator(迭代器),並包括一些工具類如auto_ptr。幾乎所有的代碼都采用了模板類和模板函數的方式,這相比於傳統的由函數和類組成的庫來說提供了更好的代碼重用機會。
作用符被重載,使得我們可以像訪問數組一樣訪問vector中的元素。[12]
使用模板
多泛型設計
根據Effective C++第三版第一條款的描述,現在C++由以下四個“子語言”組成:
1、C子語言。C++支持C語言的幾乎全部功能,主要是c89的部分,在語法上與C語言僅有極微妙的差別(如括號表達式的左右值性,具體請參考C++標准文獻)。
2、面向對象的C++語言。C++語言原本不具備面向對象的設計功能,然而隨着面向對象編程的概念的提出以及如Java等語言的發展成熟,C++語言也開發出了支持面向對象功能的版本。
3、泛型編程語言。C++強大(但容易失控的)模板功能使它能在編譯期完成許多工作,從而大大提高運行期效率。
4、STL(C++標准模板庫,Standard Template Library)。隨着STL的不斷發展,它已經逐漸成為C++程序設計中不可或缺的部分,其效率可能比一般的native代碼低些,但是其安全性與規范性使它大受歡迎。
此外,包含在TR1等中的C++0x將實現的新功能在開發和測試中。
MFC特點
編程語言函數本質上全部源於API,因此用它們開發出來的應用程序都能工作在Windows的消息機制和繪圖里,遵守Windows作為一個操作系統的內部實現。
最后要明白MFC不只是一個功能單純的界面開發系統,它提供的類絕大部分用來進行界面開發,關聯一個窗口的動作,但它提供的類中有好多類不與一個窗口關聯,即類的作用不是一個界面類,不實現對一個窗口對象的控制(如創建、銷毀),而是一些在Windows(用MFC編寫的程序絕大部分都在Windows中運行)中實現內部處理的類,如數據庫的管理類等。學習中最應花費時間的是消息和設備環境,對C++和MFC。
MFC編程優勢
C++語言應用極為廣泛。尤其在底層編程和系統級編程上更是C++的傳統優勢應用。在數據庫和多媒體方面,C++又以其卓越的穩定性而贏得了榮譽。
面對底層程序,它能很輕松的與Windows API或驅動程序結合,就是在自己的代碼中直接使用API函數,而API和驅動程序的資料都是以C語言為基礎的,這使得VC程序員能夠更輕松的使用Windows API。這樣造成了一個很有意思的現象,即入門時VC程序員要付出更多的努力來學習,但是一旦掌握后,開發其他領域的程序或使用第三方軟件時,如工業控制類的程序,由於底層的程序都是用C語言編寫,反倒是VC程序員能夠更快的掌握該領域的編程技術。而很多其他的編程語言甚至找不到相關的資料。這就說明VC(MFC)實際上是一種入門困難,但是擴展學習卻很輕松的語言框架。如果局限於某一領域的話VC毫無優勢可言,但是如果開發一個新的領域的應用程序或者該程序涉及多個應用領域的話,可減少重復學習的頻率和難度,VC(MFC)的優勢會立刻顯現出來。
MFC相關
MFC使用“Afx”作為所有的全局函數和全局變量的前綴。因為在MFC的早期開發階段它叫“Application Framework Extensions”縮寫為“AFX”。AFX提供了對Windows API的高度抽象,建立了全新的面向對象的AFX API,但它對於新手來說太復雜了,所以AFX小組不得不重新開始。后來他們創建了一組C++類,這就是MFC。MFC這個名字被采用得太晚了以至於沒來得及修改這些引用。
在免費的Express版本的Visual Studio 2005/2008中沒有包含MFC。
MFC作為一個強有力的競爭對手,為Borland的Turbo C++編譯器設計OWL(Object Windows Library)在同一時間也發布了。但最后,Borland停止了對OWL的繼續開發並且不久就從Microsoft那里購買了MFC頭文件,動態鏈接庫等的授權,微軟沒有提供完整的MFC的集成支持。之后Borland發布了VCL(Visual Component Library)來替換OWL框架。
MFC擴展DLL
每個DLL都有某種類型的接口:變量、指針、函數、客戶程序訪問的類。它們的作用是讓客戶程序使用DLL,MFC擴展DLL可以有C++的接口。導出的函數可以使用C++/MFC數據類型做參數或返回值,導出一個類時客戶端能創建類對象或者派生這個類。同時,在DLL中也可以使用DLL和MFC。
Visual C++使用的MFC類庫也是保存在一個DLL中,MFC擴展DLL動態連接到MFC代碼庫的DLL,客戶程序也必須要動態連接到MFC代碼庫的DLL。(這里談到的兩個DLL,一個是我們自己編寫的DLL,一個裝MFC類庫的DLL)現在MFC代碼庫的DLL也存在多個版本,客戶程序和擴展DLL都必須使用相同版本的MFC代碼DLL。所以為了讓MFC擴展DLL能很好的工作,擴展DLL和客戶程序都必須動態連接到MFC代碼庫DLL。而這個DLL必須在客戶程序運行的計算機上。
MFC版本更新
Visual C++ 6.0 MFC 6.0 (mfc42.dll)
Visual C++ 2010 MFC 10.0 (mfc100.dll)
C++編程開發
開發方式
- 編譯器:gcc,clang等
- 編輯器:一般是vim/emacs
- make:gnu make 或者bsd 的pmake等,功能與用法基本一樣
- 版本管理:cvs,svn,git等
- 代碼閱讀:cscope,ctags,lxr等
集成開發環境(IDE)
- Visual Studio(Visual C++)
- Borland C++ Builder
- Eclipse(Myln + CDT + MinGW32 + GCC)
- Dev-C++(MinGW32 + GCC)
- Code::Blocks(可配合多款編譯內核使用)
- CodeLite
- C-Free
- Qt Creator等基於Qt開發框架的IDE
常見的C++開發工具
1.Visual Studio
Visual Studio是微軟公司推出的開發環境,它是目前最流行的Windows平台應用程序開發環境。在Visual Studio中可以創建應用程序和網絡應用程序,以及智能設備應用程序和Office插件等。從7.0開始,Visual Studio加入了.Net技術,類似Java的JVM。如果不想使用.Net技術,6.0版本也是一個不錯的選擇。
說明:Visual Studio對標准C++做了擴展,習慣上將在Visual Studio中實現的C++稱為Visual C++,即VC。VC是目前使用最廣泛的C++開發語言,Visual Studio也是使用最廣泛的開發工具。
2.C++ Builder
Borland公司於1998年推出,也是Windows下的開發工具。C++ Builder具有高度安全性、高可靠性、快速性的編譯優化方法,所以編譯出的軟件執行速度很快。所有符合ANSI/ISO標准的原代碼都可以在C++ Builder中編譯,而且支持最新的ANSI C++/C語言特征。
3.Dev-C++
Dev-C++是Windows平台下的開源C++編程環境。它集成了GCC、MinGW32等眾多自由軟件,界面類似Visual Studio,但體積要小的多。它的缺點是難以勝任規模較大的軟件項目,但對於初學者是一個不錯的選擇。
4.Anjuta
Anjuta是一款GNOME桌面環境下的C/C++編程的集成環境,也是開源軟件。它不僅有項目管理、交互式調試以及強大的代碼編輯和語法增色的功能,還可以直接開發Glade圖形界面的程序。但是,它主要用在Linux、UNIX平台下,不支持Windows平台。目前,最新版本是2.4.x,可以從anjuta.sourceforge.net站點獲得。
5.Code::Blocks
Code::Blocks是一款全功能的、跨平台的C/C++集成開發環境,屬於開源軟件。它提供了眾多的工程模板,包括控制台應用、動態連接庫、OpenGL應用、QT應用、Win32 GUI應用等。Code::Blocks的另一引人之處在於它具有豐富的插件,包括代碼格式化、類向導、代碼補全、代碼統計、To-Do列表,以及WindowsXP外觀等各種各樣的插件。此外,它不僅支持GNU GCC編譯器,還支持MS Visual C++、Borland C++編譯器5.5,以及Digital Mars C等多種編譯器。
6.Eclipse
Eclipse是目前開源平台中最著名的集成開發環境。最初主要用來支持Java語言編程,目前通過插件CDT也可以用來開發C/C++程序。因為它本身只是一個框架,因此插件眾多是它的一大特點。這使得Eclipse擁有其他支持單一語言的IDE環境很難具有的靈活性。
此外,還有很多IDE也都支持C++開發,例如Visual Slick Edit、NetBeans、Understand C等,讀者可以根據自己的需要選擇適合自己的開發環境。
Visual C++ 6.0開發環境簡介
Visual C++ IDE一般由3部分組成:Developer Studio、MFC、Platform SDK。用Visual C++編寫代碼也並不意味着一定要用MFC,使用STL、ATL、編寫SDK程序一樣沒有限制。Platform SDK是以Microsoft C/C++編譯器為核心,配合MASM,輔以其他一些工具和文檔資料。
表1-1 文件類型
文 件 類 型 |
說 明 |
文 件 類 型 |
說 明 |
Active Server Page |
ASP文件 |
Binary File |
二進制文件 |
Bitmap File |
位圖文件 |
C++ Source File |
C++源程序文件 |
C/C++ Header File |
C/C++頭文件 |
Cursor File |
光標文件 |
HTML Page |
HTML文件 |
Icon File |
圖標文件 |
Macro File |
宏文件 |
Resource Script |
資源腳本文件 |
Resource Template |
資源模板 |
SQL Script File |
SQL語言腳本文件 |
Text File |
文本文件 |
|
|
由於功能強大,Visual C++ 6.0預定義的工程類型也非常多,如表1-2所示。
表1-2 工程類型
項 目 類 型 |
說 明 |
項 目 類 型 |
說 明 |
ATL COM AppWizard |
ATL程序 |
Database Project |
數據庫 |
Win32 Dynamic-Link Library |
Win32動態鏈接庫 |
DevStudio Add-in Wizard |
自動嵌入執行文件宏 |
Custom AppWizard |
自定義程序向導 |
ISAPI Extension Wizard |
Internet服務器或過濾器 |
Makefile |
Make文件 |
MFC ActiveX Control Wizard |
Active X控件 |
MFC AppWizard(dll) |
MFC動態鏈接庫 |
MFC AppWizard(exe) |
MFC可執行文件 |
Win32 Application |
Win32程序 |
Win32 Console Application |
Win32控制台程序 |
Win32 Static Library |
Win32靜態庫 |
Utility Project |
該工程作為其他子工程的容器,從而減少子工程的聯編時間 |
經典著作
《The C++ Standard Library: A Tutorial and Reference》(《C++標准程序庫:自修教程與參考手冊》)
《Standard C++ IOStreams and Locales: Advanced Programmer's Guide and Reference》(《標准C++輸入輸出流與本地化》)
《Effective STL》
《Generic Programming and the STL: Using and Extending the C++ Standard Template Library》(《泛型編程與STL》)
《C++ Network Programming》(《C++網絡編程》)
《Thinking in C++》(《C++編程思想》)
《Ruminations on C++: A Decade of Programming Insight and Experience》(《C++沉思錄》)
《Inside The C++ Object Model》(《深度探索C++對象模型》)
《Design Patterns:Elements of Reusable Object-Oriented software》(《設計模式:可復用面向對象軟件的基礎》)
《Large-Scale C++ Software Design》(《大規模C++程序設計》)
《STL 源碼剖析》
《The C++ Standard : Incorporating Technical Corrigendum No. 1》
《C++ Primer中文版(第4版)》
《C++ Primer plus(第五版) 》
附錄:
隨着C++98標准的確定,iostream.h已經被取消,至少在VC2010下面是這樣的,取而代之的是我們要用<iostream>頭文件來代替,iostream.h是屬於C++的頭文件,而非C的,因此標准訂立的時候被改成了<iostream>。而C的頭文件stdio.h等依然可以繼續使用,這是為了兼容C代碼。但是它們依然有對應的C++版本,如<cstdio> <cstdlib>等。記住,在VC2010上面采用C++風格的頭文件而不是C風格的頭文件,除非你是在用C。
VC從2005版本開始,微軟引入了一系列的安全加強的函數來增強CRT(C運行時),這里對應的是strcpy_s。_s意為safe的意思,同樣的道理,strcat也是同樣。因此要解決這個問題,我們可以用strcpy_s來替換strcpy,但是注意strcpy_s並非所有編譯器都提供,因此如果要跨編譯器,請采用錯誤信息中所提示的方式,定義_CRT_SECURE_NO_WARNINGS宏來掩耳盜鈴吧。另外注意並非所有的加強函數都是在屁股后面加_s,比如stricmp這個字符串比較函數的增強版名字是_stricmp。