【zz】C++中struct與class的區別

轉載來源:http://blog.sina.com.cn/s/blog_48f587a80100k630.htmlhtml

C++中的struct對C中的struct進行了擴充,它已經再也不只是一個包含不一樣數據類型的數據結構了,它已經獲取了太多的功能。
struct能包含成員函數嗎? 能!
struct能繼承嗎? 能!!
struct能實現多態嗎? 能!!!
 算法

既然這些它都能實現,那它和class還能有什麼區別?數據結構

最本質的一個區別就是默認的訪問控制: ide

默認的繼承訪問權限函數

struct是public的class是private的
你能夠寫以下的代碼:
struct A
{
  char a;
};
struct B : A
{
  char b;
};
spa

這個時候B是public繼承A的。htm

若是都將上面的struct改爲class,那麼B是private繼承A的。這就是默認的繼承訪問權限。 對象

因此咱們在平時寫類繼承的時候,一般會這樣寫:
class B : public Ablog

就是爲了指明是public繼承,而不是用默認的private繼承。繼承

 

固然,到底默認是public繼承仍是private繼承取決於子類而不是基類

個人意思是,struct能夠繼承class,一樣class也能夠繼承struct,那麼默認的繼承訪問權限是看子類究竟是用的struct仍是class。以下:

 

struct A{};class B : A{}; //private繼承
struct C : B{}; //public繼承

 

struct做爲數據結構的實現體,它默認的數據訪問控制是public的,而class做爲對象的實現體,它默認的成員變量訪問控制是private的

 

我依舊強調struct是一種數據結構的實現體,雖然它是能夠像class同樣的用。我依舊將struct裏的變量叫數據,class內的變量叫成員,雖然它們並沒有區別。


究竟是用struct仍是class,徹底看我的的喜愛,你能夠將程序裏全部的class所有替換成struct,它依舊能夠很正常的運行。但我給出的最好建議,仍是:當你以爲你要作的更像是一種數據結構的話,那麼用struct,若是你要作的更像是一種對象的話,那麼用class。 

固然,我在這裏還要強調一點的就是,對於訪問控制,應該在程序裏明確的指出,而不是依靠默認,這是一個良好的習慣,也讓你的代碼更具可讀性。 

說到這裏,不少了解的人或許都認爲這個話題能夠結束了,由於他們知道struct和class的「惟一」區別就是訪問控制。不少文獻上也確實只提到這一個區別。 

但我上面卻沒有用「惟一」,而是說的「最本質」,那是由於,它們確實還有另外一個區別,雖然那個區別咱們平時可能不多涉及。

那就是:「class」這個關鍵字還用於定義模板參數,就像「typename」。但關鍵字「struct」不用於定義模板參數。這一點在Stanley B.Lippman寫的Inside the C++ Object Model有過說明。 

問題討論到這裏,基本上應該能夠結束了。但有人曾說過,他還發現過其餘的「區別」,那麼,讓咱們來看看,這究竟是不是又一個區別。仍是上面所說的,C++中的struct是對C中的struct的擴充,既然是擴充,那麼它就要兼容過去C中struct應有的全部特性。例如你能夠這樣寫: 

struct A //定義一個struct
{
   char c1;
   int n2;
   double db3;
};
A a={'p', 7, 3.1415926}; //定義時直接賦值
 

也就是說struct能夠在定義的時候用{}賦初值。那麼問題來了,class行不行呢?將上面的struct改爲class,試試看。報錯!噢~因而那人跳出來講,他又找到了一個區別。咱們仔細看看,這真的又是一個區別嗎? 

你試着向上面的struct中加入一個構造函數(或虛函數),你會發現什麼?
對,struct也不能用{}賦初值了
的確,以{}的方式來賦初值,只是用一個初始化列表來對數據進行按順序的初始化,如上面若是寫成A a={'p',7};則c1,n2被初始化,而db3沒有。這樣簡單的copy操做,只能發生在簡單的數據結構上,而不該該放在對象上。加入一個構造函數或是一個虛函數會使struct更體現出一種對象的特性,而使此{}操做再也不有效。 

事實上,是由於加入這樣的函數,使得類的內部結構發生了變化。而加入一個普通的成員函數呢?你會發現{}依舊可用。其實你能夠將普通的函數理解成對數據結構的一種算法,這並不打破它數據結構的特性。 

那麼,看到這裏,咱們發現即便是struct想用{}來賦初值,它也必須知足不少的約束條件,這些條件實際上就是讓struct更體現出一種數據機構而不是類的特性。 

那爲何咱們在上面僅僅將struct改爲class,{}就不能用了呢?

其實問題恰巧是咱們以前所講的——訪問控制!你看看,咱們忘記了什麼?對,將struct改爲class的時候,訪問控制由public變爲private了,那固然就不能用{}來賦初值了。加上一個public,你會發現,class也是能用{}的,和struct毫無區別!!! 

作個總結,從上面的區別,咱們能夠看出,struct更適合當作是一個數據結構的實現體,class更適合當作是一個對象的實現體。

 

 

下面有個強評論

結構具備如下特色:

結構是值類型,而類是引用類型。
向方法傳遞結構時,結構是經過傳值方式傳遞的,而不是做爲引用傳遞的。
與類不一樣,結構的實例化能夠不使用 new 運算符。
結構能夠聲明構造函數,但它們必須帶參數。
一個結構不能從另外一個結構或類繼承,並且不能做爲一個類的基。
全部結構都直接繼承自 System.ValueType,後者繼承自 System.Object。
結構能夠實現接口。
相關文章
相關標籤/搜索