有關C++本質方面的整理與總結

來源:互聯網
上載者:User

標籤:c++本質   總結   什麼是c++   

    這些日子,基本做完了硬體設計,有了時間審查軟體代碼,所以整理一些和C++有關的知識點。今天這個話題,總結C++本質方面的問題,C++到底是什麼,為什麼會定義出這麼靈活又複雜的開發語言,知其然,還知其所以然。

 1這是一位仁兄的總結,總結很好,可以看看:

  C語言有兩種概念:變數和函數,變數分棧變數和堆變數,前者又叫臨時變數,就是在函數內部聲明的變數,這種變數可以理解成當函數返回後就消失了,所以不用擔心儲存空間,但是另一方面,棧變數不能太多太大,因為棧空間本來就不大。

函數本質上是代碼,函數的定義同時也是聲明,而且唯一。這和變數是不同的,變數必須定義聲明兩個地方才會存在於記憶體中。函數儲存於代碼區,一般是唯讀,但是不一定。函數和函數內部的變數完全儲存於不同的地方。

函數參數就是函數的局部變數。

程式(以Win32為例),本質上一個虛擬空間,大小為2^32,這虛擬,但是你可以當真的用,作業系統會自動處理你需要的空間。其他動作系統大致也是這個原理。

指標就是對象在這個虛擬空間中的位移量。(那麼多講指標的教程,其實這一句理解了就夠了,對象就是指函數和變數兩種)。

C++就是在C語言的基礎上,把函數和變數分組,叫做一個類,類的變數在記憶體中是按聲明順序排列的。

C++類的成員函數隱藏著一個this參數,本質上和C函數沒有區別。你調用C++成員函數的時候,這this參數不是函數的第一個參數,而是類的對象指標+dot或->來調用。類的地址其實就是第一個變數的地址。

函數參數的引用調用本質上就是指標調用,區別只對於上層文法,底層代碼沒有區別。

C++類可以有構造和解構函式,這兩個函數分別在產生對象和銷毀對象時自動調用,這才是C++與C的真正區別,這一點,C語言無法類比。
構造和解構函式調用順序如下:構造,先進入建構函式,但是不執行語句,然後開始調用成員的建構函式,全部調用完成後(可能有很多嵌套),才開始執行建構函式內的語句。解構函式,先調用解構函式,並執行完全部語句,但是不返回,開始執行成員的解構函式,執行完成後函數返回。

虛函數,虛函數是一個獨立的機制,它在類的內部儲存一個指標,這個指標指向的記憶體是一個函數列表。如果繼承類(子類)也聲明了這個同名函數,列表裡存在的函數會被替換,多重繼承就會多次替換(當然是在編譯時間期就確定的),這樣即使在父類中調用這個函數,調用的也是子類的函數。

多重繼承,就是把兩個父類的成員和函數都放到一個類裡面。

虛繼承,就是父類的父類如果是同一個類,虛繼承不會重複父類的父類的成員,非虛繼承則會重複(簡單的複製父類的全部成員)。

32位系統下的函數指標本質上只需要32位,但是各種笨拙的C++文法,把這個東西弄的非常複雜混亂。特別是類的成員函數,本質上需要指明第一個參數和函數指標兩個對象,才能確定,但是把這樣一個概念非用函數指標的文法來表示,所以類的成員函數指標是個怪胎,能不用,就不用。(各種編譯器實現也是不同的)。

模板,簡單的說,就是給出函數或者類的一個模子,只有模板參數確定的時候,才能產生具體的代碼,所以你不能把模板函數或類做到動態連結程式庫中。雖然實際上你能這麼做,但是這些函數和對象不在動態連結程式庫中,而是在你編譯的時候才產生。模板涉及到的數學概念比C++語言本身要複雜很多很多倍,無法一句話說清楚。但是我們常用的不是很多。

大體上就這麼多了吧。這就是C++的全部核心本質。


2.C++產生的原因,說明了什麼是C++

最初導致C++誕生的原因是在Bjarne博士等人試圖去分析UNIX的核心的時候,這項工作開始於1979年4月,當時由於沒有合適的工具能夠有效分析由於核心分布而造成的網路流量,以及怎樣將核心模組化。同年10月,Bjarne博士完成了一個可以啟動並執行預先處理程式,稱之為Cpre,它為C加上了類似Simula的類機制。在這個過程中,Bjarne博士開始思考是不是要開發一種新的語言,當時貝爾實驗室對這個想法高度興趣,就讓Bjarne博士等人組成一個開發小組,專門進行研究。 當時不是叫做C++,而是C with class,這是把它當作一種C語言的有效擴充。由於當時C語言在編程界居於老大的地位,要想發展一種新的語言,最強大的競爭者就是C語言,所以當時有兩個問題最受關註:C++要在已耗用時間、代碼緊湊性和資料緊湊性方面能夠與C語言相媲美,但是還要盡量避免在語言應用領域的限制。在這種情況下,一個很自然的想法就是讓C++從C語言繼承過來,但是我們的Bjarne博士更具有先見之明,他為了避免受到C語言的局限性,參考了很多的語言,例如:從Simula繼承了類的概念,從Algol68繼承了運算子多載、引用以及在任何地方聲明變數的能力,從BCPL獲得了//注釋,從Ada得到了模板、名字空間,從Ada、Clu和ML取來了異常。

    有了這些簡單的總結,其實可以大體瞭解C++本質,使用C不能很好解決問題時,利用C語言擴充了一一種新的語言,這就演變成了今天的C++。

本文出自 “LinuxQt濟南高新區” 部落格,請務必保留此出處http://qtlinux.blog.51cto.com/3052744/1558872

有關C++本質方面的整理與總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.