C++ & MFC

  C++是一種靜態數據類型檢查的、支持多重編程範式程序設計語言,支持過程化程序設計數據抽象面向對象程序設計、製做圖標等泛型程序設計的多種程序設計風格ios

  MFC(Microsoft Foundation Classes),是一個微軟公司提供的類庫,以C++類的形式封裝了Windows的API,而且包含一個應用程序框架,以減小應用程序開發人員的工做量,同VCL相似,是一種應用程序框架。其中包含的類包含大量Windows句柄封裝類和不少Windows的內建控件和組件的封裝類。此外MFC的部分類爲MFC/ATL 通用,能夠在Win32 應用程序中單獨包含並使用這些類。git

  因爲它的易用性,初學者常誤認爲VC++開發必須使用MFC,這種想法是錯誤的。做爲Application Framework,MFC的使用只能提升某些狀況下的開發效率,只起到輔助做用,而不能替代整個Win32 程序設計。程序員

從C到C++算法

  計算機誕生初期,人們要使用計算機必須用機器語言或彙編語言編寫程序。數據庫

  世界上第一種計算機高級語言誕生於1954年,它是FORTRAN語言。編程

  BASIC語言是1964年在FORTRAN語言的基礎上簡化而成的。vim

  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++已經成爲當今主流程序設計語言中最複雜的一員。

編程技巧

使用newdelete進行動態內存分配和釋放

使用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++由如下四個「子語言」組成:

一、C子語言。C++支持C語言的幾乎所有功能,主要是c89的部分,在語法上與C語言僅有極微妙的差異(如括號表達式的左右值性,具體請參考C++標準文獻)。

二、面向對象的C++語言。C++語言本來不具有面向對象的設計功能,然而隨着面向對象編程的概念的提出以及如Java等語言的發展成熟,C++語言也開發出了支持面向對象功能的版本。

三、泛型編程語言。C++強大(但容易失控的)模板功能使它能在編譯期完成許多工做,從而大大提升運行期效率。

四、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++編程開發

開發方式

  1. 編譯器:gcc,clang等
  2. 編輯器:通常是vim/emacs
  3. make:gnu make 或者bsd 的pmake等,功能與用法基本同樣
  4. 版本管理:cvs,svn,git等
  5. 代碼閱讀:cscope,ctags,lxr等

集成開發環境(IDE)

  1. Visual Studio(Visual C++)
  2. Borland C++ Builder
  3. Eclipse(Myln + CDT + MinGW32 + GCC)
  4. Dev-C++(MinGW32 + GCC)
  5. Code::Blocks(可配合多款編譯內核使用)
  6. CodeLite
  7. C-Free
  8. 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。

相關文章
相關標籤/搜索