应该尽可能缩小函数变量的作用域 (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.
通常应该在语句内声明用于 if
、while
和 for
语句的变量, 这样会把作用域限制在语句内. 例如:
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);
}