c++解釋--百度百科

c++

C++是在 C語言的基礎上開發的一種面向對象編程語言,應用普遍;C++支持多種編程範式 -- 面向對象編程泛型編程和過程化編程。最新正式標準C++於2014年8月18日公佈。 [1]   其編程領域衆廣,經常使用於系統開發,引擎開發等應用領域,是至今爲止最受廣大程序員受用的最強大編程語言之一,支持類:類、封裝、重載等特性!
中文名
C++語言
外文名
The C++ Programming Language
類    別
計算機程序設計語言
創始人
Bjarne Stroustrup
創始公司
貝爾實驗室
基本內容
類、封裝、重載、繼承、模版

從C到C++

編輯
  c++代碼
計算機誕生初期,人們要使用計算機必須用 機器語言彙編語言編寫程序。世界上第一種計算機高級語言是誕生於1954年的 FORTRAN語言。以後出現了多種計算機 高級語言,其中使用最普遍、影響最大的當推 BASIC語言C語言BASIC語言是 1964年由 Dartmouth 學院 John G. Kemeny 與 Thomas E. Kurtz 兩位教授在FORTRAN語言的基礎上簡化而成的, 適用於初學者設計的小型高級語言;C語言是1972年由美國貝爾實驗室的D.M.Ritchie所開發,採用 結構化編程方法,聽從 自頂向下的原則。 [2]   在操做系統和系統使用程序以及須要對硬件進行操做的場合,用C語言明顯優於其它高級語言,但在編寫大型程序時,C語言仍面臨着挑戰。
1983年, 貝爾實驗室Bjarne Stroustrup在C語言基礎上推出了C++ [1]   。 C++進一步擴充和完善了C語言,是一種 面向對象的程序設計語言。

名稱由來

C++這個名字是Rick Mascitti於1983年中所建議的,並於1983年12月首次使用。更早之前,尚在研究階段的發展中語言曾被稱爲「new C」,以後是「C with Class」 [3]   。在計算機科學中,C++仍被稱爲C語言的上層結構。它最後得名於C語言中的「++」操做符(其對變量的值進行遞增)。並且在共同的命名約定中,使用「+」以表示加強的程序。Stroustrup說:「這個名字象徵着源自於C語言變化的天然演進」。
注:C+是一個和C/C++無關的早期編程語言。
Rick Mascitti在1992年被非正式地問起名字的由來,他表示這是在半開玩笑中說出的。他從沒想過C++會成爲這門語言的正式名字。有一個關於C++名 字的笑話,當你使用後綴++時,賦值發生在加運算以後(所以,它應該是++C,而不是C++,這個笑話是說時下某些程序員還在以使用C的方式使用C++, 這一般被一些權威著做認爲是不正確的)。

發展歷史

在「C with Class」階段,研製者在C語言的基礎上加進去的特徵主要有:類及派生類、共有和私有成員的區分、類的 構造函數析構函數友元內聯函數賦值運算符的重載等。
1985年公佈的C++語言1.0版的內容中又添加了一些重要特徵: 虛函數的概念、函數和運算符的 重載、引用、常量(constant)等。
1989年推出的2.0版造成了更加完善的支持面向對象程序設計的C++語言,新增長的內容包括:類的保護成員、 多重繼承、對象的初始化與賦值的 遞歸機制、 抽象類、靜態成員函數、const成員函數等。
1993年的C++語言3.0版本是C++語言的進一步完善,其中最重要的新特徵是模板(template),此外解決了多重繼承產生的二義性問題和相應的 構造函數析構函數的處理等。
1998年C++標準(ISO/IEC14882 Standard for the C++ Programming Language)獲得了 國際標準化組織(ISO)和美國標準化協會( ANSI)的批准,標準C++語言及其標準庫更體現了C++語言設計的初衷。 名字空間的概念、 標準模板庫(STL)中增長的標準容器類、通用算法類和字符串類型等使得C++語言更爲實用。此後C++是具備國際標準的編程語言,該標準一般簡稱ANSI C++或ISO C++ 98標準,之後每5年視實際須要更新一次標準。
後來又在2003年經過了C++標準第二版(ISO/IEC 14882:2003):這個新版本是一次技術性修訂,對初版進行了整理——修訂錯誤、減小多義性等,但沒有改變語言特性。這個版本常被稱爲C++03。 [2]  
此後,新的標準草案叫作C++ 0x。對於C++ 0x標準草案的最終國際投票已於2011年8月10日結束,而且全部國家都投出了同意票, C++0x已 經毫無異議地成爲正式國際標準。先前被臨時命名爲C++0x的新標準正式定名爲ISO/IEC 14882:2011,簡稱ISO C++ 11標準。C++ 11標準將取代現行的C++標準C++98和C++03。國際標準化組織於2011年9月1日出版發佈《ISO/IEC 14882:2011》,名稱是:Information technology -- Programming languages -- C++ Edition: 3。 [4-6]  

與C的關係

C語言是C++的基礎,C++和C語言在不少方面是兼容的。
C語言是一個結構化語言,它的重點在於算法與數據結構。C程序的設計首要 考慮的是如何經過一個過程,對輸入(或環境條件)進行運算處理獲得輸出(或實現過程(事物)控制)。C++,首要考慮的是如何構造一個對象模型,讓這個模 型可以契合與之對應的問題域,這樣就能夠經過獲取對象的狀態信息獲得輸出或實現過程(事物)控制。因此C語言和C++的最大區別在於它們解決問題的思想方 法不同。
C++對C的「加強」,表如今六個方面:
(1) 類型檢查更爲嚴格。
(2) 增長了面向對象的機制。
(3) 增長了泛型編程的機制(Template)。
(4) 增長了異常處理。
(5) 增長了運算符重載。
(6) 增長了標準模板庫(STL)。

與C不兼容之處

C++通常被認爲是C的超集合(Superset),但這並不嚴謹。大部分的C代碼能夠很輕易的在C++中正確編譯,但仍有少數差別,致使某些有效的C代碼在C++中失效,或者在C++中有不一樣的行爲。
最多見的差別之一是,C容許從void*隱式轉換到其它的指針類型,但C++不容許。下列是有效的C代碼:
1
2
3
4
5
//從void*
類型隱式轉換爲 int *
類型
int *i= malloc ( sizeof ( int )*5);
 
但要使其在C和C++二者皆能運做,就須要使用顯式轉換:
1
int *i=( int *) malloc ( sizeof ( int )*5);
另外一個常見的可移植問題是,C++定義了新關鍵字,例如如new,class,它們在C程序中能夠做爲識別字(例:變量名)的。
在C標準( C99)中去除了一些不兼容之處,也支持了一些C++的特性,如//註解,以及在代碼中混合聲明。不過C99也歸入幾個和C++衝突的新特性(如:可變長度數組、原生複數類型和複合逐字常數)。
若要混用C和C++的代碼,則全部在C++中調用的C代碼,必須放在 extern "C" { /* C代碼 */ } 內。

語言特色

編輯

優勢

· C++設計成靜態類型、和C一樣高效且可移植的多用途程序設計語言。
· C++設計直接的和普遍的支持多種 程序設計風格(程序化程序設計、資料抽象化、 面向對象程序設計、泛型程序設計)。
 
 
 
C++代碼 (2張)
· C++設計無需複雜的程序設計環境。 [7]  
C++語言靈活,運算符的數據結構豐富、具備結構化控制語句、程序執行效率高,並且同時具備高級語言與彙編語言的優勢,與其它語言相比 ,能夠直接訪問物理地址,與彙編語言相比又具備良好的可讀性和可移植性。
總得來講,C++語言的主要特色表如今兩個方面,一是儘可能兼容C,二是支 持面向對象的方法。它操持了C的簡潔、高效的接近彙編語言等特色,對C的類型系統進行了改革的擴充,所以C++比C更安全,C++的編譯系統能檢查出更多 的類型錯誤。另外,因爲C語言的普遍使用,於是極大的促進了C++的普及和推廣。
C++語言最有意義的方面是支持面向對象的特徵。雖然與C的兼容使得C++具備雙重特色,但他在概念上徹底與C不一樣,更具面向對象的特徵。
出於保證語言的簡潔和運行高效等方面的考慮,C++的不少特性都是以庫(如STL)或其餘的形式提供的,而沒有直接添加到語言自己裏。關於此類話題, Bjarne Stroustrup的《C++語言的設計和演化》(1994)裏作了詳盡的陳述。
C++引入了面向對象的概念,使得開發人機交互類型的應用程序更爲簡單、快捷。不少優秀的程序框架包括 BoostQtMFCOWLwxWidgetsWTL就是使用的C++。

缺點

C++因爲語言自己複雜。C++的編譯系統受到C++的複雜性的影響,很是難於編寫,即便可以使用的編譯器若是存在問題,可能難於被發現。
因爲自己的複雜性,複雜的C++程序的正確性至關難於保證。
C++對於安全性也沒法保證,因此,很容易依靠C++編譯出病毒來。

數據類型

編輯

數據定義

數據是程序處理的對象,數據能夠依其自己的特色進行分類。咱們知道在數學 中有整數、實數的概念,在平常生活中須要用字符串來表示人的姓名和地址,有些問題的回答只能是「是」或「否」(即邏輯「真」或「假」)。不一樣類型的數據有 不一樣的處理方法,例如:整數和實數能夠參加算術運算,但實數的表示又不一樣於整數,要保留必定的小數位;字符串能夠拼接;邏輯數據能夠參加「與」、「或」、 「非」等邏輯運算。
咱們編寫計算機程序,目的就是爲了解決客觀世界中的現實問題。因此,高級語言中也爲咱們提供了豐富的數據類型和運算。C++中的數據類型分爲基本類型和自定義類型。基本類型是C++編譯系統內置的。

基本類型

C++的基本數據類型以下表所示(下表中列出的各種型的長度和取值範圍,是指以面向80x86處理器的 Viusal C++ 2012 和 gcc 4.8.1 的長度,其它的編譯器並不必定是這個長度)。
bool所支持的字節數是1b,取值範圍是false、true;
char、signed char所支持的字節數是1b,取值範圍是-128~127;
unsign char所支持的字節數是1b,取值範圍是0~255;
short (signed short)所支持的字節數是2byte,取值範圍是-32768~32767;
unsigned short所支持的字節數是2byte,取值範圍是0~65535;
int (signed int)所支持的字節數是4b,取值範圍是-2147483648~2147483647;
unsigned int所支持的字節數是4b,取值範圍是0~4294967295;
long (signed long)所支持的字節數是4b,取值範圍是-2147483648~2147483647
unsigned long所支持的字節數是4b,取值範圍是0~4294967295
unsigned long long所支持的字節數是8b,取值範圍是0~18446744073709551615
float所支持的字節數是4b,取值範圍是
double所支持的字節數是8b,取值範圍是
long double所支持的字節數是8b,取值範圍是

類型轉換

C++豐富的數據類型容許根據須要選擇不一樣的類型,這也使得計算機的操做更復雜。
自動類型轉換(隱式類型轉換)
在下列四種狀況中計算機自動進行類型轉換:
  • 在混合類型的算術表達式中
  • intival=3; doubledval=3.1415 ival+dval;//ival被提高爲double類型:3.0
  • 用另一種類型的表達式賦值
  • int*pi=NULL;//NULL(0)被轉換成了int*類型的空指針值
  • 用一個表達式傳遞給一個函數調用
  • externdoublesqrt(double); sqrt(2);//2被提高爲double類型:2.0
  • 從一個函數返回一個表達式
  • doubledifference(intival1,intival2) { returnival1-ival2;//返回值被提高爲double類型. }
強制類型轉換(顯示類型轉換)
C++顯式轉換包含四種轉換:
  • 用法:static_cast < type-id > ( expression )
    說明:該運算符把expression轉換爲type-id類型,但沒有運行時類型檢查來保證轉換的安全性。
  • 用法:dynamic_cast < type-id > (expression)
    說明:該運算符把expression轉換成type-id類型的對象。Type-id必須是類的指針、類的引用或者void*;
  • 用法:const_cast<type_id> (expression)
    說明:該運算符用來修改類型的const或volatile屬性。除了const 或volatile修飾以外, type_id和expression的類型是同樣的。
  • 用法:reinterpret_cast<type-id> (expression)
    說明:type-id 必須是一個指針、引用、算術類型、函數指針或者成員指針。它能夠把一個指針轉換成一個整數,也能夠把一個整數轉換成一個指針(先把一個指針轉換成一個整數,在把該整數轉換成原類型的指針,還能夠獲得原先的指針值)。

編程技巧

編輯

new和delete

運算符new和delete提供了存儲的動態內存分配和釋放功能,它的做用至關於C語言的函數malloc()和free(),但性能更爲優越。使用new較之使用malloc()有如下的幾個優勢:
(1)new自動計算要分配類型的大小,不使用sizeof運算符,比較省事,能夠避免錯誤。
(2)自動地返回正確的 指針類型,不用進行強制指針 類型轉換
(3)能夠用new對分配的對象進行 初始化[8]  

inline

對於頻繁使用的函數,C語言建議使用宏調用代替 函數調用以加快代碼執行,減小調用開銷。可是宏調用有許多的弊端,可能引發不指望的反作用。例如宏:#define abs(a)(a)<0?(-a):(a)),當使用abs(i++)時,這個宏就會出錯。
因此在C++中應該使用 inline 內聯函數替代宏調用,這樣既可達到宏調用的目的,又避免了宏調用的弊端。
使用內聯函數只須把inline關鍵字放在函數返回類型的前面。 [8]  

函數重載

在C語言中,兩個函數的名稱不能相同,不然會致使編譯錯誤。而在C++中,函數名相同而參數數據類型不一樣或參數個數不一樣或兩者皆不一樣的兩個函數被解釋爲重載。
使用 函數重載能夠幫助程序員處理更多的複雜問題,避免了使用諸如intabs()、fabs()、dabs()等繁雜的函數名稱;同時在大型程序中,使函數名易於管理和使用,而沒必要絞盡腦汁地去處理函數名。同時必須注意,參數數據類型相同,可是函數返回類型不一樣的兩個函數不能重載。 [8]  

參數傳遞

在C語言中,若是一個函數須要修改用做參數的變量值的時候 ,參數應該聲明爲指針類型;當參數的大小超過一個機器字長時,經過傳值方式來傳遞參數的效率較低,也須要用指針。因爲C語言的指針能夠進行p++,-- p,p+=1等算術運算,因此編譯器沒法在編譯的時候肯定指針引用的變量。對於複雜的程序,使用 指針容易出錯,程序也難以讀懂。在C++中,對於上述狀況 可使用引用來代替指針,使程序更加清晰易懂。引用就是對變量取的一個別名,對引用進行操做,這就至關於對原有變量進行操做。 [8]  

缺省參數

在C++中函數可使用 缺省參數
一般的狀況下,一個函數應該具備儘量大的靈活性。使用缺省參數爲程序員處理更大的複雜性和靈活性問題提供了有效的方法,因此在C++的代碼中都大量地使用了缺省參數。
須要說明的是,全部的缺省參數必須出如今不缺省參數的右邊。亦即,一旦開始定義缺省參數,就不可再聲明非缺省的參數。不然當你省略其中一個參數的時候,編譯器沒法知道你是自定義了這個參數仍是利用了缺省參數而定義了非缺省的參數。 [8]  

使用STL

STL(Standard Template Library, 標準模板庫),STL的代碼從廣義上講分爲三類:algorithm(算法)、container(容器)和iterator( 迭代器),幷包括一些工具類如 auto_ptr。幾乎全部的代碼都採用了 模板類和模板函數的方式,這相比於傳統的由函數和類組成的庫來講提供了更好的代碼重用機會。
做用符被重載,使得咱們能夠像訪問數組同樣訪問vector中的元素。 [8]  

使用模板

模板的概念
模板是C++的一個特性,是函數和類能夠做用於不一樣的類型上而不須要針對每個具體類型重複相同的代碼。與模板相反,咱們已經學過的 重載(Overloading),對重載函數而言,C++的檢查機制能經過函數參數的不一樣及所屬類的不一樣。正確的調用 重載函數。例如,爲求兩個數的最大值,咱們定義MAX()函數須要對不一樣的數據類型分別定義不一樣 重載(Overload)版本。若是使用模板就能夠只寫一個通用的MAX模板,而不須要針對每一個類型重複相同的邏輯。
指針與引用的區別
指針與引用看上去徹底不一樣(指針用操做符「*」和「->」,引用使用操做符「&」),可是它們彷佛有相同的功能。指針與引用都是讓你間接引用其餘對象。你如何決定在何時使用指針,在何時使用引用呢?
首先,要認識到在任何狀況下都不能使用指向空值的引用。一個引用必須老是 指向某些對象。所以若是你使用一個變量並讓它指向一個對象,可是該變量在某些時候也可能不指向任何對象,這時你應該把變量聲明爲指針,由於這樣你能夠賦空 值給該變量。相反,若是變量確定指向一個對象,例如你的設計不容許變量爲空,這時你就能夠把變量聲明爲引用。

類和對象

編輯
是具備相同屬性和相同的方法的對象的集合,它是一種既包含數據又包含函數的抽象數據類型。
對象是類進行實體化後的產物,是一個實體。
在C++中也是先聲明一個類類型,而後用它去定義若干個同類型的對象。對象就是類類型的一個變量。能夠說類是對象的模板,是用來定義對象的一種抽象類型。類是抽象的,不佔用內存,而對象是具體的,佔用存儲空間。

聲明類類型

類是用戶本身指定的類型。若是程序中要用到類類型,必須本身根據須要進行聲明,或者使用別人已設計好的類。C++標準自己並不提供現成的類的名稱、結構和內容。
在C++中聲明一個類的類型和聲明一個結構體類型是類似的。下面是聲明一個結構體類型的方法:
1
2
3
4
5
6
7
struct  Student //聲明瞭一個名爲Student的結構體類型
 {
  int  num;
  char  name[20];
  char  sex;
 };
 Student stud1,stud2; //定義了兩個結構體變量stud1和stud2,它只包括數據,沒有包括操做
聲明一個類:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class  Student //以class開頭
 {
  int  num;
  char  name[20];
  char  sex; //以上3行是數據成員
  void  display() //這是成員函數
 {
 cout<<″num:″<<num<<endl;
 cout<<″name:″<<name<<endl;
 cout<<″sex:″<<sex<<endl;
 }; //以上4行是函數中的操做語句
 
 };
 Student stud,stud1; //定義了兩個對象stud和stud1
 
事實上,也能夠用struct關鍵字來聲明一個類。這樣的類中默認全部成員的權限都是public(除非你特別寫上權限),而用class聲明的類中默認全部成員的權限都是private.
能夠看到聲明類的方法是由聲明結構體類型的方法發展而來的,類就是對象的類型。實際上,類是一種廣義的數據類型。類這種數據類型中的數據既包含數據,也包含操做數據的函數。
不能把類中的所有成員與外界隔離,通常是把數據隱蔽起來,而把成員函數做爲對外界的 接口。能夠將上面類的聲明改成
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class  Student //以class開頭
 {
  private : //聲明私有成員
 intnum;
  char  name[20];
  char  sex;
  public : //聲明公共成員
  void  display()
 {
 cout<<″num:″<<num<<endl;
 cout<<″name:″<<name<<endl;
 cout<<″sex:″<<sex<<endl;
 }
 };
 Student stud1,stud2; //定義了兩個對象stud1和stud2
 
若是在類的定義中既不指定private,也不指定public,則系統就默認爲是私有的。概括以上對類類型的聲明,可獲得其通常形式以下:
1
2
3
4
5
6
7
8
class  類名
 {
  private :
  //私有的數據和成員函數;
  public :
  //公用的數據和成員函數;
 };
 
private 和public稱爲成員訪問限定符(member access specifier)。除了private和public以外,還有一種成員訪問限定符protected(受保護的),用protected聲明的成員 稱爲受保護的成員,它不能被類外訪問(這點與私有成員相似),但能夠被派生類的成員函數訪問。
在聲明類類型時,聲明爲private的成員和聲明爲public的成員的次序任意,既能夠先出現private部分,也能夠先出現public部分。
在一個類體中,關鍵字private和public能夠分別出現屢次。每一個部分的有效範圍到出現另外一個訪問限定符或類體結束時(最後一個右花括號)爲止。可是爲了使程序清晰,應該養成這樣的習慣: 使每一種成員訪問限定符在類定義體中只出現一次。
C++ 程序多數先寫public部分,把private部分放在類體的後部。這樣可使用戶將注意力集中在能被外界調用的成員上,使閱讀者的思路更清晰一些。
在C++程序中,常常能夠看到類。爲了用戶方便,經常使用的C++編譯系統每每向用戶提供 類庫(但不屬於C++語言的組成部分),內裝經常使用的基本的類,供用戶使用。很多用戶也把本身或本單位常常用到的類放在一個專門的類庫中,須要用時直接調用,這樣就減小了程序設計的工做量。

定義對象

上述程序段中,最後一行用已聲明的Student類來定義對象,這種方法是很容易理解的。通過定義後,stud1和stud2就成爲具備Student類特徵的對象。stud1和stud2這兩個對象都分別包括Student類中定義的數據和函數。
定義對象也能夠有如下幾種方法:
1.先聲明類類型,而後再定義對象前面用的就是這種方法,如Student stud1,stud2;//Student是已經聲明的類類型在C++中,聲明瞭類類型後,定義對象有兩種形式。
(1)class 類名 對象名
如: class Student stud1,stud2;
把class和Student合起來做爲一個類名,用來定義對象。
(2)類名 對象名
如: Student stud1,stud2;
直接用類名定義對象。
這兩種方法是等效的。第1種方法是從C語言繼承下來的,第2種方法是C++的特點,顯然第2種方法更爲簡捷方便。
2.在聲明類類型的同時定義對象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class  Student{ //聲明類類型
  public : //先聲明公用部分
  void  display(){
 cout<<″num:″<<num<<endl;
 cout<<″name:″<<name<<endl;
 cout<<″sex:″<<sex<<endl;
 }
  private : //後聲明私有部分
  int  num;
  char  name[20];
  char  sex;
 }stud1,stud2; //定義了兩個Student類的對象
 
 
在定義Student類的同時,定義了兩個Student 類的對象。
3.不出現類名,直接定義對象
1
2
3
4
5
6
7
class //無類名
 {
  private : //聲明如下部分爲私有的
  //...
  public : //聲明如下部分爲公用的
  //...
 }stud1,stud2; //定義了兩個無類名的類對象
直接定義對象,在C++中是合法的、容許的,但卻不多用,也不提倡用。在實際的程序開發中,通常都採用上面3種方法中的第1種方法。在小型程序中或所聲明的類只用於本程序時,也能夠用第2種方法。在定義一個對象時,編譯系統會爲這個對象分配存儲空間,以存放對象中的成員。

類和結構體

編輯
C++增長了class類型後,仍保留告終構體類型(struct ),並且把它的功能也擴展了。C++容許用struct來定義一個類型。如能夠將前面用關鍵字class聲明的類類型改成用關鍵字struct:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
structStudent{ //用關鍵字struct來聲明一個類類型
  private : //聲明如下部分爲私有的
  int  num; //如下3行爲數據成員
  char  name[20];
  char  sex;
  public : //聲明如下部分爲公用的
  void  display(){ //成員函數
 cout<<″num:″<<num<<endl;
 cout<<″name:″<<name<<endl;
 cout<<″sex:″<<sex<<endl;
 }
 };
 Student stud1,stud2; //定義了兩個Student類的對象
 
爲 了使結構體類型也具備封裝的特徵,C++不是簡單地繼承C的結構體,而是使它也具備類的特色,以便於用於面向對象程序設計。用struct聲明的結構體類 型實際上也就是類。用struct聲明的類,若是對其成員不做private或public的聲明,系統將其默認爲public。
若是想分別指定私有成員和公用成員,則應用private或public做顯式聲明。
而用class定義的類,若是不做private或public聲明,系 統將其成員默認爲private,在須要時也能夠本身用顯式聲明改變。若是但願成員是公用的,使用struct比較方便,若是但願部分紅員是私有的,宜用 class。建議儘可能使用class來創建類,寫出徹底體現C++風格的程序。

關鍵字

編輯
關鍵字(keyword)是整個語言範圍內預先保留的標識符。每一個C++ 關鍵字都有特殊的含義。通過預處理後,關鍵字從預處理記號(preprocessing-token)中區出來,剩下的標識符做爲記號(token),用 於聲明對象、函數、類型、命名空間等。不能聲明與關鍵字同名的標識符。
各個版本的ISO C++都規定如下劃線接大寫字母起始的標識符保留給實現。編譯器能夠用這些保留標識符做爲擴展關鍵字,這不保證可移植性。如下討論ISO C++所保留的關鍵字。
ISO C++ 98 關鍵字共63個,此處嚴格按標準原文排版:
asm
do
if
return
typedef
auto
double
inline
short
typeid
bool
dynamic_cast
int
signed
typename
break
else
long
sizeof
union
case
enum
mutable
static
unsigned
catch
explicit
namespace
static_cast
using
char
export
new
struct
virtual
class
extern
operator
switch
void
const
false
private
template
volatile
const_cast
float
protected
this
wchar_t
continue
for
public
throw
while
default
friend
register
true
 
delete
goto
reinterpret_cast
try
 

編程開發

編輯

代碼實現

一個程序從編寫到最後獲得運行結果要經歷如下一些步驟:
一、用C++語言編寫程序
高級語言編寫的程序稱爲「 源程序」(source program)。源程序的後綴取決於C++實現,下表列出了經常使用擴展名:
Unix: C, cc, cxx, c
GNU C++: C, cc, cxx, cpp, c++
Digital Mars: cpp, cxx
Borland: C++ cpp
Watcom: cpp
Microsoft Visual C++: cpp, cxx, cc
Metrowerks CodeWarrior: cpp, cp, cc, cxx, c++
二、對源程序進行編譯
爲了使計算機能執行高級語言源程序,必須先用一種稱爲「 編譯器(complier)」的軟件(也稱編譯程序或編譯系統),把源程序翻譯成二進制形式的「目標程序(object program)。
編譯是以源程序文件爲單位分別編譯的。目標程序通常以.obj或.o做爲 後綴(object 的縮寫)。編譯的做用是對源程序進行詞法檢查和語法檢查。編譯時對文件中的所有內容進行檢查,編譯結束後會顯示出全部的編譯出錯信息。通常編譯系統給出的 出錯信息分爲兩種,一種是錯誤(error);一種是警告(warning) 。
三、將目標文件鏈接
在改正全部的錯誤並所有經過 編譯後,獲得一個或多個目標文件。此時要用系統提供的「鏈接程序(linker)」將一個程序的全部目標程序和系統的庫文件以及系統提供的其餘信息鏈接起來,最終造成一個可執行的二進制文件,它的後綴是.exe,是能夠直接執行的。
四、運行程序
運行最終造成的可執行的二進制文件(.exe文件),獲得運行結果。
若是運行結果不正確,應檢查程序或算法是否有問題。

命令行開發方式

在Unix世界有大量的程序員是傳統的非IDE的方式進行軟件開發。通常是以下組合:
1.編譯器: gccclang等。 [9]  
2.編輯器:經常使用 VimEmacs
3.make:GNU make 或者BSD的pmake等,功能與用法基本同樣
4.版本管理: cvs, svn,git等等
5.代碼閱讀: cscope,ctags,lxr等

集成開發環境(IDE)

1. Microsoft Visual Studio(Visual C++)
2.Borland C++ Builder
3. Eclipse (Myln + CDT + MinGW32 + GCC)
Visual Studio 2012
Visual Studio 2012 (2張)
4. Dev-C++ (MinGW32 + GCC)
5. Code::Blocks(可配合多款編譯器使用)
7. C-Free
8. Qt Creator (可配合多款編譯器使用)
實際上,當前流行的編譯器只有五種:Intel C++ 編譯器、微軟的cl.exe編譯器(捆綁於Visual Studio套裝中)、GNU的GCC編譯器、LLVM的Clang編譯器、Borland公司的bcc.exe編譯器(捆綁於Borland C++ Builder套裝中)。

多泛型設計

編輯
根據Effective C++第三版第一條款的描述,C++由如下四個「子語言」組成:
一、C子語言。C++支持C語言的幾乎所有功能,主要是c89的部分,在語法上與C語言僅有極微妙的差異(如括號表達式的左右值性,具體請參考C++標準文獻)。這部分功能對應於傳統的面向過程的編程泛型,並提供了面向函數編程泛型的基礎。
二、 面向對象的C++語言。C++語言本來不具有面向對象的設計功能,然而隨着 面向對象編程的概念的普及,C++語言也開發出了支持面向對象功能的版本。這部分功能對應於面向對象的編程泛型。
三、泛型編程語言。C++強大(但容易失控的)模板功能使它能在編譯期完成許多工做,從而大大提升運行期效率,而且大大提升了C++的表達能力。 STL(C++ 標準模板庫,Standard Template Library)是一個基於模板技術的庫。隨着STL的不斷髮展,它已經逐漸成爲C++程序設計中不可或缺的部分,其效率可能比通常的native代碼低 些,可是其安全性與規範性使它大受歡迎。模板使C++可以支持泛型編程(generic programming)和生成式編程(generative programming)的泛型。
四、在C++11中引入的Lambda,使得程序員能夠定義匿名函數,完善了C++對於面向函數的編程泛型的支持。

經典著做

編輯

入門書籍

《C++ Primer 中文版(第5版)》
《C++ Primer (Fifth Edition)》
《C++ Primer Plus 中文版(第六版)》
《C++ Primer Plus (Sixth Edition)》

進階書籍

《Thinking in C++》
《A Tour Of C++》
《C++編程思想》
《The C++ Programming Language (Fourth Edition)》
《C++程序設計語言(第四版)》(未出版)
《Essential C++》
《The C++ Standard Library: A Tutorial and Reference》
《C++標準程序庫:自修教程與參考手冊》
《Effective STL》
《Generic Programming and the STL: Using and Extending the C++ Standard Template Library》
《泛型編程與STL》
《C++語言的設計和演化》
《C++標準程序庫:自修教程與參考手冊》
《STL源碼剖析》

高階書籍

《Standard C++ IOStreams and Locales: Advanced Programmer's Guide and Reference》
《標準C++輸入輸出流與本地化》
《C++ Network Programming》
《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》;
《Preprocessor C++》
《C++語言基礎》
《Essential C++》
《(More)Effective C++》
《(More)Exceptional C++》 [10]  
《C++ Templates》
《Core C++ A Software Engineering Approach》 [11]  
《高質量C++編程指南——上海貝爾標準編程文檔 》
Presentation Materials: Overview of the New C++ (C++11/14) [12]  

常見錯誤

編輯
英文
參考譯文
Ambiguous operators need parentheses
模棱兩可的操做符須要括號
Ambiguous symbol ''xxx''
不明確的符號
Argument list syntax error
參數表語法錯誤
Array bounds missing
數組界限符丟失
Array size toolarge
數組尺寸太大
Bad character in paramenters
參數中有不適當的字符
Bad file name format in include directive
包含命令中文件名格式不正確
Bad ifdef directive synatax
編譯預處理ifdef有語法錯
Bad undef directive syntax
編譯預處理undef有語法錯
Bit field too large
位字段太長
Call of non-function
調用未定義的函數
Call to function with no prototype
調用函數時沒有函數的說明
Cannot modify a const object
不容許修改常量對象
Case outside of switch
漏掉了case 語句
Case syntax error
Case 語法錯誤
Code has no effect
代碼不可能被執行到
Compound statement missing{
分程序漏掉"{"
Conflicting type modifiers
互相沖突的類型說明符設置
Constant expression required
須要常量表達式
Constant out of range in comparison
在比較中常量超出範圍
Conversion may lose significant digits
轉換時會丟失數值的精度
Conversion of near pointer not allowed
不容許轉換近指針
Could not find file ''xxx''
找不到XXX文件
Declaration missing ;
聲明中缺乏";"
Declaration syntax error
聲明中出現語法錯誤
Default outside of switch
Default 出如今switch語句以外
Define directive needs an identifier
定義編譯預處理須要標識符
Division by zero
用零做除數
Do statement must have while
Do-while語句中缺乏while部分
Enum syntax error
枚舉類型語法錯誤
Enumeration constant syntax error
枚舉常數語法錯誤
Error directive :xxx
錯誤的編譯預處理命令
Error writing output file
寫輸出文件錯誤
Expression syntax error
表達式語法錯誤
Extra parameter in call
調用時出現多餘錯誤
File name too long
文件名太長
Function call missing
函數調用缺乏右括號
Fuction definition out of place
函數定義位置錯誤
Fuction should return a value
函數必需返回一個值
Goto statement missing label
Goto語句沒有標號
Hexadecimal or octal constant too large
16進制或8進制常數太大
Illegal character ''x''
非法字符x
Illegal initialization
非法的初始化
Illegal octal digit
非法的8進制數字
Illegal pointer subtraction
非法的指針相減
Illegal structure operation
非法的結構體操做
Illegal use of floating point
非法的浮點運算
Illegal use of pointer
指針使用非法
Improper use of a typedefsymbol
類型定義符號使用不恰當
In-line assembly not allowed
不容許使用行間彙編
Incompatible storage class
存儲類別不相容
Incompatible type conversion
不相容的類型轉換
Incorrect number format
錯誤的數據格式
Incorrect use of default
Default使用不當
Invalid indirection
無效的間接運算
Invalid pointer addition
指針相加無效
Irreducible expression tree
沒法執行的表達式運算
Lvalue required
須要邏輯值0或非0值
Macro argument syntax error
宏參數語法錯誤
Macro expansion too long
宏的擴展之後太長
Mismatched number of parameters in definition
定義中參數個數不匹配
Misplaced break
此處不該出現break語句
Misplaced continue
此處不該出現continue語句
Misplaced decimal point
此處不該出現小數點
Misplaced elif directive
不該編譯預處理elif
Misplaced else
此處不該出現else
Misplaced else directive
此處不該出現編譯預處理else
Misplaced endif directive
此處不該出現編譯預處理endif
Must be addressable
必須是能夠編址的
Must take address of memory location
必須存儲定位的地址
No declaration for function ''xxx''
沒有函數xxx的說明
No stack
缺乏堆棧
No type information/沒有類型信息
缺乏堆棧
Non-portable pointer assignment
不可移動的指針(地址常數)賦值
Non-portable pointer comparison
不可移動的指針(地址常數)比較
Non-portable pointer conversion
不可移動的指針(地址常數)轉換
Not a valid expression format type
不合法的表達式格式
Not an allowed type
不容許使用的類型
Numeric constant too large
數值 常太
Out of memory
內存不夠用
Parameter ''xxx'' is never used
能數xxx沒有用到
Pointer required on left side of ->
符號->的左邊必須是指針
Possible use of ''xxx'' before definition
在定義以前就使用了xxx(警告)
Possibly incorrect assignment
賦值可能不正確
Redeclaration of ''xxx''
重複定義了xxx
Redefinition of ''xxx'' is not identical
xxx的兩次定義不一致
Register allocation failure
寄存器定址失敗
Repeat count needs an lvalue
重複計數須要邏輯值
Size of structure or array not known
結構體或數給大小不肯定
Statement missing ;
語句後缺乏";"
Structure or union syntax error
結構體或聯合體語法錯誤
Structure size too large
結構體尺寸太大
Sub scripting missing ]
下標缺乏右方括號
Superfluous & with function or array
函數或數組中有多餘的"&"
Suspicious pointer conversion
可疑的指針轉換
Symbol limit exceeded
符號超限
Too few parameters in call
函數調用時的實參少於函數的參數不
Too many default cases
Default太多(switch語句中一個)
Too many error or warning messages
錯誤或警告信息太多 [13]  
英文
參考譯文
Too many type in declaration
說明中類型太多
Too much auto memory in function
函數用到的局部存儲太多
Too much global data defined in file
文件中全局數據太多
Two consecutive dots
兩個連續的句點
Type mismatch in parameter xxx
參數xxx類型不匹配
Type mismatch in redeclaration of ''xxx''
xxx重定義的類型不匹配
Unable to create output file ''xxx''
沒法創建輸出文件xxx
Unable to open include file ''xxx''
沒法打開被包含的文件xxx
Unable to open input file ''xxx''
沒法打開輸入文件xxx
Undefined label ''xxx''
沒有定義的標號xxx
Undefined structure ''xxx''
沒有定義的結構xxx
Undefined symbol ''xxx''
沒有定義的符號xxx
Unexpected end of file in comment started on line xxx
從xxx行開始的註解還沒有結束文件不能結束
Unexpected end of file in conditional started on line xxx
從xxx 開始的條件語句 還沒有結束文件不能結束
Unknown assemble instruction
未知的彙編結構
Unknown option
未知的操做
Unknown preprocessor directive: ''xxx''
不認識的預處理命令xxx
Unreachable code
無路可達的代碼
Unterminated string or character constant
字符串缺乏引號
User break
用戶強行中斷了程序
Void functions may not return a value
Void類型的函數不該有返回值
Wrong number of arguments
調用函數的參數數目錯
''xxx'' not an argument
xxx不是參數
''xxx'' not part of structure
xxx不是結構體的一部分
xxx statement missing (
xxx語句缺乏左括號
xxx statement missing )
xxx語句缺乏右括號
xxx statement missing ;
xxx缺乏分號
xxx'' declared but never used
說明了xxx但沒有使用
xxx'' is assigned a value which is never used
給xxx賦了值但未用過
Zero length structure
結構體的長度爲零 [14]  

爭議

編輯
「在這12年裏,C++用戶人數大約每七個月半增長一倍」是許多C++相 關文件必引的一段話;然而,時至今日新語言層出不窮,用戶人數已不太可能以如此速度增加。分析機構EvansData按期對開發人員展開調查,其數據顯 示,以C++爲工具的開發人員在整個開發界所佔的比例由1998年春天的76%降低至2004年秋的46%。Forrester最新的調查顯示,C++、 微軟 Visual Basic和Java是衆多公司產品體系的首選語言。對100家公司的調查顯示,C/C++、Visual Basic和Java在產品體系中的使用比例分別是59%、61%和66%。
一部分Unix/C程序員對C++語言深惡痛絕,他們批評的理由以下:
1 STL以很是醜陋的方式封裝了各類數據結構和算法,寫出來的代碼難以理解、不美觀。
2 C++編譯器複雜和不可靠,不適合構建人命關天類型的程序。
3 一部分人認爲 面向對象技術徒增學習成本,不如面向過程的C語言簡單容易使用,尤爲是在系統軟件的構建上。
歸納說來 UNIX程序員批評C++主要是因爲UNIX社區與C++社區的文化差別。[6]
一個值得注意的事情是 Linux之父 Linus Torvalds曾經炮轟C++; 圖靈獎得主尼克勞斯·維爾特也曾經批評C++語言太複雜、語法語義模糊,是「拙劣工程學」的成果。
事實上,對於C++語言的批評並不僅來源於Unix/Unix-Like系統下的程序員。就像C++語言自己是一個跨平臺的語言同樣,對C++的批評並不侷限於Unix/Unix-Like系統用戶。
一個肯定的觀點是:C++是一門複雜的語言、這門語言擁有過多的特性從而難以完全掌握;C++的某些庫難以學習、掌握並應用於實際當中;不少程序員都認爲C++是一個過分設計的程序語言。

C++ 標準

編輯

C++ 98 標準

C++標準初版,1998年發佈。正式名稱爲 ISO/IEC 14882:1998 [15]   。
絕大多數編譯器都支持C++98標準。不過當時錯誤地引入了export 關鍵字。因爲技術上的實現難度,除了Comeau C++編譯器export關鍵字之外,沒有任何編譯器支持export關鍵字。而且這個標準對現代的一些編譯理念有至關的差距,有不少在高級語言都應當有 的功能,它都沒有。這也正是後來須要制定C++11標準的緣由所在。

C++ 03 標準

C++標準第二版,2003年發佈。正式名稱爲 ISO/IEC 14882:2003 [16]   。這個標準僅僅是C++98修訂版,與C++98幾乎同樣,沒作什麼修改。僅僅是對C++98作了一些「勘誤」,就連主流編譯器(受C99標準影響)都已支持的long long都沒有被加入C++03標準。

C++ 11 標準

C++標準第三版,2011年8月12日發佈。正式名稱爲 ISO/IEC 14882:2011 [17]   。
由C++標準委員會於2011年8月12日公佈,並於2011年9月出 版。2012年2月28日的國際標準草案(N3376)是最接近於現行標準的草案(編輯上的修正)。C++11包含了核心語言的新機能,而且拓展C++標 準程序庫,而且加入了大部分的C++ Technical Report 1程序庫(數學上的特殊函數除外)。這次標準爲C++98發佈後13年來第一次重大修正。
注意: C++11標準(ISO/IEC 14882:2011)與 C11標準(ISO/IEC 9899:2011)是兩個徹底不一樣的標準,後者是C語言的標準。

C++ 14 標準

C++標準第四版,2014年8月18日發佈。正式名稱爲 ISO/IEC 14882:2014
2014年8月18日,ISO組織在其網站上發佈文章稱:
C++ 做者 Bjarne Stroustrup 稱,主要的編譯器開發商已經實現了 C++ 14 規格。
C++ 14 是 C++ 11 的增量更新,主要是支持普通函數的返回類型推演,泛型 lambda,擴展的 lambda 捕獲,對 constexpr 函數限制的修訂,constexpr變量模板化等等。
C++14是C++語言的最新標準,正式名稱爲" International Standard ISO/IEC 14882:2014(E) Programming Language C++"。C++14旨在做爲C++11的一個小擴展,主要提供漏洞修復和小的改進。C++14標準的委員會草案(Committee Draft)N3690於2013年5月15日發表 [18]   。工做草案(Working Draft)N3936已於2014年3月02日完成。最終的投票期結束於2014年8月15日,結果(一致經過)已於8月18日公佈。
相關文章
相關標籤/搜索