struct 是乙個簡單的型別,因為它是乙個值型別,struct又是乙個複雜的型別,因為它裡面又可以巢狀很多的其它型別,裡面的其他型別又可以包括比如struct之類的型別,所以說struct這個東西還是乙個很有趣的東西。
(首先宣告:環境vs2010 cpp檔案,推論以這個編譯器為基礎)
1 值型別和引用型別
這個乙個老生常談,面試必問,好像不問你就顯不出面試官的水平,也顯不出面試者的水平,反正5年了吧,我所面試的每次都會被問到這個問題,然後我就說struct是值型別,class是引用型別。
(停!stop!說的是毛啊,這誰都知道,誰都知道的你唧唧歪歪什麼,我上高中,哦不,上大學大一的時候課本上就寫了,struct是值型別,class是引用型別,說點有用的!)
好,說點有用的,(以下是引用clr via c# 那本書的內容)
值型別和引用型別都需要在堆疊上分配,對值型別的操作是乙個複製過程,複製完是兩個東西,引用型別是相當於指標,所有的都指向乙個東西,不管你引用幾次,他們最終都是乙個東西,順便說一句,裝箱和拆箱,裝箱是先分配乙個記憶體,然後把值型別放進去,這時候的值型別的生命週期已經變了, 隨著裝箱的生命週期而變動,拆箱是進行乙個複製的過程,複製值,然後銷毀記憶體,雖然都耗費效能,但是,拆箱要比裝箱低得多!over
說值型別和引用型別也很無趣,我覺得乙個程式設計師,拉風的程式設計師,誰會刻意的去玩命的裝箱拆箱,扯淡呢!(個人意見)
2 struct 的內部的一些問題
簡單的乙個stuct
structa;void
main()
結果顯示1,為何他是1,不應該是空嘛?
(之所以強調是vs2010,因為在c檔案中編譯不通過,在linux下c檔案和cpp檔案中顯示的也不一樣,所以一開始就強調環境)
因為乙個空結構,即使沒有內部成員,但是必須在記憶體上有所體現,不然在取位址的時候就出問題了
繼續,
structaa();
~a;};
void
main()
a()是預設建構函式,即使你不寫,他也是隱藏存在的,除了我自己寫的,還有乙個a(const a&) 這個是拷貝建構函式
參考這個,我不是很了解,因為確實沒怎麼用過,悲催
3 再換個話題,struct的對齊方式
structsa ;
struct
sb ;
void
main()
結果 8 16,
long型別是4位元組,char是1位元組,乙個stuct以最大的長度作為對齊方式,也就是擺放的其實是這樣
1---
----
char佔了1個,後面補充了沒用的三個,long佔四個,所以整個就是8個
假如是這樣,
structsa ;
sizeof sa還是8個,因為2個char連續,char a後面有三個位元組,char c用乙個就夠了,還空出來兩個,假如是這樣
structsa ;
long double 佔8個,char 佔1個 int佔4個,(剩餘3個位元組)int 佔4個,空間不夠了,int d 會另起一行,而不是d在c後面填充乙個,第二行填充三個,
14---
4----
8
structsa ;
是這樣麼個擺放方式!以上兩段**的sizeof是一樣的
sb裡,也一樣char佔四個,int佔四個,sa佔8個,加起來是16個
然後,又來了乙個問題,sa裡的八個是整體算八個,還是拆開為char 和long 各自佔4個總共8個呢!
做個測試:
#include#includestruct
sa ;
struct
sb ;
void
main()
struct中假設sa整體佔八個,那麼3個char+乙個int+1個char總共是8個,sa佔8個,那就應該是16!
測試結果是20,也就是3個char 佔4個,乙個int 佔4個,乙個char佔4個,sa佔8個!也就是說 sa並不是整體算八個,而是相當於這樣的擺放方式
structsb ;
然後問題又來了!
按照這個擺放方式,應該是
111-(char a char b char c)
4 (int d)
11-- (chare char a)
4 (long b)
才對的啊,結果應該還是16才對!
因為sa 是乙個整體,雖然可以寫成那種模式,但是他裡面的元素要另起一行,不和其他的外部元素共用!
111-(char a char b char c)
4 (int d)
1--- (char e )
1--- ( char a)
4 (long b)
(個人意見。。。。。)
C struct與class的區別
c 中的struct對c中的struct進行了擴充,它不再只是乙個包含不同資料型別的資料結構,它已經獲取了太多的功能。struct能包含成員函式,struct能繼承,struct能實現多型。1 關於使用大括號初始化 如果定義了建構函式,class和struct都不能用大括號進行初始化。如果沒有定義建...
C struct與class 的區別
c 中的struct對c中的struct進行了擴充,考慮到 對c相容 就將struct保留了下來,並做了一些擴充套件使其更適合物件導向。它已經不再只是乙個包含不同資料型別的資料結構了,它已經獲取了太多的功能。1.預設訪問控制不同 struct 與 class最本質的乙個區別就是預設的訪問控制。在預設...
C struct與class的區別
來自 c 中的struct對c中的struct進行了擴充,它已經不再只是乙個包含不同資料型別的資料結構了,它已經獲取了太多的功能。struct能包含成員函式嗎?能!struct能繼承嗎?能!struct能實現多型嗎?能!既然這些它都能實現,那它和class還能有什麼區別?最本質的乙個區別就是預設的訪...