c語言結構體和類之間的區別舉例?
一、C和C++中結構體的不同
(1)C語言中的結構體不能為空,否則會報錯
C語言中要求一個結構或聯合至少有一個成員。C語言中,空結構體的大小為0,而C++中空結構體(屬于空類)的大小為1
(2)C語言中的結構體只涉及到數據結構,而不涉及到算法
在C語言中數據結構和算法是分離的。換句話說就是C語言中的結構體只能定義成員變量,但是不能定義成員函數
然而在C++中既可以定義成員變量又可以定義成員函數, C++中的結構體和類體現了數據結構和算法的結合
不過雖然C語言的結構體中不能定義成員函數,但是卻可以定義函數指針,不過函數指針本質上不是函數而是指針,所以總的來說C語言中的結構體只是一個復雜數據類型 ,只能定義成員變量,不能定義成員函數,不能用于面向對象編程
(3)C語言中定義結構變量時不可省略struct關鍵字,C++可以省略
在C語言中使用struct定義的結構體中在定義變量的時候,struct不能省略
但是在C++之中則可以省略struct
二、C++中結構體與類的區別
C++中的struct對C中的struct進行了擴充,它已經不再只是一個包含不同數據類型的數據結構了,它已經獲取了太多的功能
struct能包含成員函數嗎? 能!
struct能繼承嗎? 能!!
struct能實現多態嗎? 能!!!
既然這些它都能實現,那它和Class還能有什么區別?
最本質的一個區別就是默認的訪問控制:
默認的繼承訪問權限:struct是public的,class是private的
C++中,不使用結構體絲毫不會影響程序的表達能力。C++之所以要引入結構體,是為了保持和C程序的兼容性
但有時仍會在C++中使用結構體,是因為可以使用結構體將不同類型數據組成整體,方便于保存數據(若用類來保存,因類中成員默認為私有,還要為每個數據成員特定函數來讀取和改寫各個屬性,比較麻煩)
struct可以繼承class,同樣class也可以繼承struct
struct是一種數據結構的實現體,雖然它是可以像class一樣的用。我依舊將struct里的變量叫數據,class內的變量叫成員,雖然它們并無區別
三、總結
概念:class和struct的語法基本相同,從聲明到使用,都很相似,但是struct的約束要比class多,理論上,struct能做到的class都能做到,但class能做到的stuct卻不一定做的到
類型:struct是值類型,class是引用類型,因此它們具有所有值類型和引用類型之間的差異
效率:由于堆棧的執行效率要比堆的執行效率高,但是堆棧資源卻很有限,不適合處理邏輯復雜的大對象,因此struct常用來處理作為基類型對待的小對象,而class來處理某個商業邏輯
關系:struct不僅能繼承也能被繼承 ,而且可以實現接口,不過Class可以完全擴展。內部結構有區別,struct只能添加帶參的構造函數,不能使用abstract和protected等修飾符,不能初始化實例字段