C++ 從基礎到精通 — 第 5 講
變數有哪些資料型態?
該部落格上撰寫的文章是出於教學目的而創建的。 另外,文章中的資訊可能不正確,請謹慎。
讓我們了解一下變數的資料類型。 它大致可以分為四大類。
基本資料型態。 這些是直接映射到記憶體的最基本類型。
1-A。特殊用途
void:沒有大小。它不直接佔用內存,是一種不完整類型。
std::nullptr_t:空指標文字 nullptr 的型別。
void DoSomething() {} //無返回值的函數
void* ptr = nullptr; //無型指針
std::nullptr_t null_val = nullptr;
1-B。算術類型
1-B-1。整數 char、signed char、unsigned char:儲存字元。還有用於 Unicode 的 wchar_t。 Short、int、long、long long:儲存有符號整數。 unsigned Short、unsigned int、unsigned long、unsigned long long:儲存無符號整數。因為它不會儲存負數,所以正數的儲存空間是有符號數的兩倍。 bool:儲存 true 或 false。使用 1 個字節,而不是 1 位。
char c = 'A';
int count = -10;
unsigned int u_count = 20;
bool is_valid = true;
1-B-2浮點型
遵循 IEEE 754 的類型, 基本上有float、double、long double, 還有 std::float16t、std::float32t、std::float64t、std::float128t 和 std::bfloat16_t。 (C++23 擴充)
float f_val = 3.14f;
double d_val = 3.1415926535;
2.複雜資料型別 這是一種透過組合基本類型或其他複雜類型來定義記憶體中的結構的類型。
指標(T):指向另一種類型T的記憶體位址。 成員指標(T::):指向類別中特定成員變數或函數的記憶體偏移量的特殊指標。
參考: 左值引用 (T&):記憶體中具有名稱和內容的物件(左值)的別名。 右值引用(T&&、C++11):綁定到臨時對象,是移動語意和完美轉送的核心型別。
陣列(Array,T[N]/T[]):將相同類型的資料分配到連續的記憶體區塊。 功能:簽名本身由傳回類型和參數清單組成,也是唯一類型。 (例如 int(double, char))
枚舉: enum:沒有指定範圍的基本枚舉(允許隱式整數轉換)。
枚舉類別 (C++11):嚴格範圍的枚舉(強型別檢查和範圍保證)。 使用者定義類型(Class/Struct/Union):透過控制記憶體填入和對齊規則來實現物件導向和資料結構的類型。
int value = 10;
int* ptr = &value; //指針
int& ref = value; //左值參考
int&& r_ref = 20; //右值參考
struct MyStruct { int x; };
int MyStruct::* member_ptr = &MyStruct::x; //成員指針
int arr[5] = {1, 2, 3, 4, 5}; //安排
int(*func_ptr)(int, int); //函數指針
enum class Color { Red, Green, Blue }; //嚴格枚舉
3.系統架構特定的別名 這些是核心別名類型,其大小根據編譯器和作業系統架構(32 位元/64 位元)動態決定。 (<cstddef> 標頭)
std::sizet:sizeof 運算子的傳回類型。它是一個無符號整數,可以表示系統中可以建立的最大物件的位元組大小。 (容器索引和記憶體分配的標準單位) std::ptrdifft:一個有符號整數,表示兩個指標相減時的距離。在計算記憶體位址之間的差異時使用。
#include <cstddef>
int arr[10];
std::size_t arr_size = sizeof(arr); //根據系統架構保證最大尺寸
std::ptrdiff_t diff = &arr[5] - &arr[0]; //計算指針之間的距離 (5)
4.履歷預選賽 在 C++ 的類型系統中,如果將限定符新增至上述所有資料類型,則從編譯器的角度來看,它們將被視為完全不同的類型並被重載。 (例如 int 和 const int 是不同的类型)
const:防止寫入對應的記憶體區域並確保不變性。 易失性:強制阻止編譯器的記憶體讀/寫最佳化。當控制硬體暫存器或與MMIO(記憶體映射I/O)通訊時,它本質上是用來通知編譯器暫存器值可以被外部來源更改。
const int MAX_VALUE = 100; //只讀,無法修改
//最大值=200; // 出現編譯錯誤
volatile int hardware_register; //避免編譯器最佳化
//外部硬體可以改變該值,因此每次都是直接從記憶體中讀取而不是從快取中讀取