摘要
避免作用域膨胀,对于需求如此,对于变量也是如此。变量将引入状态,而我们应该尽可能少地处理状态,变量的生存期也是越短越好。这是第10条的一个特例,但值得单独阐述。
讨论
变量的生存期超过必需的长度时会产生以下几个缺点:
l 它们会使程序更难以理解和维护:例如,如果代码只改变当前驱动器,那么它是否应该将作用域更新为模块范围的path字符串?
l 它们的名字会污染上下文:这一点的直接后果,就是可见性最好的名字空间级变量,问题也最大(见第10条)。
l 它们不能总是被合理地初始化:在能够合理地初始化一个变量之前,决不要声明它。未初始化的变量是所有C和C++程序中普遍的错误来源。我们需要对此高度重视,因为编译器并不总能将其检查出来(见第19条)。
要特别说明的是,C99之前的C语言版本曾要求只能在作用域开始处定义变量;这种方式在C++中已经过时了。这一限制的严重问题在于,在作用域的开始,经常还没有足够的相关信息进行变量初始化。因此我们只有两种选择——要么用某个默认的空值(比如零)来初始化,这通常都是一种浪费,而且如果变量在拥有有效状态之前被使用,还会导致错误;要么让变量保持未初始化,而这是很危险的。用户定义类型的未初始化变量将会自行初始化为某个空值。
解决方案很简单:尽可能局部地定义每个变量,通常就是在你有了足够的数据进行初始化的时候,而且恰恰就在首次使用变量之前。
例外情况
有时候将变量提出循环是有好处的(见第9条)。
因为常量并不添加状态,所以本条对常量不适用(见第17条)。





