C++
维基百科,自由的百科全书
C++是一種使用非常廣泛的计算机程序設計語言。C++是一種靜態数据类型檢查的,支持多範型的通用程序設計語言。它支持程序化程序設計、数据抽象化、对象導向程序設計、泛型程序設計等多種程序設計風格。
貝爾實驗室的比雅尼·斯特勞斯特魯普博士在20世紀80年代發明並實現了C++(最初這種語言被稱作「C with Classes」)。一開始C++是作為C語言的增強版出現的,從給C語言增加类開始,不斷的增加新特性。虚函数(virtual function)、运算符重载(operator overloading)、多重繼承(multiple inheritance)、模板(template)、異常(exception)、RTTI、命名空間(name space)逐漸納入標準。1998年國際標準組織(ISO)頒布了C++程序設計語言的國際標準ISO/IEC 14882-1998。遺憾的是,由於C++語言過於複雜,以及他經歷了長年的演變,直到現在(2004年)只有少數幾個編譯器完全符合這個標準。
另外,就目前學習C++而言,可以認為它是一門獨立的語言;它並不依賴C語言,我們可以完全不學C語言,而直接學習C++。根據《C++編程思想》(Thinking in C++)一書所評述的,C++與C的效率往往相差在正負5%之間。所以有人認為在大多數場合中,C++完全可以取代C語言。
C++語言發展大概可以分為三個階段:第一階段從80年代到1995年。這一階段C++語言基本上是傳統类型上的面向对象語言,並且憑借著接近C語言的效率,在工業界使用的開發語言中佔據了相當大份額;第二階段從1995年到2000年,這一階段由於標準模板庫(STL)和後來的Boost等程序庫的出現,泛型程序設計在C++中佔據了越來越多的比重性。當然,同時由於Java、C#等語言的出現和硬件價格的大規模下降,C++受到了一定的衝擊;第三階段從2000年至今,由於以Loki、MPL等程序庫為代表的產生式編程和模板元編程的出現,C++出現了發展歷史上又一個新的高峰,這些新技術的出現以及和原有技術的融合,使C++已經成為當今主流程序設計語言中最複雜的一員。
目录 |
[编辑] 發展歷史
Stroustrup工作起於1979年的C with Classes。這個構思起源於 Stroustrup 做博士論文時的一些程序撰寫經驗。他發現Simula具備很利於大型软件開發的特點,但Simula的執行速度太慢,無法對現實需求發揮功效;BCPL雖快得多,但它過於低階的特性,使其不適於大型软件的開發。當Stroustrup開始在貝爾實驗室工作時,他有分析UNIX内核關於分布式計算的問題。回想起他的博士論文經驗,Stroustrup開始為C語言增強一些类似Simula的特點。之所以選擇C,是因為它適於各種用途、快速和可移植性。除了C和Simula之外,同時也從其它語言中取得靈感,如ALGOL 68、Ada、CLU以及ML。剛開始時,类、派生类、儲存类型檢查、內聯和默认參數特性,都是通过Cfront引入C語言之中。1985年10月出現了第一個商業化發佈。
1983年,C with Classes改命名為C++。加入了新的特性,其中包括虛疑函数、函数名和操作符重載、參考、常量、使用者可控制的自由空間儲存區控制、改良的类型檢查,以及新的雙斜線(//)單行註解風格。1985年,發佈第一版《C++程序設計語言》,提供一個重點的語言參考,至此還不是官方標準。1989年,發佈了Release 2.0。引入了多重繼承、抽象类、靜態成員函数、常量成員函数,以及成員保護。1990年,出版了The Annotated C++ Reference Manual。這本書後來成為標準化的基礎。稍後還引入了模板、異常處理、命名空間、新的強制轉型,以及布尔类型。
隨著C++語言的演變,也逐漸演化出相應的標準程序庫。最先加進C++標準函数库的是流I/O程序庫,其用以取代傳統的C函数,如printf和scanf。隨後所引入的程序庫中最重要的便是標準模板庫,簡稱STL。
多年後,一個聯合的ANSI-ISO委員會於1998年對C++標準化(ISO/IEC 14882:1998)。在官方釋出1998標準的若干年後,委員會處理缺陷報告,並於2003年發佈一個C++標準的修正版本。2005年,一份名為Library Technical Report 1(簡稱TR1)的技術報告釋出。雖然還不是官方標準的一部分,不過它所提供的幾個擴展可望成為下一版C++標準的一部分。幾乎所有目前仍在維護的C++編譯器皆已支持TR1。
雖然C++免專利,但標準文件本身並不是免費的。
[编辑] C++名字的由來
C++這個名字是Rick Mascitti於1983年中所建議的,並於1983年12月首次使用。更早以前,尚在研究階段的發展中語言曾被稱為「new C」,之後是「C with Classes」。在计算机科學中,C++仍被稱為C語言的上層結構。它最後得名於C語言中的「++」操作符(其對变量的值進行遞增)。而且在共同的命名約定中,使用「+」以表示增強的程序。Stroustrup說:「這個名字象徵著源自於C語言變化的自然演進」。C+是一個和C/C++無關的早期编程语言。
Rick Mascitti在1992年被非正式地問起名字的由來,他表示這是在半開玩笑中說出的。他從沒想過C++會成為這門語言的正式名字。
有一個關於C++名字的笑話是,當你使用後綴++時,附加只發生在運算之後(因此,它應該是++C,而不是C++)。
[编辑] 未來發展
[编辑] 設計原則
在《C++語言的設計和演化》(1994)中,Bjarne Stroustrup描述了他在設計C++時,所使用的一些原則。知道這些原則有助於理解C++為何會是現在這個樣子。以下總結了一些原則,詳盡的內容可參閱《C++語言的設計和演化》:
- C++設計成靜態类型、和C同樣高效且可移植的多用途程序設計語言。
- C++設計成直接的和廣泛的支持多種程序設計風格(程序化程序設計、数据抽象化、对象導向程序設計、泛型程序設計)。
- C++設計成給程序設計者更多的選擇,即使可能導致程序設計者選擇錯誤。
- C++設計成盡可能與C兼容,藉此提供一個從C到C++的平滑過渡。
- C++避免平台限定或沒有普遍用途的特性。
- C++不使用會帶來額外開銷的特性。
- C++設計成無需複雜的程序設計環境。
[编辑] 標準程序庫
1998的C++標準分為兩個部分︰内核語言和C++標準程序庫;後者包含了大部分標準模板庫和C標準程序庫的稍加修改版本。存在許多不屬於標準部分的C++程序庫,且使用外部链接,程序庫甚至可以用C撰寫。
C++標準程序庫充分吸收了C標準程序庫,並佐以少許的修改,使其與C++良好的運作。另一個大型的程序庫部分,是以標準模板庫(STL)為基礎,STL於1994年2月正式成為ANSI/ISO C++。它提供了實用的工具,如容器(如︰向量和链表),迭代器(一般化指针)提供容器以类似数组的访問方式,以及算法進行查找和排序的運算。此外還提供了(multi)map(關聯数组)和(multi)set,它們都使用兼容的界面。因此,以下成為可能,使用模板撰寫泛型算法,它可以和任何容器或在任何以迭代器定義的序列上運作。如同C,使用#include指令包含標準表頭,即可访問程序庫裡的功能。C++提供69個標準表頭,其中19個不再贊成使用。
使用標準庫(例如︰使用std::vector或std::string來取代C風格的数组)有助於導向更安全和更靈活的软件。
STL在納入C++標準以前,是來自HP和後來的SGI的第三方程序庫,標準中並未稱之為「STL」,它只是標準庫中的一部分,但仍有許多人使用這個名稱,以別於其它的標準庫(輸入/輸出流、國際化、診斷、C程序庫子集,等等)。
[编辑] C++中的特色
和C語言相比,C++引入了更多的特性,包括︰陳述性声明,类似函数的強制轉型,new/delete操作符,布尔类型,參考类型,默认參數,函数重載,命名空間,类(包括所有和类相關的特性,如繼承、成員函数、虚函数、抽象类和建構子),操作符重載,模板,::操作符,異常處理和執行時期識別。
和普遍認為的相反,C++不是第一個引入const關鍵字的。Const是在正式引入C語言不久之後,才被C++採用。
C++在某些案例中(見下「與C不兼容之處」),進行比C還要多的类型檢查。
以「//」起始作為註解起源自C的前身BCPL,而後被重新引入到C++。
C++的一些特性,C不久之後也採用了,包括在for迴圈中声明,C++風格的註解(使用//符號,和inline,雖然C99定義的inline關鍵字與C++的定義不兼容。不過,C99也引入了不存在於C++的特性,如︰variadic macros,和以数组作為參數的較佳處理;某些C++編譯器可能實作若干特性,以作為擴展,但其餘部分並不符合現存的C++特性)
一個常見的混淆其實只是一個微妙的術語問題︰由於它的演化來自C,在C++中的術語对象和C語言一樣是意味著内存區域,而不是类实例,在其它絕大多數的对象導向語言也是如此。舉例來說,在C和C++中,語句int i;定義一個int类型的对象,這就是变量的值i將在賦值時,所存入的内存區域。
[编辑] 與C不兼容之處
C++一般被認為是C的超集合(superset),但這並不嚴謹。大部分的C代碼可以很輕易的在C++中正確編譯,但仍有少數差異,導致某些有效的C代碼在C++中失效,或者在C++中有不同的行為。
也許最常見的差異是,C允許從void*隱式轉換到其它的指针类型,但C++不允許。下列是有效的C代碼:
int *i = malloc(sizeof(int) * 5); /* 從 void* 隱式轉換為 int* */
但要使其在C和C++兩者皆能運作,就需要使用強制轉換︰
int *i = (int *) malloc(sizeof(int) * 5);
另一個常見的可移植問題是,C++定義了很多的新關鍵字,如new和class,它們在C程序中,是可以作為标识符(例︰变量名)的。
在最新的C標準(C99)中去除了一些不兼容之處,目前也支持了C++的特性,如//註解,以及在代碼中混合声明。不過C99也納入幾個和C++衝突的新特性(如︰可變長度数组、本地複數类型和複合逐字常量),所以語言的分岐可能還是大過合並。
若要混用C和C++的代碼,則所有在C++中调用的C代碼,必須放在extern "C" { /* C代碼 */ }之內。
[编辑] C++的Hello World程序
在使用兼容C89标准(也称为ANSI C)的编译器时,下面这个程序显示“Hello, world!”然后结束运行:
#include <iostream> int main() { std::cout << "Hello, world!\n"; }
在使用兼容C99标准(ISO/IEC 14882-1998)的编译器时,下面的程序也是可以的:
#include <iostream> using namespace std; int main() { cout << "Hello, world!" << endl; return 0; }
根据ISO C++的规定,main函数的形式只能是
int main() { ... }
以及
int main(int argc, char * argv[]) { ... }
尽管如此,但在大部份编译器上,
void main() { .... }
也被支持。
[编辑] 語言特性
[编辑] 操作符
[编辑] 預處理器
C++主要有三個編譯階段︰預處理、轉譯成对象碼和链接(最後的兩個階段一般才視為真正的「編譯」)。在第一階段,預處理,會將預處理器指令替換成源代码,然後送到下一個編譯階段。
[编辑] 預處理器指令和宏
預處理指令的運作方式是根據使用者定義的規則,簡單的把記號字符序列置換成其它的記號字符序列。它們進行宏置換、含入其它的文件(由底層至高階的特性,例如包含模块/包/單元/组件)、條件式編譯和條件式含入。例如:
#define PI 3.1415926535897932384626433832795028841971693993751
每次在源代码中出現的PI,將會替換為3.1415926535897932384626433832795028841971693993751。另一個普遍的例子是
#include <iostream>
它從標準庫表頭iostream含入(导入)所有的符號。除了以上提到的常用指令以外,還有幾個額外的預處理器指令,可以用來控制編譯流程、條件式含入或排除代碼區塊等等。
[编辑] 模板
[编辑] 对象
[编辑] 封裝
[编辑] 繼承
[编辑] 多態
[编辑] 分析和處理C++源代码
[编辑] 問題與爭論
[编辑] 中文術語問題
而作出「在這12年裡,C++使用者人數大約每七個月半增加一倍」的結論,並成為許多C++相關文件必引的一段話。然而,時至今日新語言層出不窮,使用者人數已不太可能以如此速度增長。
分析機構EvansData定期對開發人員展開調查,其調查結果與Stroustrup提出的C++正在擴張的說法相違背。EvansData的数据顯示,以C++為工具的開發人員在整個開發界所佔的比例由1998年春天的76%下降至2004年秋的46%。
Forrester最新的調查顯示,C++、微軟VisualBasic和Java是眾多公司產品體系的首選語言。對100家公司的調查顯示,C/C++、VisualBasic和Java在產品體系中的使用比例分別是59%、61%和66%。
[编辑] 參閱
[编辑] 外部链接
- Bjarne Stroustrup's homepage
- Thinking in C++ 2nd Edition by Bruce Eckel
- C++ 學習筆記
- (英文)Visual Studio Express 首頁
- (英文)Visual Studio Express 下載頁面
- (正体中文)Visual Studio Express 首頁
- (正体中文)Visual Studio Express Visual C++ 下載頁面
- (简体中文)Visual Studio Express 首頁
- (简体中文)Visual Studio Express Visual C++ 下載頁面
|
|
|
|---|---|
| 工业编程语言 | A+ - ActionScript - Ada - 汇编语言 - B - Brainfuck - COBOL - Curl - D - Eiffel - Erlang - FORTRAN - IronPython - Java - JavaScript - JScript - Jython - LISP - Lua - SCILAB - MATLAB - MATHEMATICA - Nuva - Oberon - OCaml - Perl - PHP - PostScript - Powerbuilder - Python - R - REXX - Ruby - Self - Smalltalk - Tcl/Tk - C# - F# - J# - Microsoft Visual C# |
| C/C++语言 | C - C++ - Turbo C++ - Borland C++ - C++ Builder- C++/CLI - Objective-C - Microsoft Visual C++ |
| BASIC语言 | BASIC - BASICA - GW-BASIC - QBASIC - QuickBASIC - True BASIC - Turbo BASIC - PowerBASIC - DarkBASIC -ETBASIC Visual Basic .NET - Visual Basic - VBScript - VBA |
| Pascal/Delphi语言 | Pascal語法:(Pascal - Turbo Pascal - Object Pascal - Free Pascal) Pascal+Delphi語法:(Delphi) |
| GPU用著色器語言 | Cg - GLSL - HLSL |
| 学术编程语言 | APL/J - Clean - Haskell - Logo - ML - Prolog - Scheme - SAC |
| 数据库相關编程语言 | Clipper - Visual FoxPro - SQL - SQL預存程序 |
| 其他编程语言 | ALGOL - Forth - Modula-2/Modula-3 - MUMPS - PL/I - Simula |

