2011-01-24 28 views
7

struct默認爲公開,class默認爲私有。每次我使用struct而不是class時,我會殺死一隻小貓嗎?

讓我們以Ogre3D爲例;如果我用struct更改所有class事件,它會編譯(我猜),引擎和以前一樣工作。

如果我是正確的,編譯後的代碼是完全和以前一樣,因爲它,它不是在運行時檢查是唯一,它檢查是否有私人/受保護的方法被稱爲編譯器。

如果我還是對的,class只是一個關鍵字,只是讓其可愛的眼睛和乞討「請封裝你的數據:你可以節省一隻小貓」,而私人/保護的範圍仍然上漲給用戶。

我知道我聽起來有點跛或反叛毫無來由(類似「C是KISS的傢伙,不要去」

回到問題:什麼是標準說一下structclass,而這之間的差別不大生成機器碼?爲什麼添加關鍵字和嘗試,而這是完全沒有,那麼執行呢?是不是由Java的影響?

+6

實際上恰恰相反。每當你使用「結構」就足夠的'class'關鍵字時,你就會殺死一隻小貓。不,自從C++首次發佈以來,並沒有受到Java的影響。 – 2011-01-24 17:28:57

+1

C++不是一種嚴格的OO語言,它是一種多範式語言,不僅支持面向對象的操作,因此它不試圖對開發者實施面向對象的概念。如果他們願意的話,開發者可以使用OO風格。請參閱C++標記的信息條目http://stackoverflow.com/tags/c%2b%2b/info – Glen 2011-01-24 17:28:59

+0

有更多的答案在這個問題在http://stackoverflow.com/questions/4090794/c-when-should -i-use-structs-instead-of-class-and-where-the-the-speed-differe。 – 2011-01-24 17:30:05

回答

2

structclass之間的區別僅僅是基地的默認訪問級別和屬性,以及訪問級別僅在編譯時驗證,因此你可能會得到一些圖書館編輯頁眉和更改所有classstruct訪問內部細節。

不要

編譯器不需要生成完全相同的代碼,如果你更改默認的訪問說明符。具體而言,這兩個類可能或不具有相同的內存佈局,根據不同的編譯器:

struct a { 
    int a; 
private: 
    int b: 
}; 
class b { 
    int a; 
public: 
    int b; 
}; 

的原因是,該標準要求所有成員屬性在內存中相同的訪問預選賽中增加位置進行佈局。編譯器是允許的(我不知道任何這樣做,但由於這不是必需的,它可能會在下一個版本中發生改變),可以對來自不同訪問塊的字段進行重新排序。編譯器可以決定公共屬性是第一位的,而私人位於對象的末尾,這意味着兩個類中的字段ab的位置將被交換。

2

沒有其他方面的差異,但默認訪問。打動與所謂的「OO模型」程序員事實上,你甚至可以寫例如:

class X; 

X* pX; 

struct X {}; 

它必須編譯。

+0

儘管MSVC將會盡力。 – 2011-01-24 17:56:11

1

在C++結構和類之間的唯一區別是,類具有默認私有成員和基類。通常將class更改爲struct不應影響生成的機器代碼。

+0

「默認的基類」?你什麼意思?結構可以有一個基類,類也是這樣,但在任何一種情況下都必須明確指定基類。 – 2011-01-24 17:30:29

4

其實,classstruct都在編譯期進行檢查。唯一的區別是,您沒有明確指定訪問權限的成員的默認值是public(對於struct)還是private(對於class)。否則,它們會產生完全相同的對象。如果您明確指定了所有的訪問控制,則可以使用任意一個,它們將相同。

5

這個標準根本沒有說明關於生成機器代碼。

struct被保留下來,使遷移舊的C代碼更容易。通常情況下,C++程序員將其用於類POD結構。

2

不可以。structclass之間的區別僅限於其成員和繼承的默認訪問權限。兩者都是public,對於structprivate對於class

1

不,它絕對不受Java的影響。檢查時間表。 :)

即使它不會做的比控制默認的知名度,免得仍然是相當有意義的。它在某種程度上成爲一個可用的語義,可以讓你說出你的意思。這個想法,如果你使用struct,那麼你可能在一個更老的範例中工作,公衆可見性是通常會被想到的唯一類型,如果你使用class,你會考慮更多的OO在私人知名度更高的條款 - 我不知道,對我有意義的傢伙。

-1

struct因爲遺留原因而存在,就是這樣。如果你使用struct而不是class,或者反之亦然,你不會殺死一隻小貓或任何東西 - 它們實際上是同樣的東西,但關鍵字和默認值略有不同。

0

嗯,現在......如果說你把這樣的程序進入公共空間,這樣說OSS,人們會朝你扔石頭;)

struct關鍵字是類C遺產。是的,唯一的區別(據我記憶)是關於成員被保護的默認行爲。

Bjarne的Stroustrup的在 「The C++程序設計語言」:

根據定義,一個結構是其中成員默認都是公共的類;這是

的struct {...

僅僅是速記

S級{市民:...

但OO模型是遠不止封裝。它增加了諸如繼承和成員函數之類的東西。

1

有人試圖使用'結構'關鍵字來表示各種事情。例如,有些人嘗試使用struct來指定POD-ness,或者只使用數據類(只有公共成員變量且沒有函數的類)。

在我看來,這是一個嚴重的錯誤,我聽說的所有理由都是有缺陷的。首先,像struct這樣的關鍵字不足以表達他們試圖用它來記錄的條件。由於關鍵字實際上並不意味着特定的任何人或者接受這一點,或者試圖斷言他們自己的意思。關於什麼struct應該意味着在它的代碼中記錄它們中的任何一個有太多不相容的意見。您希望儘可能清楚地記錄「這個對象必須始終是POD」,而不是依賴難以記憶的模糊團隊標準細節。因此,爲了記錄這樣的事情,唯一充分的事情,誠實地說,是// This object must always be a POD。這是清楚的,簡單的,不能被任何知道POD是什麼的人誤解,這是明確的。

我聽說過使用關鍵字class而不是struct的最佳參數是您應該更喜歡私人訪問公共訪問權限,只顯​​示哪些是必要的。換句話說,「默認」類型的繼承和訪問暴露應該是私有的,直到顯示更多訪問是必要的。我同意這個觀點,但我不同意有必要使用struct關鍵字來堅持這個原則。

無論人們決定什麼是相當武斷的。之後的理由可以被認定爲決定,但我發現選擇其中一個的人不容易說服。我從'class'切換到'struct',因爲我閱讀了太多關於現代C++和增強代碼的書籍;你很少會在其中看到'class'關鍵字。說實話,沒關係;遵循當時所在團隊的標準。在我看來,添加一個基本上沒有意義的關鍵字是一個錯誤。

編輯:雖然,我不得不說,我不喜歡使用class的另一個原因是它意味着太多的東西,即使它也沒有什麼特別的意義。例如,您可以在模板參數規範中使用class而不是typename。即使您使用關鍵字class,您也可以傳遞任何類型的關鍵字,而不一定是任何類別的關鍵字(如int)。我喜歡使用關鍵字class的唯一時間是它實際上確實意味着什麼,以及您實際上絕對必須:指定模板模板參數。

相關問題