1. 程式人生 > >你好,C++(1)C++是什麼?C++的“前世今生”

你好,C++(1)C++是什麼?C++的“前世今生”

The world is built on C++.

——Herb Sutter

the chairman of the ISO C++ standards committee

and chief native languages architect at Microsoft


 
前傳  C++世界地圖    

如果我們要到某個陌生的地方去旅行,我們往往有很多疑問:這個地方有什麼好玩的?在哪兒可以吃飯?在哪兒又可以住店?這時我們只需要一張內容詳盡的旅行地圖就可以解決這些問題。同樣地,對於即將進入C++世界的我們,心中同樣也有著很多疑問:C++是什麼?C++是怎麼來的?它能做什麼?而我又如何才能完成我的第一個C++程式?面對這些問題,我們所需要的同樣是一張C++世界地圖。它可以解答我們的這些問題,讓我們清晰地認識C++世界。同時,我們還可以通過這張C++世界地圖更多地瞭解C++世界:有哪些好玩的地方,有什麼有趣的故事,有哪些有用的知識與經驗,又有什麼危險而需要注意的陷阱。這張C++世界地圖,將帶領我們暢遊整個C++世界。

還等什麼?讓我們帶上它馬上出發吧!

1.1  C++是什麼

C++是什麼?

這幾乎是每個第一次來到C++世界的旅行者都會問的第一個問題。在百科全書上,它的解釋是“C++是一種靜態資料型別檢查的、支援多種程式設計正規化(面向過程與面向物件等)的通用程式設計語言”。雖然這裡的靜態資料型別、面向物件等修飾語我們還看不太懂,但這裡我們至少知道了一點——C++是一種語言,更確切地說,是一種用於程式設計的語言。就像現實世界中的自然語言是用來表達我們的思想一樣,C++作為一門程式設計語言,同樣也是用來表達我們的思想的,只不過接受它的物件是計算機,所以它有著不同的語法和表達方式。只要我們學會了英語,就可以用英語跟老外交流。同樣地,只要我們學會了C++,也同樣可以用C++跟計算機交流,讓計算機去幫助我們做一些事情。

既然C++是一門語言,那麼它也就必然有著自己的語法規則,也有自己的基本詞彙和句型,也可以分成不同的段落和篇章等等。用自然語言描述一個事物,是作文,而用程式設計語言描述一個事物,就是程式設計。總之,我們可以把C++當作我們的第二外語來學習和運用。

知道更多:程式設計是怎麼回事?

語言,是用來描述和表達現實世界的,C++作為一門程式語言也不例外。作為自然語言,為了描述現實世界中的事物,我們需要一些名詞(陳老師、曾學生)。這些名詞在C++中就是變數(teChen、stZeng);同時這些名詞都有自己的種類(老師、學生),表現在C++中就是變數的資料型別(Teacher、Student);為了表達事物之間的關係,我們需要一些動詞(指導),然後用這些動詞將各個事物連綴成句子(老師指導學生)。這些動詞表現在C++中就是函式(Guide()),而由這些動詞連綴而成的句子在C++中就成了表示式(huTeacher.Guide(huStudent););將多個句子按照一定的邏輯關係組合起來,就可以形成一篇文章。同樣,在C++中利用一定的邏輯控制結構將多個表示式組合起來就形成了程式。

複製程式碼
Teacher teChen;  // 陳老師
Student stZeng;  // 曾學生

teChen.Guide(stZeng);  // 老師指導學生
// 用if條件控制結構組織表示式
if(stZeng.m_nScore >= 60) // 如果學生的成績大於或等於60
{
    stZeng.m_bPass = true;  // 學生及格
}
複製程式碼

通過C++程式語言與自然語言的對比,我們可以輕鬆地理解C++程式的含義。程式設計,就是將描述現實世界的自然語言翻譯成C++語言的過程,如此而已。而這也提示我們,在編寫程式之前,不妨先把程式所要描述的事物(通常是某個資料處理過程)先用自然語言把它描述一遍,然後再翻譯成對應的C++程式語言,就得到了最後的C++程式。

1.2  C++的“前世今生”

讀史可以使人明智。

C++作為一門高階程式設計語言,可說是歷史悠久,算得上是程式設計語言中的“老革命”了。瞭解C++的發展歷史,可以加深我們對這門語言的認識,瞭解C++的本質內涵,理解C++的文化,從而可以更好地學習和掌握這門語言。

傳說,很久很久以前……

1.2.1  從B到C

1967年,著名的電腦科學家丹尼斯·裡奇(Dennis Ritchie)進入美國AT&T的貝爾實驗室工作。一開始,裡奇和他的同事肯·湯普森(Ken Thompson)開始研究DEC PDP-7這種早期計算機,但是他們發現在這個機器上寫程式很困難,只能使用繁瑣的組合語言程式設計。所謂的組合語言(Assembly Language),是一種比較接近計算機底層的低階程式設計語言。在組合語言中,它用助記符(MOV、PUSH、POP等)代替機器語言的操作碼,用地址符號或者標號代替機器語言的地址碼。在執行的時候,用匯編語言編寫的程式並不能被計算機直接識別和執行,我們還需要通過一個叫彙編程式的工具將組合語言重新翻譯成機器語言,然後交由計算機執行。雖然,組合語言藉助助記符和地址符號在一定程度上降低了編寫程式的難度,但是因為它接近計算機底層,因而它所編寫出來的程式依然難以閱讀和理解,程式的開發效率非常低下。

為了解決這個難題,湯普森設計了一種高階程式語言來代替組合語言,並將其命名為B語言。但是由於B語言本身設計的缺陷,使得湯普森在記憶體的限制面前一籌莫展。到了1973年,裡奇對B語言進行了改良,從而賦予了這門新語言強有力的系統控制能力,同時,新語言也做到了簡潔而高效。裡奇把它命名為C語言,意為B語言的下一代程式設計語言。

知道更多:B語言又是從哪裡來的?

C語言來自B語言,那麼B語言是不是來自A語言呢?B語言之前並不存在A語言,之所以取名為B語言,是作者為了紀念他的妻子,他妻子名字的第一個字母是B。

嗯,程式設計師中也有情聖啊!

1978年,裡奇和另一位著名的電腦科學家布朗•克尼漢(Brian Kernighan)一起出版了著名的《The C Programming Language》一書,C語言隨後逐漸成為世界上應用最廣泛的高階程式設計語言,這個版本的C語言也被稱為K&R C。1989年,C語言被ANSI(American National Standards Institute,美國國家標準學會,一個由公司、政府和其他成員組成的志願組織。這個組織負責協商與標準有關的活動,並審議美國國家標準。)標準化(ANSI X3.159—1989)。在K&R C釋出後,又不斷有人為C語言新增新特性,但C語言的標準在一段相當長的時間內都保持不變,直到20世紀90年代,標準才被更新,這就是ISO 9899:1999(1999年釋出)。這個版本就是通常提及的C99。ANSI於2000年3月採用了這個新標準。

1.2.2  從C到C++

語言的發展是一個逐步遞進的過程。1979年4月,同樣是來自貝爾實驗室的本賈尼·斯特勞斯特盧普(Bjarne Stroustrup)博士與同事接受了一項工作——嘗試分析UNIX的核心。但當時沒有合適的工具能夠有效地完成這個任務,很難將其核心模組化,所以斯大叔(不是斯達舒哦)的工作進展很慢。同年10月,斯大叔設計了一個預處理程式,稱之為“Cpre”。 所謂預處理程式,就是在源程式檔案被最終編譯之前,對其進行預先處理的程式。Cpre為C語言加上了類似Simula語言的類機制(類機制,一種抽象和封裝的機制。它將描述一個事物的資料抽象成類的屬性,而將對這些資料的操作抽象成類的方法,然後將屬性和方法封裝成類。在稍後的第6章中我們將重點介紹這個概念)。在這個過程中,斯大叔萌生了建立一門新語言的想法。貝爾實驗室對這個想法很感興趣,就讓他組織一個開發小組,專門進行研究。

當時這門新語言並不是叫C++,而是叫C with class,它只是C語言的一個有效擴充,後來才更名為C++。當時C語言已經在所有程式設計語言中居於老大的地位,要想發展一種新的語言,最強大的競爭對手就是C語言了。C++當時面臨兩個挑戰:第一,C++要在執行時間、程式碼緊湊性和資料緊湊性方面與C語言相媲美;第二,C++要儘量避免在語言應用領域的限制。在這種情況下,最簡單的方法就是繼承C語言的一些特性,讓C++語言具備C語言的各種優點。同時,斯大叔為了突破C語言的種種侷限,還借鑑了其他程式設計語言的優點,實踐了程式設計界由來已久的“拿來主義”。例如:C++從Simula拿來了類的概念;從Algol68拿來了操作符過載、引用以及在任何地方宣告變數的能力;從BCPL拿來了“//”註釋;從Ada拿來了模板、名字空間;從Ada、Clu和ML拿來了異常處理等。通過這一系列的拿來動作,C++具備了多種程式設計語言的優秀基因,既系出名門,又博採眾家之長,從而完成了從C到C++的進化。

其後,C++又經歷了長期的發展,隨著標準模板庫(Standard Template Library,STL)的出現、泛型程式設計的發展,C++在2000年左右出現了其發展史上的一個高峰,而到了2011年,C++的最新標準C++11正式釋出。這個新標準在C++的易用性和效能上作了大量改進,增加了執行緒庫等現代軟體開發所需要的內容,這也為C++的發展注入了新的動力。

很多朋友都是從C語言轉入到C++語言的學習的,大家擁有了C語言的基礎,同時又因為C語言和C++語言之間天然的血緣關係,這使得大家可以對C++語言輕鬆上手,以前的關於C語言的知識和程式設計經驗在C++語言中也繼續有效。但是,C語言和C++語言畢竟是兩門不同的程式語言,它們雖然有一定的血緣關係,但是兩者之間還是有本質的不同,這就是C++比C多出來的兩個“+”號。如果說其中一個“+”號代表了C++比C語言多出來的體現面向物件思想的類機制,那麼另外一個“+”號則代表了C++全新新增的標準模板庫,正是這兩個“+”號將兩者區分開來。所以,如果我們是一個有C語言經驗的程式設計師來學習C++語言,既需要複用自己以前的關於C語言的知識和經驗,同時也應該更新觀念,將學習和理解的重點放在面向物件思想的類機制和標準模板庫這兩個方面,這樣才能學習到C++語言的精髓。

知道更多:C++大事記

1983年8月,C++首次投入使用,開天闢地。

1983年12月,Rick Mascitti建議將C with class更名為CPlusPlus,亦即C++。C++從此名正言順。同年,C++吸收了很多新的特性,其中包括虛擬函式、函式名和操作符過載、常數、使用者可控制的自由空間儲存區、改良的型別檢查及新的雙斜線“//”單行註釋風格。

1985年2月,C++ Release 1.0釋出。

1985年10月,斯特勞斯特盧普博士完成了經典鉅著《The C++ Programming Language》的第一版。

1989年,C++ Release 2.0釋出。它引入了多重繼承、抽象類、靜態成員函式及成員訪問保護等新特性。C++中面向物件的思想更加成熟。

1990年3月,第一次ANSI X3J16技術會議在美國新澤西州召開。

1990年7月,C++加入模板。

1990年11月,C++加入異常處理。

1991年6月,《The C++ Programming Language》第二版完成。

1991年6月,第一次ISO WG21會議在瑞典召開。

1994年8月,ANSI/ISO委員會草案登記。

1997年7月,《The C++ Programming Language》第三版完成。

1998年10月,ISO標準通過表決被接受。

1998年11月,ISO標準得到批准。同年,C++11標準公開,它是當時計劃中的C++的新標準,將取代現行的C++標準ISO/IEC 14882。

2003年,在官方公佈1998標準的5年之後,C++標準委員會處理缺陷報告,並於2003年釋出了一個C++標準的修正版本,稱為C++03。新的標準包含了核心語言的新功能,同時擴充套件了C++標準程式庫,合併了大部分的C++ Technical Report 1程式庫。

2005年,公佈一份名為Library Technical Report 1(簡稱TR1)的技術報告。雖然它不屬於官方標準,但它所提出的幾個擴充套件建議有望成為新C++標準的一部分。目前,幾乎所有流行的C++編譯器都已經支援TR1。

2008年10月,C++11的最新報告N2800公開。

2011年8月,C++11(先前被稱作C++0x)獲得ISO/IEC一致通過;同年9月新的C++標準C++11正式出版,C++從此進入一個新的時代。

1.2.3  更簡單、更高效:C++11讓C++續寫傳奇

技術總是在不斷進步,C++也總是在不斷髮展。自從斯大叔發明並實現了C++語言之後,在面嚮物件語言迅速發展的時代背景下,C++以其面向物件的語言特性、對C語言的良好相容、以及極其接近C語言的效能效率,在工業界佔據了相當大的份額,成為程式設計語言中的無冕之王。在其後的發展中,C++又不斷引入新的內容。標準模板庫和Boost程式庫的出現、泛型程式設計的流行,使得C++牢牢佔據了TIOBE程式語言排行榜前三名的位置,成為業界最流行的程式設計語言之一,成為眾人傳頌的一個傳奇。

然而,隨著硬體技術的不斷髮展,特別是多核技術的出現以及Java、C#等新語言的不斷湧現,C++的發展受到了很大的衝擊,在業界的應用範圍不斷萎縮。C++曾經是Visual Studio 6.0中的首選語言,但是在後繼版本的Visual Studio中,特別是在微軟推出.NET Framework之後,C++的地位不斷下滑,被後來居上的C#搶了風頭。很多鍾情於C++的程式設計師不禁發出這樣的感嘆:“C++老矣,尚能編否?”

雖然C++在發展歷程中經歷了上述小小的波折,但是應當看到,世界上還有無數的C++程式碼在穩定地執行著,這些程式碼還需要維護和升級。另外,C++在某些領域(比如,作業系統程式設計、遊戲開發、電信金融業務、伺服器端開發等)仍具有不可替代的優勢,無數基於C++的新專案正在進行著。為了應對現代程式設計語言的發展及業界的需求,C++也積極汲取現代程式設計語言的發展成果,C++的新標準C++11正是在這種背景之下應運而生的。

C++11是自1998年C++首次被ISO標準化以來變化最大的一個新標準,它主要在以下兩個方面對C++進行了革命性的改進和增強:

一方面,C++11讓C++更加易於使用。C++曾經以其語法的繁瑣複雜而著稱於世,因而可以用C++精確地描述現實世界。同時,C++也非常靈活而自由,我們幾乎可以在C++中完成任何我們想要完成的事情。但繁複、自由和靈活是一把雙刃劍,它讓C++擁有無限的能力,但同時也讓C++在程式設計師們的心目中成為一門難學難用難以掌握的程式語言,讓一些初學者更是望而卻步,從而嚴重阻礙了C++的進一步發展。為了改變這一現狀,C++11引入了很多改善其易用性的語法特性,並從其他主流的程式語言(尤其是Java)中借鑑吸收了很多旨在改善C++易用性的語法特性。例如,C++11提供了auto這種特殊的資料型別,使用它作為變數的資料型別,編譯器可以根據變數的初始值自動推斷其合理的真實資料型別,省去了程式設計師確定複雜變數的資料型別的繁瑣;C++11開始支援Lambda表示式,讓C++中匿名函式的定義和使用成為可能;C++11從Java和C#中借鑑了序列for迴圈語句,讓針對某個容器的迴圈遍歷更加簡單。

另一方面,C++11讓C++的效能更高。相對於其他主流的高階程式語言,接近於低階語言的高效能表現,一直以來都是C++最大的優勢。但是,C++11並不滿足於C++現有的效能表現,通過增加新的語法特性、改寫標準庫等手段,想榨乾C++身上最後的一滴效能血液。例如,C++11提供了對右值引用、移動語義的完全支援,解決了從函式返回一個大物件的資源浪費問題;利用新的語法特性對標準庫進行了大規模的改寫,極大地提高了標準庫的效能表現;特別值得一提的是,為了適應當今越來越普及的平行計算開發,充分利用主流的多核CPU的計算資源,C++11在標準庫中對平行計算提供了全面的支援,我們可以通過執行緒(thread)物件輕鬆完成執行緒的建立,也可以通過互斥(mutex)物件、條件變數(condition_variable)對執行緒的執行情況進行控制。對平行計算的完全支援,讓C++11擁有了更加優異的效能表現。

 C++11在這兩個方面的大力改進,不僅進一步增強了C++在效能方面的優勢,做到了揚長;同時也改善了C++的易用性,做到了避短。正是通過“揚長避短”,使得C++成為了一門“又快又好”的程式設計語言。這些新特性給C++注入了新的活力,使得C++重新煥發青春,帶來C++的復興。C++也必將續寫它那不朽的傳奇。

1.2.4 新興的C#會不會革了C++的命?

自從微軟推出全新的開發語言C#之後,關於C++與C#之間的爭論就沒有停止過。就像C++繼承了C語言的許多特性而同時又增加了很多新特性一樣,C#也同樣繼承了C++的許多特性,同時也增加了很多現代程式語言的新特性。配合強大的.NET Framework,C#下的軟體開發就像搭積木一樣簡單,那些原來在C++下需要幾十行程式碼才能完成的功能在C#下可能只需要幾行程式碼就可以完成。極高的開發效率使得C#的應用越來越廣泛,這使得C++的初學者常常會有這樣的疑問:新興的C#會不會革了C++的命?我們應該學習C++還是學習C#?

正所謂“成也蕭何,敗也蕭何”。.NET Framework在給軟體開發帶來便利的同時,它也在C#和作業系統之間隔了一層,讓我們無法瞭解C#背後的真相,從而處處受制於.NET Framework。例如,實現同樣一個功能,使用C#我們可能只有一種方法,而使用C++,在我們明白了這個功能背後的實現機制之後,就可以用不同的方法應對不同的情況,從而實現最優的方案。總結起來,C#簡單容易,但卻在很多時候無法實現最佳方案,會犧牲一些效能和記憶體空間;C++稍顯複雜,但它卻往往能實現最佳方案。

從本質上講,C++和C#之間的差異是兩種不同的程式設計世界觀之間的差異。在C++的世界觀中,我們看到的是記憶體、指標、模板等基礎設施,很多事情都還等著我們自己去完成建設,雖然辛苦一些,但是我們獲得的卻是更多的自由,更高的效能;而在C#的世界觀中,我們看到的是強大的類庫、垃圾回收機制等已經初具規模的設施,我們只需要使用這些設施來實現自己的功能就可以了。在這種世界觀下,開發效率自然會提高,但是效能就不敢保證了。這就像蓋房子,C++提供給我們的是磚頭和沙子,整個房子都需要我們自己動手;而C#提供給我們的是半成品的一堵牆或者一個房頂,我們只需要將這些半成品壘成一個房子就可以了。用C++的方法,雖然麻煩一些,但是可以蓋出各式各樣獨具個性的房子;用C#的方法,雖然省時省力,可是蓋出來的房子都大同小異,沒有什麼個性可言。

語言無所謂好壞強弱,C#能做的,C++不一定都能做好,而C++能做的,C#也不一定都能做好。所以,討論語言的好壞強弱沒有任何意義。C++和C#各有各的特點,所以也都有各自的應用場景。根據應用場景的不同而選擇合適的語言才是最重要的。最合適的語言就是最好的語言。雖然C#等現代語言的興起部分地蠶食了C++原來的應用範圍,但是隻要這個世界還需要一門效能與開發效率並重的開發語言,只要這個世界還需要伺服器端的開發、多媒體遊戲的開發、圖形影象處理的開發等,C++就不會被革命。

知道更多:將C++嫁接到.NET Framework

    雖然C++在某些開發領域仍然保持著絕對的優勢,但是以C#為代表的新興語言,憑藉著強大的類庫,其極高的開發效率越來越成為程式設計師們的新寵。為了使C++能夠應對這種新的開發趨勢,微軟把C++嫁接到強大的.NET Framework上,由此誕生了C++/CLI(Common Language Infrastructure,公共語言結構),從而允許大量只熟悉C++的開發人員可以繼續在.NET Framework平臺上使用C++開發應用,藉助強大的.NET Framework來提高開發效率。 

那麼到底什麼是C++/CLI?它跟傳統的C++又有什麼不同呢?

CLI指的是通用語言結構,一種支援動態元件程式設計模型的多重結構。在整個CLI結構中,最重要的是公共語言執行時(Common Language Runtime,CLR),它負責管理微軟中間語言(Microsoft Intermediate Language,MSIL)程式碼的執行環境。CLR位於CLI的下半部分(如圖1-1所示),主要包括類載入器(class loader)、實時編譯器(IL to native compilers)和一個執行時環境的垃圾收集器(garbage collector)。CLI執行在底層作業系統與程式之間,為MSIL程式碼提供執行的環境,這使得CLI成為一個實時的軟體層,一個有效的執行系統。我們可以將任何語言編寫的程式碼通過特定的編譯器轉換為MSIL程式碼,然後在CLI上執行。

圖1-1  C++/CLI的結構

當C++和CLI結合起來就成了一種可以經過特殊的編譯器編譯之後執行在CLI之上的C++語言。其中的斜槓“/”代表C++和CLI的捆綁,這個捆綁使得C++/CLI同時具備了C++和CLI這兩個方面的特性。首先,C++/CLI繼承了C++的大部分語法規則,使得我們可以輕鬆地將C++程式碼轉換為C++/CLI程式碼。開發人員可以充分利用已有的C++編碼經驗,使用C++/CLI為.NET Framework平臺開發新的應用程式。其次,當我們用C++/CLI編寫的託管程式碼被執行時,程式碼將被CLR所管理,它提供了諸如垃圾收集等現代高階程式設計語言的特性,同時也實現了C++/CLI與.NET Framework支援的其他語言之間的互操作,讓我們可以通過C++/CLI使用.NET Framework平臺上豐富的元件,極大地提高了開發效率。可以說,通過將C++嫁接到強大的.NET Framework,C++/CLI使得C++這門“古老”的程式設計語言做到了與時俱進,能夠高效率地開發面向未來的豐富應用。

複製程式碼
// 用C++/CLI完成的Hello World程式
using namespace System; // 使用System名字空間,這是C++中的程式設計經驗

int main()
{
    // 建立一個字串指標str,當其使用完畢後,
    // 垃圾回收機制會自動釋放這個字串而無需程式設計師主動回收
    String^ str = "Hello World!";

    // 在控制檯視窗輸出“Hello World!”字串和它的長度
    // 這裡使用的是.NET Framework所提供的控制檯輸出功能
    Console::WriteLine("{0}的長度是{1}",str,str->Length);

    return 0;
}
複製程式碼

1.2.5  C++世界的“四大天王”

就像英語在不同的地域發展成了不同的美式英語和英式英語一樣,C++自從1983年首次投入使用至今,在其30多年的發展過程中,為了適應不同的應用領域,它不斷地吸收不同的開發思想而形成了不同的C++子語言。每個子語言各有所長,就像C++世界的“四大天王”,它們來自同一個語言家族,都是 C++語言,但是又各自擁有自己的特點,各自都有自己的擅長領域,各自都有自己眾多的忠實追隨者,如圖1-1所示。

 

圖1-2  C++世界的“四大天王”

1. C子語言

C++的發展淵源,使得C++支援幾乎全部的C語言功能,在語法上與C語言僅有細微的差別。例如,C++中的語句、內建資料型別、陣列、指標等等,全都是直接來自於C語言。很多人的開發僅僅用到了這些從C語言繼承過來的內容,他們把C++當做一種經過擴充套件的C語言來使用,形成了一種獨特的子語言。

2. 面向物件的C++

C++首先是作為一門面向物件的程式設計語言而聞名的。在C語言的基礎上,C++添加了“類”的概念,從而可以很準確地表達出面向物件思想中封裝、繼承和多型的機制。所以,C++也可以用於面向物件程式設計,而這也是它最主要的應用狀態。

3. 泛型程式語言

泛型程式設計是獨立於流行的面向物件程式設計的一種新的開發方式,可以編寫完全一般化並可重複使用的演算法,其效率與針對特定資料型別而設計的演算法的效率相近。所謂泛型(genericity),是指對多種資料型別皆可操作,與模板有些相似。簡單地講,也就是演算法或者資料結構與具體的資料型別無關,任何資料型別(泛型)都可以操作。C++強大的模板機制為泛型程式設計提供了很好的支援,所以我們也可以將C++用於泛型程式設計。

4.  STL

STL是C++泛型程式設計的一個傑出作品,隨著C++的不斷髮展,STL也變得越來越強大,它已經逐漸成為C++程式設計中不可或缺的一部分。它將容納資料的容器、訪問資料的迭代器、以及對資料進行處理的演算法非常優雅地整合在一起,其效率雖然比專門設計的C++程式碼稍低,但其安全性與規範性大受歡迎,在業界得到了廣泛的應用,已逐漸發展成為一門獨立於泛型程式設計之外的C++子語言。

就像在美式英語和英式英語中的語法規則稍有不同一樣,在C++的不同子語言中,很多規則也有所不同。我們以函式間資料的傳遞為例,當我們工作在C子語言中時,對於內建的資料型別(比如int),傳值通常比傳指標更加高效;而到了面向物件的C++中時,對於使用者自定義的資料型別而言,更高效的做法又變成了傳引用。C++不是使用同一套規則的單一語言,它的每一種子語言幾乎都有一套各自獨立的應用規則。只要我們在頭腦中對自己正在學習或使用的那一種C++子語言有一個清楚的概念,知道自己正在使用哪一種子語言,應用與之相對應的規則,我們會發現對C++的學習和使用會容易得多。