C 語言強制變數宣告於區塊開頭,C++ 允許就近宣告(在真正需要處)。這不僅提升可讀性,更帶來實質效能優化機會。
// 低效:預設建構 + 指派
string s;
s = "hello"; // 兩次操作
// 高效:直接初始化
string s("hello"); // 或 string s = "hello"; 單次建構
對內建型別差異微小;對類別型別,賦值多一次指派運算子呼叫。std::string、std::vector 等更顯著。
// 低效:提早建構,可能根本不使用
void use() {
ExpensiveObject obj; // 建構開銷
if (!needed()) return; // 白白付出
obj.doWork();
}
// 高效:需要時才建構
void use() {
if (!needed()) return;
ExpensiveObject obj; // 僅必要路徑付出代價
obj.doWork();
}
陣列更顯著:ExpensiveObject arr[1000]; 提早建構 1000 個物件。
// 低效:預設建構 + 指派
Person(const string& n, int a) {
name = n; // operator=
age = a;
}
// 高效:直接初始化
Person(const string& n, int a) : name(n), age(a) {} // 複製建構
初始化列表:成員宣告時直接建構,僅一次複製建構。本體賦值:預設建構 + 指派 = 兩次函數呼叫。
注意:初始化順序遵循成員宣告順序,非列表書寫順序。
for (auto it = vec.begin(); it != vec.end(); ++it) // 前置:無暫存物件
for (auto it = vec.begin(); it != vec.end(); it++) // 後置:建立暫存副本
++it)std::for_each 等)「過早優化是萬惡之源」,但這些是零成本良好習慣:寫法正確、語意清晰、效能不差。養成上述習慣,是專業 C++ 開發者的基本素養。