局部变量

应该尽可能缩小函数变量的作用域 (scope), 并在声明的同时初始化.

C++允许在函数的任何位置声明变量,提倡在尽可能小的作用域中声明变量,离第一次使用越近越好。这样代码易于阅读且易于定位变量的声明位置、变量类型和初始值。特别是,应使用初始化代替声明+赋值的方式。例如:

int i;
i = f();     // 不好: 初始化和声明分离.
int i = f(); // 良好: 声明时初始化。
int jobs = NumJobs();
// 更多代码...
f(jobs);      // 不好: 初始化和使用位置分离.
int jobs = NumJobs();
f(jobs);      // 良好: 初始化以后立即 (或很快) 使用.
vector<int> v;
v.push_back(1);  // 用花括号初始化更好.
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;  // 调用 1 次构造函数和析构函数.
for (int i = 0; i < 1000000; ++i) {
    f.DoSomething(i);
}