當前位置:編程學習大全網 - 編程語言 - C++語言的原理是什麽?

C++語言的原理是什麽?

C++這個詞在中國大陸的程序員圈子中通常被讀做“C加加”,而西方的程序員通常讀做“C plus plus”,“CPP”。 它是壹種使用非常廣泛的計算機編程語言。C++是壹種靜態數據類型檢查的、支持多重編程範式的通用程序設計語言。它支持過程化程序設計、數據抽象、面向對象程序設計、泛型程序設計等多種程序設計風格。

在C基礎上,壹九八三年又由貝爾實驗室的Bjarne Strou-strup推出了C++。 C++進壹步擴充和完善了C語言,成為壹種面向 對象的程序設計語言。C++目前流行的編譯器最新版本是Borland C++4.5,Symantec C++6.1,和Microsoft VisualC++ 2012。C++提出了壹些更為深入的概念,它所支持的這些面向對象的概念容易將問題空間直接地映射到程序空間,為程序員提供了壹種與傳統結構程序設計不同的思維方式和編程方法。因而也增加了整個語言的復雜性,掌握起來有壹定難度。

C++由美國AT&T貝爾實驗室的本賈尼·斯特勞斯特盧普博士在20世紀80年代初期發明並實現(最初這種語言被稱作“C with Classes”帶類的C)。開始,C++是作為C語言的增強版出現的,從給C語言增加類開始,不斷的增加新特性。虛函數(virtual function)、運算符重載(operator overloading)、多重繼承(multiple inheritance)、模板(template)、異常(exception)、RTTI、命名空間[1](name space)逐漸被加入標準。[2]

1998年國際標準組織(international standard organization, ISO)頒布了C++程序設計語言的國[3]際標準ISO/IEC 1988-1998。C++是具有國際標準的編程語言,通常稱作ANSI/ISOC++。[4]

1998年是C++標準委員會成立的第壹年,以後每5年視實際需要更新壹次標準。C++0x最終國際投票已於2011年8月10日結束,並且所有國家都投出了贊成票,C++0x已經毫無疑義地成為正式國際標準。先前被臨時命名為C++0x的新標準將被稱為C++ 2011。C++ 2011將取代現行的C++標準ISO/IEC 14882,它公開於1998年並於2003年更新,通稱C++98以及C++03。國際標準化組織於2011年9月1日出版發布ISO/IEC 14882:2011,名稱是:Information technology -- Programming languages -- C++ Edition: 3。

計算機誕生初期, 人們要使用計算機必須用機器語言或匯編語言編寫程序?世界上第壹種計算機高級語言誕生於1954年, 它是FORTRAN語言? 先後出現了多種計算機高級語言? 其中使用最廣泛?影響最大的當推BASIC語言和C語言?

BASIC語言是1964年在FORTRAN語言的基礎上簡化而成的, 它是為初學者設計的小型高級語言?

C語言是1972年由美國貝爾實驗室的D.M.Ritchie研制成功的? 它不是為初學者設計的,而是為計算機專業人員設計的? 大多數系統軟件和許多應用軟件都是用C語言編寫的?

但是隨著軟件規模的增大, 用C語言編寫程序漸漸顯得有些吃力了?

C++是由AT&T Bell(貝爾)實驗室的Bjarne Stroustrup博士及其同事於20世紀80年代初在C語言的基礎上開發成功的? C++保留了C語言原有的所有優點, 增加了面向對象的機制?

C++是由C發展而來的, 與C兼容? 用C語言寫的程序基本上可以不加修改地用於C++? 從C++的名字可以看出它是C的超越和集中? C++既可用於面向過程的結構化程序設計, 又可用於面向對象的程序設計, 是壹種功能強大的混合型的程序設計語言?

C++對C的“增強”,表現在六個方面:

(1) 類型檢查更為嚴格。

(2) 增加了面向對象的機制。

(3)增加了泛型編程的機制(template)

(4)增加了異常處理

(5)增加了運算符重載

(6)增加了標準模板庫(STL)

面向對象程序設計,是針對開發較大規模的程序而提出來的,目的是提高軟件開發的效率?不要把面向對象和面向過程對立起來, 面向對象和面向過程不是矛盾的,而是各有用途?互為補充的?

學習C++, 既要會利用C++進行面向過程的結構化程序設計, 也要會利用C++進行面向對象的程序設計,更要會利用模板進行泛型編程?

C和C++關系

但是,C是C++的基礎,C++語言和C語言在很多方面是兼容的。因此,掌握了C語言,再進壹步學習C++就能以壹種熟悉的語法來學習面向對象的語言,從而達到事半功倍的目的。

C timeline

1978 k&R C---->1988 ANSI C-->1995 ISO C

學習C語言最經典的還是The C Programming Language

發展歷史

C++語言發展大概可以分為三個階段:

第壹階段

從80年代到1995年。這壹階段C++語言基本上是傳統類型上的面向對象語言,並且憑借著接近C語言的效率,在工業界使用的開發語言中占據了相當大份額;

第二階段

從1995年到2000年,這壹階段由於標準模板庫(STL)和後來的Boost等程序庫的出現,泛型程序設計在C++中占據了越來越多的比重性。當然,同時由於Java、C#等語言的出現和硬件價格的大規模下降,C++受到了壹定的沖擊;

第三階段

從2000年至今,由於以Loki、MPL等程序庫為代表的產生式編程和模板元編程的出現,C++出現了發展歷史上又壹個新的高峰,這些新技術的出現以及和原有技術的融合,使C++已經成為當今主流程序設計語言中最復雜的壹員。[7]

優點

C++代碼

· C++設計成靜態類型、和C同樣高效且可移植的多用途程序設計語言。

· C++設計成直接的和廣泛的支持多種程序設計風格(程序化程序設計、資料抽象化、面向對象程序設計、泛型程序設計)。

· C++設計成給程序設計者更多的選擇,即使可能導致程序設計者選擇錯誤。

· C++設計成盡可能與C兼容,借此提供壹個從C到C++的平滑過渡。

· C++避免平臺限定或沒有普遍用途的特性。

· C++不使用會帶來額外開銷的特性。

· C++設計成無需復雜的程序設計環境。[8]

出於保證語言的簡潔和運行高效等方面的考慮,C++的很多特性都是以庫(如STL)或其他的形式提供的,而沒有直接添加到語言本身裏。關於此類話題,Bjarne Stroustrup的《C++語言的設計和演化》(1994)裏做了詳盡的陳述。

C++在壹定程度上可以和C語言很好的結合,甚至目前大多數C語言程序是在C++的集成開發環境中完成的。C++相對眾多的面向對象的語言,具有相當高的性能。

C++引入了面向對象的概念,使得開發人機交互類型的應用程序更為簡單、快捷。很多優秀的程序框架包括MFC、QT、wxWidgets就是使用的C++。[9]

代碼性能

人們壹般認為,使用Java或C#的開發成本比C++低。但是,如果充分分析C++和這些語言的差別,會發現這句話的成立是有條件的。這個條件就是:軟件規模和復雜度都比較小。如果不超過3萬行有效代碼(不包括生成器產生的代碼),這句話基本上還能成立。否則,隨著代碼量和復雜度的增加,C++的優勢將會越來越明顯。造成這種差別的就是C++的軟件工程性。[9]

缺點

C++由於語言本身過度復雜,這甚至使人類難於理解其語義。更為糟糕的是C++的編譯系統受到C++的復雜性的影響,非常難於編寫,即使能夠使用的編譯器也存在了大量的問題,這些問題大多難於被發現。[9]

由於本身的復雜性,復雜的C++程序的正確性相當難於保證。也有人提出不支持多線程的原語等缺陷。不過有如此多的知名人士提出了如此多的缺陷,正說明C++被廣泛使用和成功。

c++語言由於過度的復雜性,以及與unix的文化相抵觸,在unix/linux領域受到很多著名人士(比如Linux之父linus torvalds與著名黑客Eric S. Raymond)的強烈批評與抵制。

C++基本數據類型和表達式

數據是程序處理的對象,數據可以依其本身的特點進行分類。我們知道在數學中有整數、實數概念,在日常生活中需要用字符串來表示人的姓名和地址,有些問題的回答只能是“是”或“否”(即邏輯“真”或“假”)。不同類型的數據有不同的處理方法,例如:整數和實數可以參加算術運算,但實數的表示又不同於整數,要保留壹定的小數位;字符串可以拼接;邏輯數據可以參加“與”、“或”、“非”等邏輯運算。

我們編寫計算機程序,目的就是為了解決客觀世界中的現實問題。所以,高級語言中也為我們提供了豐富的數據類型和運算。C++中的數據類型分為基本類型和自定義類型。基本類型是C++編譯系統內置的。

基本數據類型

C++的基本數據類型如下表所示(表中各類型的長度和取值範圍,以面向IA-32處理器的VC++ 2008和gcc 4.2為標準)。

類型名 長度(字節) 取值範圍

bool 1 false,true

char

1 -128~127

signed char 1 -128~127

unsigned char 1 0~255

short(signed short) 2 -32768~32767

unsigned short 2 0~65535

int(signed int) 4 -~

unsigned int 4 0~

long(signed long) 4 -~

unsigned long 4 0~

float 4 3.4X10^(-38)~3.4X10^(38)

double 8 1.7X10^(-308)~1.7X10^(308)

long double 8 1.7X10^(-308)~1.7X10^(308)

編輯本段編程技巧

new和delete

運算符new和delete提供了存儲的動態內存分配和釋放功能,它的作用相當於C語言的函數malloc()和free(),但是性能更為優越。使用new較之使用malloc()有以下的幾個優點:

(1)new自動計算要分配類型的大小,不使用sizeof運算符,比較省事,可以避免錯誤。

(2)自動地返回正確的指針類型,不用進行強制指針類型轉換。

(3)可以用new對分配的對象進行初始化。[11]

inline

對於頻繁使用的函數,C語言建議使用宏調用代替函數調用以加快代碼執行,減少調用開銷。但是宏調用有許多的弊端,可能引起不期望的副作用。例如宏:#define abs(a)(a)<0?(-a):(a)),當使用abs(i++)時,這個宏就會出錯。

所以在C++中應該使用inline內聯函數替代宏調用,這樣既可達到宏調用的目的,又避免了宏調用的弊端。

使用內聯函數只須把inline關鍵字放在函數返回類型的前面。[11]

函數重載

在C語言中,兩個函數的名稱不能相同,否則會導致編譯錯誤。而在C++中,函數名相同而參數數據類型不同或參數個數不同或二者皆不同的兩個函數被解釋為重載。

使用函數重載可以幫助程序員處理更多的復雜問題,避免了使用諸如intabs()、fabs()、dabs()等繁雜的函數名稱;同時在大型程序中,使函數名易於管理和使用,而不必絞盡腦汁地去處理函數名。同時必須註意,參數數據類型相同,但是函數返回類型不同的兩個函數不能重載。[11]

參數傳遞

在C語言中,如果壹個函數需要修改用作參數的變量值的時候 ,參數應該聲明為指針類型;當參數的大小超過壹個機器字長時,通過傳值方式來傳遞參數的效率較低,也需要用指針。由於C語言的指針可以進行p++,--p,p+=1等算術運算,所以編譯器無法在編譯的時候確定指針引用的變量。對於復雜的程序,使用指針容易出錯,程序也難以讀懂。在C++中,對於上述情況 可以使用引用來代替指針,使程序更加清晰易懂。引用就是對變量取的壹個別名,對引用進行操作,這就相當於對原有變量進行操作。[11]

缺省參數

在C++中函數可以使用缺省參數。

通常的情況下,壹個函數應該具有盡可能大的靈活性。使用缺省參數為程序員處理更大的復雜性和靈活性問題提供了有效的方法,所以在C++的代碼中都大量地使用了缺省參數。

需要說明的是,所有的缺省參數必須出現在不缺省參數的右邊。亦即,壹旦開始定義缺省參數,就不可再說明非缺省的參數。否則當妳省略其中壹個參數的時候,編譯器無法知道妳是自定義了這個參數還是利用了缺省參數而定義了非缺省的參數。[11]

使用STL

STL(Standard Template Library,標準模板庫), STL的代碼從廣義上講分為三類:algorithm(算法)、container(容器)和iterator(叠代器),並包括壹些工具類如auto_ptr。幾乎所有的代碼都采用了模板類和模板函數的方式,這相比於傳統的由函數和類組成的庫來說提供了更好的代碼重用機會。

作用符被重載,使得我們可以像訪問數組壹樣訪問vector中的元素。[11]

使用模板

.模板的概念。

模板是C++的壹個特性,是函數和類可以作用於不同的類型上而不需要針對每壹個具體類型重復相同的代碼。與模板相反,我們已經學過的重載(Overloading),對重載函數而言,C++的檢查機制能通過函數參數的不同及所屬類的不同。正確的調用重載函數。例如,為求兩個數的最大值,我們定義MAX()函數需要對不同的數據類型分別定義不同重載(Overload)版本。如果使用模板就可以只寫壹個通用的MAX模板,而不需要針對每個類型重復相同的邏輯。

指針與引用的區別

指針與引用看上去完全不同(指針用操作符“*”和“->”,引用使用操作符“&”),但是它們似乎有相同的功能。指針與引用都是讓妳間接引用其他對象。妳如何決定在什麽時候使用指針,在什麽時候使用引用呢?

首先,要認識到在任何情況下都不能使用指向空值的引用。壹個引用必須總是指向某些對象。因此如果妳使用壹個變量並讓它指向壹個對象,但是該變量在某些時候也可能不指向任何對象,這時妳應該把變量聲明為指針,因為這樣妳可以賦空值給該變量。相反,如果變量肯定指向壹個對象,例如妳的設計不允許變量為空,這時妳就可以把變量聲明為引用。[12]

  • 上一篇:易語言 和C語言有什麽異同麽!
  • 下一篇:四川方言有那些
  • copyright 2024編程學習大全網