C 中class與struct的區別

時間 2022-02-15 00:45:02

1樓:吉祥二進位制

1、預設的繼承訪問許可權。struct是public的,class是private的。比如如下的**:

struct a

;struct b : a

;這個時候b是public繼承a的。如果都將上面的struct改成class,那麼b是private繼承a的。這就是預設的繼承訪問許可權。所以在平時寫類繼承的時候,通常會這樣寫:

struct b : public a

就是為了指明是public繼承,而不是用預設的private繼承。當然,到底預設是public繼承還是private繼承,取決於子類而不是基類。我的意思是,struct可以繼承class,同樣class也可以繼承struct,那麼預設的繼承訪問許可權是看子類到底是用的struct還是class。

如下:struct a{};

class b : a{};    //private繼承

struct c : b{};  //public繼承

2、struct作為資料結構的實現體,它預設的資料訪問控制是public的,而class作為物件的實現體,它預設的成員變數訪問控制是private的。

3、class」這個關鍵字還用於定義模板引數,就像「typename」。但關鍵字「struct」不用於定義模板引數。

4、還是上面所說的,c++中的struct是對c中的struct的擴充,既然是擴充,那麼它就要相容過去c中struct應有的所有特性。例如你可以這樣寫:

struct a    //定義一個struct

;a a=;  //定義時直接賦值

也就是說struct可以在定義的時候用{}賦初值。

如上面的struct中加入一個建構函式,struct也不能用{}賦初值了。以{}的方式來賦初值,只是用一個初始化列表來對資料進行按順序的初始化,如上面如果寫成a a=;則c1,n2被初始化,而db3沒有。這樣簡單的copy操作,只能發生在簡單的資料結構上,而不應該放在物件上。

加入一個建構函式或是一個虛擬函式會使struct更體現出一種物件的特性,而使此{}操作不再有效。事實上,是因為加入這樣的函式,使得類的內部結構發生了變化。

到這裡,可以發現即使是struct想用{}來賦初值,它也必須滿足很多的約束條件,這些條件實際上就是讓struct更體現出一種資料機構而不是類的特性。那為什麼在上面僅僅將struct改成class,{}就不能用了呢?其實問題恰巧是之前所講的——訪問控制!

如果將struct改成class的時候,訪問控制由public變為private了,那當然就不能用{}來賦初值了。加上一個public,你會發現,class也是能用{}的,和struct毫無區別!

從上面的區別,可以看出,struct更適合看成是一個資料結構的實現體,class更適合看成是一個物件的實現體。

2樓:匿名使用者

保留struct主要是為了相容c,

他倆的不同只是struct預設所有屬性和方法是public的,而class預設是private,只有這一點不同

但是人們一般把有方法的結構定義成class,而只有資料,沒有方法的結構定義成struct,但是這也只是程式設計師們的愛好

3樓:女兒飛

基本沒區別

區別就是class不宣告為public是就預設為private

而struct不宣告為private就預設為public

4樓:丨花自飄零丨

最重要一點:class可以實現對資料的保護(它有private,protect);

另外它還可以包含函式...

c++中的struct和class的區別是什麼??

5樓:匿名使用者

在c++中都表示類,唯一的區別是預設的訪問許可權不同。struct預設的訪問許可權是public,class預設的訪問許可權是private。

測試**:

#include

struct a

};class b

};int main()

6樓:匿名使用者

區別就是:struct如果不寫訪問許可權的話,預設是public。而class預設是private,除此之外兩者完全相同。

7樓:magic_旭

區別主要在於二者的訪問許可權,struct的預設訪問許可權是public,而已class則是private,另外struct不能像class那樣繼承

8樓:天好好藍

現在的c++編譯器,會將struct轉為class解釋,所以這個層面沒有區別。

struct預設成員訪問許可權public,class為private

c語言中class和struct的區別是什麼?

9樓:匿名使用者

struct更適合看成是一個資料結構的實現體,class更適合看成是一個物件的實現體。

struct沒有繼承,沒有封裝,要說封裝只有初步封裝。而class把資料,介面可以以三種型別封裝,private,public,protected;還可以繼承和派生。

它們都可以提供自己的介面函式,建構函式。一個類可以由結構繼承而來。struct只能叫做資料的集合,外部可以任意訪問,但是類就完成了封裝,維護了資料安全,這就是物件導向的理念。

class裡可以定義私有成員和保護成員而結構體裡所有的成員,均為公用成員

struct想用{}來賦初值,它也必須滿足很多的約束條件,這些條件實際上就是讓struct更體現出一種資料機構而不是類的特性。那為什麼在上面僅僅將struct改成class,{}就不能用了呢?其實問題恰巧是之前所講的——訪問控制!

如果將struct改成class的時候,訪問控制由public變為private了,那當然就不能用{}來賦初值了。加上一個public,class也是能用{}的,和struct毫無區別。

從上面的區別,可以看出,struct更適合看成是一個資料結構的實現體,class更適合看成是一個物件的實現體。

10樓:柴語

struct沒有繼承,沒有封裝,封裝只有初步得封裝。而class把資料介面以三種型別封裝,private,public,protected,還可以繼承和派生。但是它們都可以提供自己介面函式,建構函式。

一個類可以由結構繼承而來。struct只能叫做資料集合,外部可以任意訪問,但是類就完成了封裝,維護了資料的安全

struct的成員預設許可權是public,而class的成員預設許可權是private

struct的預設繼承方式為public,而class的預設繼承為private

使用上來說沒有太大的區別,不過一個是物件導向的語言,使用更加的方便和簡潔

class和struct如果定義了建構函式的話,都不能用大括號進行初始化

如果沒有定義建構函式,struct可以用大括號初始化

如果沒有定義建構函式,且所有成員變數全是public的話,可以用大括號初始化

struct和class的區別

11樓:久落江邊

首先,討論這個問題應該僅從語法上討論,如果討論不同人之間程式設計風格上的差異,那這個問題是沒有答案的。畢竟不同的人偏好不同。

從語法上,在c++中(只討論c++中)。class和struct做型別定義時只有兩點區別:

(一)預設繼承許可權。如果不明確指定,來自class的繼承按照private繼承處理,來自struct的繼承按照public繼承處理;

(二)成員的預設訪問許可權。class的成員預設是private許可權,struct預設是public許可權。

除了這兩點,class和struct基本就是一個東西。語法上沒有任何其它區別。

不能因為學過c就總覺得連c++中struct和class都區別很大,下面列舉的說明可能比較無聊,因為struct和class本來就是基本一樣的東西,無需多說。但這些說明可能有助於澄清一些常見的關於struct和class的錯誤認識:

(1)都可以有成員函式;包括各類建構函式,解構函式,過載的運算子,友元類,友元結構,友元函式,虛擬函式,純虛擬函式,靜態函式;

(2)都可以有一大堆public/private/protected修飾符在裡邊;

(3)雖然這種風格不再被提倡,但語法上二者都可以使用大括號的方式初始化:aa=;不管a是個struct還是個class,前提是這個類/結構足夠簡單,比如所有的成員都是public的,所有的成員都是簡單型別,沒有顯式宣告的建構函式。

(4)都可以進行復雜的繼承甚至多重繼承,一個struct可以繼承自一個class,反之亦可;一個struct可以同時繼承5個class和5個struct,雖然這樣做不太好。

(5)如果說class的設計需要注意oo的原則和風格,那麼沒任何理由說設計struct就不需要注意。

(6)再次說明,以上所有說法都是指在c++語言中,至於在c裡的情況,c裡是根本沒有「class」,而c的struct從根本上也只是個包裝資料的語法機制。

最後,作為語言的兩個關鍵字,除去定義型別時有上述區別之外,另外還有一點點:「class」這個關鍵字還用於定義模板引數,就像「typename」。但關鍵字「struct」不用於定義模板引數。

12樓:費鴻波沒弄

問的人太多,乾脆整理個faq吧。

首先,討論這個問題應該僅從語法上討論,如果討論不同人之間程式設計風格上的差異,那這個問題是沒有答案的。畢竟不同的人偏好不同。

從語法上,在c++中(只討論c++中)。class和struct做型別定義時只有兩點區別:

(一)預設繼承許可權。如果不明確指定,來自class的繼承按照private繼承處理,來自struct的繼承按照public繼承處理;

(二)成員的預設訪問許可權。class的成員預設是private許可權,struct預設是public許可權。

除了這兩點,class和struct基本就是一個東西。語法上沒有任何其它區別。

不能因為學過c就總覺得連c++中struct和class都區別很大,下面列舉的說明可能比較無聊,因為struct和class本來就是基本一樣的東西,無需多說。但這些說明可能有助於澄清一些常見的關於struct和class的錯誤認識:

(1)都可以有成員函式;包括各類建構函式,解構函式,過載的運算子,友元類,友元結構,友元函式,虛擬函式,純虛擬函式,靜態函式;

(2)都可以有一大堆public/private/protected修飾符在裡邊;

(3)雖然這種風格不再被提倡,但語法上二者都可以使用大括號的方式初始化:aa=;不管a是個struct還是個class,前提是這個類/結構足夠簡單,比如所有的成員都是public的,所有的成員都是簡單型別,沒有顯式宣告的建構函式。

(4)都可以進行復雜的繼承甚至多重繼承,一個struct可以繼承自一個class,反之亦可;一個struct可以同時繼承5個class和5個struct,雖然這樣做不太好。

(5)如果說class的設計需要注意oo的原則和風格,那麼沒任何理由說設計struct就不需要注意。

(6)再次說明,以上所有說法都是指在c++語言中,至於在c裡的情況,c裡是根本沒有「class」,而c的struct從根本上也只是個包裝資料的語法機制。

最後,作為語言的兩個關鍵字,除去定義型別時有上述區別之外,另外還有一點點:「class」這個關鍵字還用於定義模板引數,就像「typename」。但關鍵字「struct」不用於定義模板引數。

c中的class是什麼

呼叫的樣式名 其實就是style 的東西 小例子 c 中的class是定義類的關鍵字,一樓說的是html中的class,那是引用樣式的屬性 class 類 中 class a 定義一個a類 html 裡面的 如一個button控制元件 在html裡面的class就是 css樣式表類,呼叫css檔案裡...

在C中STRUCT是怎麼用的,又有代表什麼意思啊

你的寫法沒錯,只是少了tostring console write myip.b1.tostring myip.b2.tostring 這樣就對了 struct是結構體,他的定義和使用與class類很像,不過他們是有區別的 struct是值型別,class是引用型別給你個例子 public stru...

jQuery中如何選擇多個class的值

jq可以支援多選擇器 比如 123 通過each就可以獲取到被選擇的選擇器的內容。 萬般亦無味 classname1,classname2 用逗號就行了 汐日南莘 1 依次過濾 good filter list filter card 2 屬性選擇 class good list card 此處 順...