在c++中,我們把傳統的c風格的struct叫做pod(plain old data)物件。一般來說,pod物件應該滿足如下特性。
對於pod型別t的物件,不管這個物件是否擁有型別t的有效值,如果將該物件的底層位元組序列複製到乙個字元陣列(或者無符號字元陣列)中,再將其複製回物件,那麼該物件的值與原始值一樣。
對於任意的pod型別t,如果兩個t指標分別指向兩個不同的物件obj1和obj2,如果用memcpy庫函式把obj1的值複製到obj2,那麼obj2將擁有與obj1相同的值。
簡言之,針對pod物件,其二進位制內容是可以隨便複製的,在任何地方,只要其二進位制內容在,就能還原出正確無誤的pod物件。對於任何pod物件,都可以使用memset()函式或者其他類似的記憶體初始化函式。
現在動手
為了更好地理解pod物件的含義,我們體驗一下如何採用mem***()函式對pod物件進行儲存與還原。
編寫win32控制台程式,主程式如下:
【程式 4-3】使用mem***函式操作pod物件
01#include"stdafx.h"02#include
03 04//person為pod
05structperson
06;
11 12voidprint(person*p)
13 16
17intmain()
18;
21personp3=;
22print(&p1);
23print(&p3);
24 25//將p1轉儲為char陣列
26charbytes[sizeof(person)];
27memcpy(bytes,&p1,sizeof(person));
28 29personp2;
30memset(&p2,0,sizeof(person));
31print(&p2);
32 33//將char陣列還原為p2
34memcpy(&p2,bytes,sizeof(person));
35print(&p2);
36 37//將p3複製至p2
38memcpy(&p2,&p3,sizeof(person));
39print(&p2);
40 41return0;42}
結果輸出如圖4-5所示。
因此,對於pod物件,我們完全可以大膽地使用mem***函式進行操作,從而完成對物件複製、賦值的目的。但是注意,對於多型類的物件,要慎重考慮使用memset,因為它會同時修改vtable指標!vtable指標是多型的根本所在,弄亂了物件的虛表指標,很有可能會釀成大錯。
以上摘自《把脈vc++》
如果你想與我交流,如下鏈結加我為好友:
何為物件導向?
概述 所謂物件,是乙個名詞,任何乙個事物都可以稱為物件,其有對應的屬性 事物的特性 和行為 事物能幹什麼 物件導向思想,就是面向事物的程式設計思想。1,面向過程 談及物件導向,不得不談的就是面向過程。物件導向是針對名詞而言,面向過程則是針對行為動作的處理。面向過程是一種以過程為中心的程式設計思想。所...
深入解析Pod物件
kubectl get pods 檢視預設ns內的pod kubectl get pods n ns 檢視指定ns內的pod kubectl get pods o wide kubectl get pods o yaml kubectl exec it mypod bin sh kubectl ex...
物件導向何為多型?
前言 物件導向程式設計過程中少不了 1 封裝 2 繼承 3 多型 三個特性,其中多型又是怎麼理解的呢?擯棄教科書式回答,多型語義是多種形態的縮寫,在物件導向程式設計的思想中,萬物皆物件 那麼我們知道,物件的行為和屬性由模板類定義,而通過模板類 class or inte ce 我們可以控制物件在ru...