區域變數

將函式的變數盡可能地放在最小的作用域內,並在宣告變數的同時初始化

C++ 允許你在函式內的任何地方宣告變數。 我們鼓勵你盡可能地將變數宣告在越局部的 (local) 作用域越好,並且最好越靠近它第一次被使用的地方。 這讓讀者會更容易找到變數的宣告處以及了解它的型別是甚麼。 特別要注意初始化與宣告不該分開,例如:

int i;
i = f();      // 不好 -- 初始化與宣告分離
int j = g();  // 良好 -- 宣告同時初始化
vector<int> v;
v.push_back(1);  // 最好使用括號初始化法 (brace initialization)
v.push_back(2);
vector<int> v = {1, 2};  // 良好 -- v 一開始就初始化好

ifwhilefor 陳述句需要的變數一般來說應該要被宣告在那些陳述句中,這樣他們就會被限制在所屬的作用域內,例如:

while (const char* p = strchr(str, '/')) str = p + 1;

有一個例外:如果該變數是物件,那該物件的建構函式每次進入這個作用域時就會被呼叫一次,解構函式也會每次離開時都會被呼叫到。

// 低效率的寫法
for (int i = 0; i < 1000000; ++i) {
  Foo f;  // 我的建構函式與解構函式會各被呼叫 1000000 次
  f.DoSomething(i);
}

此時將這個變數宣告在迴圈外面,程式執行時會比較有效率:

Foo f;  // 我的建構函式與解構函式只會各被呼叫一次
for (int i = 0; i < 1000000; ++i) {
  f.DoSomething(i);
}