C++中已經有面向對象的概念,那struct還有啥存在的意圖?


我接下來的回答將很大部分會從語言的層面來解析,而非單純的語意。

首先,題主你的出發點剛好是屬於你以現在的時間來看C++的面向對象,然而C++語言的開始卻是以C開發,擴充面向對象概念。而C++吸引的第一批開發者無疑是以C程序員,為了讓C程序員找到他們熟悉的語法,並且平穩的過渡,struct是一個很不錯的切入口。如果你拋棄了struct,只是class,那麼C程序員會很驚訝於他們熟悉的struct去了哪裡,同時C++兼容C代碼這點兒也完全拋棄,因為在C++中,struct都沒有了,談何兼容C語言的struct呢?而C++一定需要引入class這個關鍵字嗎?需要嗎?不一定需要,但是引入進來就遠遠包括了其關鍵字本身的語言含義了。雖然class默認的成員許可權是private,默認繼承是private繼承等,這和struct默認的public許可權不同,但是如果我給你下面代碼:

Keyword X {
public:
//...
protected:
//...
private:
//...
};

在這裡的Keyword,你完全可以是struct與class,這裡沒有任何不同。而且我可以透露的是在C++編譯器實現裡面,我們也完全把struct與class同等對待(只是需要在Diagnostic階段進行許可權驗證),保持著一致性。而這種一致性的反例就是extern和static,這兩個關鍵字會造成存儲空間聲明的矛盾性。而C++引入class更大的意義在於你封裝與繼承的哲學,如有一個抽象的類,含有虛基類,你是更願意想像的出是virtual base class還是virtual base struct呢?

而C++有沒有class能做到,struct做不到的呢?當然這都是吹毛求疵的地方,那就是模板聲明。

template &,這裡不能用struct,當然你也可以找到的理由:因為C沒有模板。

而C++的struct有沒有坑呢?尤其是你想兼容C的struct的時候?C++兼容C其實兼容的很雞肋(但是C++也已經做到了兼容C的極致),C++保證的是一個許可權的Data Members按順序,沒有保證不同訪問許可權的Data Members按順序擺放,所以你想要做到兼容,你需要注意這一點兒。

所以,C++的struct有存在的意義,引入class也有其意圖,而這兩者都是針對面向對象概念,只是前者可以理解為C-&>C++的踏板石,而後者更在於其封裝與繼承的哲學意味更濃烈。


假如 C++ 不認識 struct,那麼

#include & // 定義了 struct div_t 等等

#include & // 定義了 struct tm 等等

都會造成編譯錯誤。

更別說 dirent.h, netinet/in.h, netdb.h, sys/time.h 等等一大票系統庫了。


  • 和C代碼兼容
  • 一種默認訪問許可權是public的class,要實現POD(Plain Old Data)的時候struct更好用

struct和class兩者的唯一區別就是一個的默認訪問許可權是public一個是private,兩者都可以有成員函數,都可以有public, protected, private訪問許可權,都可以繼承另一個class或struct


簡單的一句話解答,因為C++是C的超集。可以理解成加入OO要素的強化版C。

再說句題外話,有個毀滅程序猿社區的話題就是C++對於C究竟是進化還是劣化。。。所以千萬不要深究。。。。


簡單點 ,向下兼容。

class OO 庫裡面 你找找看 有用的到的地方不


C++再牛逼也不能不認爹。。。摺疊我吧。。。


等你想著在java中直接保存一些內存數據時,你就想到struct的好和面向對象的壞了


要和寫的C代碼兼容啊,不然以前的C代碼豈不是沒法用了?


struct默認訪問許可權public class默認訪問許可權private.

寫庫的時候,有些屬於庫內部細節,對數據的聚合...並且數據會經常取用,我喜歡用struct保存數據.省的寫get set函數...累


推薦閱讀:

Python模塊如何安裝 並確認模塊已經安裝好?
在編程中有沒有巧妙運用數學知識解決過問題?
如何看待波格契夫2015年5月左右研發病毒入侵中國進行比特幣敲詐?
程序員從接近底層的語言(如 C)學起,比起「不繞彎子」,直接從高級語言(如 PHP)開始,這兩種觀念之間的優劣對比是怎樣的?
2GB的mat文件,裡面是一個大型矩陣,matlab載入到內存需要23秒。現在用C++,有哪些辦法可以提高載入速度?

TAG:編程語言 | 編程 | C編程語言 | 面向對象編程 | C |