C++11的POD型別
POD型別的定義
必須是平凡的和有標準佈局的。
平凡的建構函式與解構函式是預設的,不起任何作用的。如果自定義了,那麼需要宣告為default
型別的。
使用std::is_trivial
進行判別。
標準佈局必須是有以下幾個屬性:
- 所有的非靜態成員有相同的訪問許可權
- 類或者體系結構繼承時,必須有下面兩種情況之一:
- 派生類中有非靜態成員,且僅有一個包含靜態成員的基類
- 基類有非靜態成員,而派生類沒有非靜態成員
- 類中第一個非靜態成員與基類不同
- 沒有虛擬函式和虛基類
- 所有的非靜態成員均符合標準佈局型別,其基類也符合標準佈局
使用std::is_standard_layout
進行判別
POD型別的應用
主要有3點優勢:
- 位元組賦值,可以使用
memset
和memcpy
進行初始化、拷貝等 - 提供對C記憶體佈局的相容
- 暴增靜態初始化的安全有效。
相關推薦
C++ 模板型別萃取技術 traits
當函式,類或者一些封裝的通用演算法中的某些部分會因為資料型別不同而導致處理或邏輯不同(而我們又不希望因為資料型別的差異而修改演算法本身的封裝時),traits會是一種很好的解決方案。(型別測試發生在編譯期) 自從C++中引入了template後,以泛型技術為中心的設計得到了長足的進步。STL就是
c#動態型別
動態型別其實是動態編譯的一種形式。在.net4.0上新增新的動態型別dynamic,對於動態型別,就是在執行時才會確定的型別。 1.dynamic關鍵字的使用 1)使用var可以定義本地變數,該變數的實際資料型別取決於編譯時,是在初次分配時確定的,在初次分配後,將擁有一個強型別的變數,任何不相容的的賦值操
C++ vector型別要點總結【轉】
(轉自:https://blog.csdn.net/suool/article/details/13295439?utm_source=blogxgwz22) 概述 C++內建的陣列支援容器的機制,但是它不支援容器抽象的語義。要解決此問題我們自己實現這樣的類。在標準C++中
C# 資料型別轉換 顯式轉型、隱式轉型、強制轉型
C# 的型別轉換有 顯式轉型 和 隱式轉型 兩種方式。 顯式轉型:有可能引發異常、精確度丟失及其他問題的轉換方式。需要使用手段進行轉換操作。 隱式轉型:不會改變原有資料精確度、引發異常,不會發生任何問題的轉換方式。由系統自動轉換。 不同型別的資料進行操作(加減乘除賦值等等),是需要
C++繼承型別:公有、保護、私有、虛擬
公有繼承(public)、保護繼承(protected)、私有繼承(private)是常用的三種繼承方式,除了這些繼承型別外還有一種虛擬繼承。 公有繼承(public) 公有繼承的特點是基類的公有成員和保護成員作為派生類的成員時,它們都保持原有的狀態,即基類的公有成員在派生類中還是公有
C++: LPARAM型別轉化為CString型別
高版本的VS中訊息響應機制十分嚴格,當傳遞引數明確要求是LPARAM型別的引數,經常需要將其轉化成CString型別的資料 假如現在有一個型別為LPARAM的變數lParam,要將其轉化為CString型別,可以: ①使用建構函式 CString str((char*)lParam);
.NET基礎之C#資料型別
(一)列舉變數 [public] enum 列舉名 { 值1, 值2, 值3, ...... } 例: public enum Gender { 男, 女 } //使用列舉變數 Gender sex = Gender.男; public:訪問修飾符 enum:宣告
C++資料型別
TCHAR 因為C++支援兩種字串,即常規的ANSI編碼(使用"“包裹)和Unicode編碼(使用L”“包裹),這樣對應的就有了兩套字串處理函式,比如:strlen和wcslen,分別用於處理兩種字串。 微軟將這兩套字符集及其操作進行了統一,通過條件編譯(通過_UNICODE和UNICO
C++字元型別轉換(BSTR、_bstr_t、CString、char *、LPCTSTR轉換)
1、CString轉BSTR BSTR bstr; CString strSql; bstr = strSql.AllocSysString(); … SysFreeString(bstrText); // 用完釋放&
C++--引用型別,含有可變引數的函式
引用型別 引用是識別符號的別名 定義一個引用的時候,必須同時對他初始化,使它指向一個已經存在的物件 例如:其實在定義引用變數ri的時候,ri相當於變數j的別名 int i,j; int &ri = i;//定義int引用ri,並初始化為變數i的引用
C#字元型別轉換與常用的轉義符
常用的轉義符 顯示符號,需要新增\+特殊字元,顯示出來 \為轉義符(在要顯示的每個符號前都加上\) \+特殊字元,就可以在執行時顯示這個特殊字元
C#資料型別轉換之string到int型陣列
已知: string str = "1,2,3,4,5" 問: 如何根據上述字串產生一個int[]陣列?(int[] intLst = {1,2,3,4,5}) 答: 首先:string strLst = str.Split( ',' ) 然後:int[] int
C++列舉型別Enum及C++11強列舉型別用法
列舉常常和switch配合使用,用一個程式碼片段來說明: //W A S D 前、後、左、右行走\nQ E 左、右轉頭\nF 復位\nG H 暫停、繼續、重播例項\nY 停止例項\nB 刪除例項\nSPACE 刪除所有例項 enum Keydown{ Forward='w', Back
C/C++基本型別佔用記憶體總結
C / C ++型別佔用記憶體總結 ç語言 Ç程式碼32位註釋 /************************************************************************* > Desc
C++強制型別轉換(dynamic_cast,static_cast, const_cast, reinterpret_cast)
[toc] C++同時提供了4種新的強制型別轉換形式(通常稱為新風格的或C++風格的強制轉 型):const_cast(expression)、dynamic_cast(expression)、 reinterpret_cast(expression)和 st
C++的型別轉換與異常處理
一 名稱和語法 1 C語言風格:不管什麼型別的轉換統統是: TYPE b = (TYPE)a; 2 C++風格: 1)static_cast,靜態型別轉換。如int轉換成char 2)reinterpreter_cast,重新解釋型別 3) dynamic_cast,命名上理解是
c++ double型別儲存
在C/C++中float是32位的,double是64位的,兩者在記憶體中的儲存方式和能夠表示的精度均不同,目前C/C++編譯器標準都遵照IEEE制定的浮點數表示法來進行float,double運算。 無論是float還是double,在記憶體中的儲存主要分成三部分,分別是: (1)符號位(
C/C++與C#之間型別的對應
C/C++ C# HANDLE, LPDWORD, LPVOID, void* IntPtr LPCTSTR, LPCTSTR, LPSTR, char*, const char*, W
C#-----值型別引用型別
值型別和引用型別 C#中的變數可以劃分為值型別(Value Type)和引用型別(Reference)兩種: 值型別:簡單型別、結構型別、列舉型別 引用型別:類、陣列、介面。 值型別轉為引用型別稱成為裝
c++ 時間型別詳解(time_t和tm)
linux下儲存時間常見的有兩種儲存方式,一個是從1970年到現在經過了多少秒,一個是用一個結構來分別儲存年月日時分秒的。 time_t 這種型別就是用來儲存從1970年到現在經過了多少秒,要想更精確一點,可以用結構struct timeval,它精確到