C++ 是一種強類型語言,這意味著每個變量都必須有明確的數據類型,以便編譯器知道如何存儲和操作數據。數據類型決定了變量的內存占用、取值范圍以及可以執行的操作。理解 C++ 的數據類型是編寫高效、安全代碼的基礎。本文將全面介紹 C++ 的數據類型,包括基本數據類型、派生類型、用戶自定義類型,以及 C++11/14/17 引入的新特性,幫助讀者掌握數據類型的核心概念和應用場景。
1. 基本數據類型(Primitive Types)
基本數據類型是 C++ 內置的最基礎的數據類型,包括整型、浮點型、字符型和布爾型。
1.1 整型(Integer Types)
整型用于存儲整數,C++ 提供了不同大小的整型以適應不同的需求:
類型 | 大小(字節) | 取值范圍(32/64 位系統) |
---|---|---|
short | 2 | -32,768 到 32,767 |
int | 4 | -2,147,483,648 到 2,147,483,647 |
long | 4 或 8 | 取決于平臺 |
long long | 8 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
unsigned ?變體 | 同尺寸 | 僅非負數(范圍更大) |
示例:
short age = 25; // 短整型
int salary = 50000; // 標準整型
long population = 8000000000L; // 長整型
long long bigNum = 9'223'372'036'854'775'807LL; // 長長整型(C++14 支持數字分隔符)
1.2 浮點型(Floating-Point Types)
浮點型用于存儲小數,C++ 提供三種浮點類型:
類型 | 大小(字節) | 有效數字位數 | 典型范圍 |
---|---|---|---|
float | 4 | 6-7 | ±3.4e-38 到 ±3.4e38 |
double | 8 | 15-16 | ±1.7e-308 到 ±1.7e308 |
long double | 16 | 18-19 | 更大范圍 |
示例:
float pi = 3.14159f; // 單精度浮點(加 'f' 后綴)
double distance = 1.496e11; // 雙精度浮點(科學計數法)
long double preciseValue = 3.141592653589793238L; // 擴展精度
1.3 字符型(Character Types)
字符型用于存儲單個字符或 Unicode 字符:
類型 | 大小(字節) | 用途 |
---|---|---|
char | 1 | ASCII 字符(如?'A' ) |
wchar_t | 2 或 4 | 寬字符(如 UTF-16) |
char16_t | 2 | UTF-16 編碼(C++11) |
char32_t | 4 | UTF-32 編碼(C++11) |
示例:
char letter = 'A';
wchar_t wideChar = L'你'; // 寬字符(L 前綴)
char16_t utf16Char = u'😊'; // UTF-16
char32_t utf32Char = U'🚀'; // UTF-32
1.4 布爾型(Boolean Type)
bool
?類型僅有兩個值:true
(1)和?false
(0),常用于邏輯判斷。
示例:
bool isRaining = true;
bool isSunny = false;
if (isRaining) {cout << "Take an umbrella!" << endl;
}
2. 派生數據類型(Derived Types)
派生數據類型由基本類型組合或擴展而來,包括數組、指針、引用和函數。
2.1 數組(Array)
數組是相同類型元素的集合,大小固定。
示例:
int numbers[5] = {1, 2, 3, 4, 5}; // 靜態數組
for (int i = 0; i < 5; i++) {cout << numbers[i] << " ";
}
2.2 指針(Pointer)
指針存儲變量的內存地址,可用于動態內存管理。
示例:
int x = 10;
int* ptr = &x; // ptr 存儲 x 的地址
cout << *ptr; // 輸出 10(解引用)
2.3 引用(Reference)
引用是變量的別名,必須在聲明時初始化。
示例:
int y = 20;
int& ref = y; // ref 是 y 的引用
ref = 30; // 修改 y 的值
cout << y; // 輸出 30
2.4 函數(Function)
函數也是一種數據類型,可以定義函數指針或 Lambda 表達式。
示例:
int add(int a, int b) { return a + b; }
int (*funcPtr)(int, int) = add; // 函數指針
cout << funcPtr(2, 3); // 輸出 5
3. 用戶自定義類型(User-Defined Types)
C++ 允許用戶定義自己的數據類型,如結構體、類、枚舉和聯合體。
3.1 結構體(struct
)
結構體用于組合不同類型的數據。
示例:
struct Person {string name;int age;
};
Person p = {"Alice", 25};
cout << p.name; // 輸出 "Alice"
3.2 類(class
)
類是面向對象編程的核心,支持封裝、繼承和多態。
示例:
class Rectangle {
private:int width, height;
public:Rectangle(int w, int h) : width(w), height(h) {}int area() { return width * height; }
};
Rectangle rect(10, 20);
cout << rect.area(); // 輸出 200
3.3 枚舉(enum
)
枚舉用于定義一組命名的常量。
示例:
enum Color { RED, GREEN, BLUE };
Color c = GREEN;
if (c == GREEN) {cout << "Go!" << endl;
}
3.4 聯合體(union
)
聯合體允許同一內存存儲不同類型的數據(但只能同時存一個)。
示例:
union Data {int i;float f;
};
Data d;
d.i = 42; // 此時 d.f 的值未定義
4. C++11/14/17 新增類型
現代 C++ 引入了更強大的類型系統:
4.1?auto
?自動類型推導
auto x = 42; // x 是 int
auto name = "Bob"; // name 是 const char*
4.2?decltype
?獲取表達式類型
int a = 10;
decltype(a) b = 20; // b 的類型與 a 相同(int)
4.3?nullptr
(替代?NULL
)
std::byte buffer[1024]; // 用于二進制數據處理
4.4?std::byte
(C++17)
表示原始字節數據:
std::byte buffer[1024]; // 用于二進制數據處理
5. 其他
5.1 類型別名
別名 | 描述 | 示例 |
---|---|---|
typedef | 為現有類型定義別名 | typedef int MyInt; |
using | 為現有類型定義別名(C++11 引入) | using MyInt = int; |
5.2 標準庫類型
數據類型 | 描述 | 示例 |
---|---|---|
std::string | 字符串類型 | std::string s = "Hello"; |
std::vector | 動態數組 | std::vector<int> v = {1, 2, 3}; |
std::array | 固定大小數組(C++11 引入) | std::array<int, 3> a = {1, 2, 3}; |
std::pair | 存儲兩個值的容器 | std::pair<int, float> p(1, 2.0); |
std::map | 鍵值對容器 | std::map<int, std::string> m; |
std::set | 唯一值集合 | std::set<int> s = {1, 2, 3}; |
5.3 typedef 聲明
您可以使用?typedef?為一個已有的類型取一個新的名字。下面是使用 typedef 定義一個新類型的語法:
typedef type newname;
例如,下面的語句會告訴編譯器,feet 是 int 的另一個名稱:
typedef int feet;
現在,下面的聲明是完全合法的,它創建了一個整型變量 distance:
feet distance;
總結
C++ 提供了豐富的數據類型,從基本類型到高級自定義類型,每種類型都有其適用場景。理解這些類型的特點和用法,有助于編寫高效、可維護的代碼。
類別 | 關鍵點 |
---|---|
基本數據類型 | int ,?float ,?char ,?bool |
派生數據類型 | 數組、指針、引用、函數 |
用戶自定義類型 | struct ,?class ,?enum ,?union |
現代 C++ 類型 | auto ,?decltype ,?nullptr ,?std::byte |
掌握這些數據類型后,你可以更靈活地設計程序,并優化內存和性能。希望本文能幫助你深入理解 C++ 的數據類型系統!