天天看點

【C++進階】結構體和類的差別及面向對象的認識

結構體和類的差別以及面向對象的認識

1.C的結構體和C++結構體的差別

   1.1 C的結構體内不允許有函數存在,C++允許有内部成員函數,且允許該函數是虛函數。是以C的結構體是沒有構造函數、析構函數、和this指針的。

   1.2 C的結構體對内部成員變量的通路權限隻能是public,而C++允許public,protected,private三種。

   1.3 C語言的結構體是不可以繼承的,C++的結構體是可以從其他的結構體或者類繼承過來的。

   以上都是表面的差別,實際差別就是面向過程和面向對象程式設計思路的差別:

       C的結構體隻是把資料變量給包裹起來了,并不涉及算法。

       而C++是把資料變量及對這些資料變量的相關算法給封裝起來,并且給對這些資料和類不同的通路權限。

    C語言中是沒有類的概念的,但是C語言可以通過結構體内建立函數指針實作面向對象思想。

 2.C++的結構體和C++類的差別

   2.1 C++結構體内部成員變量及成員函數預設的通路級别是public,而c++類的内部成員變量及成員函數的預設通路級别是private。

   2.2 C++結構體的繼承預設是public,而c++類的繼承預設是private。

3.面向對象的認識

對于面向對象對于像我這樣的一個初級CPPer來說還需要更為深刻的了解。我想不同水準的開發者會對這個概念給出不同程度的認識。         下面說說我的個人了解,開始之前我必須承認,這個概念的範疇顯然超過了我現在所能掌握的範疇,希望對大家的幫助多餘誤導。         首先,我們必須承認面向對象是一種程式設計思想,這種思想的出現我想也是軟體開發在進化過程中的一個合理的産物。至少它的出現解決了許多面向過程程式設計中的許多問題。讓系統的可以更容易的維護。個人覺得面向對象是程式相關人員的一種對于現實問題和程式設計以及開發之間的一種認識論。 通過這種理論,他們将現實中的需要解決的問題成功的抽象,模組化,并将之映射到程式開發中,并用代碼解決問題。 其次,面向對象的三個特性,我想這是一個老生常談的問題了。但是,不得不承認的是,不通水準的人在這三個特性的了解存在着不同水準上的差别。這種不通程度的了解,在工作中的程式設計和編碼過程中得到了最好的展現。好的程式員可以将代碼寫的很有邏輯,簡潔調理,富有美感;水準差的程式員可能就隻能過程化的實作一些功能,這顯然是還沒有完全了解并将面向對象的精華吸收(至少我現在還是這個樣子)。 那現在就提一下這三個概念:(抽象、)封裝、繼承、多态。         談到這三個概念的時候,我更願意在這三個概念之前把“抽象”單獨拿出來作為強調。因為,它是良好展現這三個特性的先決條件。一個良好的抽象是一個實作封裝的開始,一個類設計的好不好,就看抽象的是不是合理。一個不合理的抽象是封裝不出好東西的(個人觀點)。抽象就是找到一個合理的映射關系,将現實問題按合理的方式映射到程式中。将合理的資料和行為抽出來,完成一個資料抽象,并 将描述 客體 的屬性和行為綁定在一起,實作統一的抽象,進而達到對現實世界客體的真正 模拟 。        下面是封裝,封裝是指将現實世界中存在的某個客體的屬性與行為綁定在一起,并放置在一個邏輯單元内,并進行權限的配置設定和控制(通過關鍵字 public, protected,private實作)。該邏輯單元負責将所描述的屬性隐藏起來,外界對客體内部屬性的所有通路隻能通過提供的使用者接口實作。這樣做既可以實作對客體屬性的保護作用,又可以提高軟體系統的可維護性。隻要使用者接口不改變,任何封裝體内部的改變都不會對軟體系統的其他部分造成影響。結構化設計方法沒有做到客體的整體封裝,隻是封裝了各個功能子產品,而每個功能子產品可以随意地對沒有保護能力客體屬性實施操作,并且由于描述屬性的資料與行為被分割開來,是以一旦某個客體屬性的表達方式發生了變化,或某個行為效果發生了改變,就有可能對整個系統産生影響。封裝是類和對象的主要概念,也就是把客觀事物封裝成抽象的類,并且類可以把自己的資料和方法隻讓可信的類或者對象操作,對不可信的進行資訊隐藏。我想到了這一步,一個類就應該在腦海中開始漸漸清晰起來了。并且這一階段完成的時候也意味着整個系統各單元之間的解耦操作也初步完成了。        然後就是繼承。如果說封裝是努力的将不相關的行為和資料進行隔離以期達到解耦的作用,繼承無疑實在封裝的基礎上加強了父類和子類之間的耦合關系。但是這種可信賴的繼承關系建立在合理的封裝的基礎上時,無疑會獲得很好的複用性。這才是面向對象能給我們帶來的便利,當然也是我們做這些工作最期望的達到的結果。試想一下,如果我們封裝了一個很爛的類,那無疑是一件令人崩潰的事情。我想程式中沒有比這個更糟糕的了。        最後要說下多态。我覺的這真的是一件很神奇的事情,難道不是嗎?一個類可以根據運作時的需要動态的選擇一個适合自己的方法執行。這對于程式員來說無疑是一件非常值得興奮的事情。當然這需要程式員去做函數重載或者運用虛函數進行覆寫,或者兩種方法都用。即便這樣我想這也是面向對象程式設計工作中一件值得驕傲的事情。合理的運用重載和virtual居然會給我們帶來如何多的便利。

本文參照了:http://www.cnblogs.com/vace/archive/2011/04/14/2015754.html

                     http://wenku.baidu.com/view/8d961beb856a561252d36fb1.html