假设你有这个非常愚蠢的代码(这只是为了让你轻松提出即将到来的问题):
#includeclass A { public: A() : m(0) {} void showM1( int m ) { std::cout << m << std::endl; } void showM2() { int m = 5; std::cout << m << std::endl; } int m; }; int main() { A a; a.showM1( 5 ); a.showM2(); }
当我测试时,没有惊喜,它显示5和5.但这是否真的是确定性的?优先级是否总是赋予局部变量(或方法参数)和对象属性?
我问,因为我们在一个巨大的项目中重命名了一些变量,并且只是想确保行为不是"不确定",并且可能因平台,编译器而异.
PS:我知道这是不好的实践,发现主题提到最好的方法是避免名称冲突(像这一个)....
这是明确定义的:
N3337 [basic.scope.hiding]/3:
在成员函数定义中,块作用域中名称的声明隐藏了具有相同名称的类成员的声明; 见3.3.7.
m
在块作用域中的成员函数定义中,因此它隐藏了类成员m
.