C++ 要求變量使用前聲明。聲明時可選初始化,**強烈建議總是初始化**,避免未定義值導致的不可預測行為。
// C 風格 (複製初始化)
int a = 0;
double pi = 3.14159;
// 構造函數風格 (直接初始化) — C++ 特有
int b(0);
double e(2.71828);
// 列表初始化 (C++11) — 統一初始化語法,防縮窄轉換
int c{0};
double d{3.14};
// int e{3.14}; // 錯誤:縮窄轉換 (double→int) 被禁止
auto (C++11)auto x = 42; // int
auto y = 3.14; // double
auto z = "hello"; // const char*
auto ptr = new int(10); // int*
auto 由初始化表達式推導類型,減少冗長類型名 (如迭代器),但不可用於無初始化聲明。
| 類別 | 類型 | 典型大小 | 說明 |
|---|---|---|---|
| 字符 | char | 1 字節 | ASCII 字符或小整數 (符號性實現定義) |
wchar_t char16_t char32_t | 2/4 字節 | 寬字符 (Unicode) | |
| 整數 | short int long long long | ≥2/≥2/≥4/≥8 字節 | 至少對應位寬,int 通常為機器字長 |
unsigned 前綴 | - | 無符號版本 (如 unsigned int) | |
int8_t int16_t int32_t int64_t | 固定寬度 | <cstdint> 提供,跨平台精確控制 | |
| 浮點 | float | 4 字節 | 單精度 (7 位有效數字) |
double long double | 8/10-16 字節 | 雙精度 (15-17 位) / 擴展精度 | |
| 布爾 | bool | 1 字節 | true / false |
| 無類型 | void | - | 無值、函數返回、通用指針 void* |
std::stringC++ 標準庫提供 <string> 中的 std::string 類,替代 C 風格字符數組,管理內存、防緩衝區溢出、支援豐富操作。
#include <iostream>
#include <string>
using namespace std;
int main() {
string s1 = "Hello"; // 複製初始化
string s2("World"); // 直接初始化
string s3{ "C++" }; // 列表初始化 (C++11)
string s4(10, 'x'); // 10 個 'x' : "xxxxxxxxxx"
cout << s1 << ' ' << s2 << endl; // 輸出: Hello World
// 重新賦值、拼接
s1 = "Hi";
s2 += "!";
string s3 = s1 + s2; // "Hi World!"
// 輸入 (含空格)
string line;
getline(cin, line); // 讀整行
return 0;
}
| 操作 | 代碼 | 說明 |
|---|---|---|
| 長度 | s.size() / s.length() | 返回字符數 (不含結束符) |
| 訪問字符 | s[i] (無檢查) / s.at(i) (邊界檢查拋出異常) | 下標從 0 開始 |
| 拼接 | s1 + s2 / s1 += s2 / s.append(str) | 高效拼接 |
| 比較 | s1 == s2 / s1.compare(s2) | 字典序比較 |
| 子串 | s.substr(pos, len) | 返回新 string |
| 查找 | s.find(str/char, pos) | 返回位置或 npos |
| C 風格指針 | s.c_str() | 返回以 '\0' 結尾的 const char* |
42 (int)、42u (unsigned)、42L (long)、42LL (long long)。3.14 (double)、3.14f (float)、3.14L (long double)。'a'、'\n'、'\x41' (十六進制)、L'中' (寬字符)。"hello" (const char[])、R"(raw\nstring)" (原始字符串字面量 C++11)。true、false。nullptr (C++11,替代 NULL/0)。{} 內,進入塊創建,離開塊銷毀。未初始化值不確定。static int cnt = 0; 首次執行初始化,生命周期全程,作用域局部。{} 防縮窄、統一語法。auto** — 減少冗長類型,配合 const 推導 const auto&。std::string** — 拒絕 char[]、strcpy、緩衝區溢出。<cstdint>** — int32_t、uint64_t 跨平台一致。double** — 精度足夠,float 僅用於存儲/傳輸大量數據節省帶寬。const/constexpr** — 編譯期常量用 constexpr,運行期只讀用 const。-1 < 1u 為 false)。變量與類型是程序的骨架。選對類型、正確初始化、善用標準庫設施,能消滅一大類低級 Bug,讓代碼更安全、更易讀、更高效。