如果可能的话,最好通过初始化列表设置数据成员,在这种情况下,隐藏成员名称的参数没有问题。另一种选择是this->foo = foo;
在构造函数的主体中使用。setter 也存在类似的问题,但现在您不能使用初始化列表解决方案。你被困住了this->foo = foo;
——或者只是对参数和成员使用不同的名称。
有些人真的很讨厌影响数据成员的论点;多个编码标准明确表示永远不要这样做。其他人认为这种阴影,至少对于构造函数和设置者来说,是猫的喵喵叫。我记得读过一两个编码标准(但我不记得是哪个)将这种阴影指定为“应该”(但不是“应该”)实践。
最后一种选择是在函数声明中使用阴影,以便向读者提示函数的作用,但在实现中使用不同的名称。
更新:什么是“阴影”?
#include <iostream>
void printi (int i) { std::cout << "i=" << i << "\n"; }
int i = 21;
int main () {
printi (i);
int i = 42;
printi (i);
for (int i = 0; i < 3; ++i) {
printi (i);
int i = 10;
printi (i);
}
printi (i);
}
, 的最里面的声明遮蔽了语句中声明的变量i
,这反过来又遮蔽了在函数范围内声明的变量,进而遮蔽了全局变量。int i=10
i
for
i
i
在手头的问题中,类的非默认构造函数的参数x
、y
、width
和隐藏了与这些参数同名的成员数据。height
A
您width=width;
什么也没做,因为参数width
隐藏(隐藏)了 data member width
。当您有两个或多个在不同范围内声明的具有相同名称的变量时,获胜者始终是具有最内层范围的名称。通常,获胜的总是具有最内部范围的名称。