遮蔽某些名字的情况在写大程序使是不可避免地。但是,读程序地人很容易没有注意到某个名字已经被遮蔽了。由于这类错误相对不那么常见,它们反而很难被发现。因此,还是应该尽量避免名字遮蔽地情况。对全局变量或者很大地函数里地局部变量,使用像i或x这一类地名字实际上就是自找麻烦。
int x//全局的x
void f()
{
int x;//局部的x屏蔽了全局的x
x = 1;//给局部的x赋值
{
int x;//屏蔽了第一个局部的x
x=2;//给第二个局部的x赋值
}
x=3;//给第一个局部的x赋值
}
int *p = &x//取全局x的地址。
【被遮蔽地全局名字可以通过作用域解析运算符::去引用。】
int x
void f2()
{
int x=1;//遮蔽全局的x。
::x=2;//给全局的x赋值。
x=2;//给局部的x赋值。
}
【一个名字的作用域从它被声明的那点开始;也就是说,在声明符结束之后,初始式的开始之前。这意外着一个名字甚至可以用于描述它自己的初始值。】
int x;
void f3()
{
int x = x;
}
这样做并不非法,只是荒谬。好编译器能对变量在未设置之前就使用提出警告。
【在同一块作用域初始化俩次变量】
void f5(int x)
{
int x;//错误
}