# 概念
**POD 是 Plain Old Data 的縮寫**,是 C++ 定義的一類數據結構概念,比如 int、float 等都是 POD 類型的。Plain 代表它是一個普通類型,Old 代表它是舊的,與幾十年前的 C 語言兼容,那么就意味著可以使用 memcpy() 這種最原始的函數進行操作。兩個系統進行交換數據,如果沒有辦法對數據進行語義檢查和解釋,那就只能以非常底層的數據形式進行交互,而擁有 POD 特征的類或者結構體通過二進制拷貝后依然能保持數據結構不變。
**也就是說,能用 C 的 memcpy() 等函數進行操作的類、結構體就是 POD 類型的數據**。
## **POD的特征**
是不是 POD 類型的,可以用 is\_pod::value 來判斷。那什么樣的類、結構體是擁有 POD 特性的呢?要求有兩個:一個是它必須很平凡、很普通;另一個是布局有序。
* 不能寫**構造/析構函數**、**拷貝/移動構造函數**、**拷貝/移動運算符**,而是用編譯器自動為我們生成,那這個數據就是“平凡的”。非要寫的話,用 C++ 11 的 default 關鍵字。例如下列代碼用 std::is\_trivial::value 來判斷是否“平凡”。
* 不能有**虛函數**和**虛基類**。只要滿足以上條件,就是擁有平凡特征的數據類型。
**布局要有序**
除了平凡之外,還對布局有要求。為了便于理解講述,我們把非靜態數據稱為普通數據。
* **普通成員有相同的訪問級別**。例如下面的類,因為 a 和 b 的訪問級別不一樣,所以布局無序,自然就不是 POD 類型的數據。當然,如果 b 寫成 static int b,例子中的 A 類就是 POD 類型的了。所以一定要看清每個字,是“普通成員”哦。
* **第一個成員必須是自己的**
* **只要有父類,普通成員只能在其中一個類中,不可分散**
*
- C++基礎
- 什么是 POD 數據類型?
- 面向對象三大特性五大原則
- 低耦合高內聚
- C++類型轉換
- c++仿函數
- C++仿函數了解一下?
- C++對象內存模型
- C++11新特性
- 智能指針
- 動手實現C++的智能指針
- C++ 智能指針 shared_ptr 詳解與示例
- 現代 C++:一文讀懂智能指針
- Lamda
- c++11多線程
- std::thread
- std::async
- std::promise
- std::future
- C++11 的內存模型
- 初始化列表
- std::bind
- std::tuple
- auto自動類型推導
- 可變參數模板
- 右值引用與移動語義
- 完美轉發
- 基于范圍的for循環
- C++11之POD類型
- std::enable_if
- C++14/17
- C++20
- 協成
- 模塊
- Ranges
- Boost
- boost::circular_buffer
- 使用Boost.Asio編寫通信程序
- Boost.Asio C++ 網絡編程
- 模板
- 模板特化/偏特化
- C++模板、類模板、函數模板詳解都在這里了
- 泛化之美--C++11可變模版參數的妙用
- 模板元編程
- 這是我見過最好的模板元編程文章!