可能重复:
成员VS方法参数用C ++访问
我有了一些成员,如类x
, y
, width
和height
。 在它的构造,我不会做这样的:
A::A(int x, int y, int width, int height)
{
x = x;
y = y;
width = width;
height = height;
}
这并没有真正意义当与G ++编译x
, y
, width
和height
变得怪异值(如-1405737648
)。
什么是解决这些命名冲突的最佳方式是什么?
您可以使用初始化列表就好了相同名称:
A::A(int x, int y, int width, int height) :
x(x),
y(y),
width(width),
height(height)
{
}
另一种方法是使用不同的名称,如果你不希望有相同的名称。 一些匈牙利表示法的变化浮现在脑海(我可能会得到一些讨厌这个):
//data members
int x_;
int y_;
int width_;
int height_;
//constructor
A::A(int x, int y, int width, int height) :
x_(x),
y_(y),
width_(width),
height_(height)
{
}
但没有什么不对的第一个建议。
如果你必须在构造函数中使用赋值(而不是使用初始化列表,这是首选)的特定模式来解决这个问题是使用this
指针,如下所示:
this->a = a;
如果可能的话,最好还是通过初始化列表来设置数据成员,在这种情况下,有一个与论据阴影成员名称没有问题。 另一种替代方法是使用this->foo = foo;
在构造函数体。 存在setter方法类似的问题,但现在你不能使用初始化列表的解决方案。 你坚持this->foo = foo;
- 或者只是使用参数和成员不同的名称。
有些人真的很讨厌论据阴影数据成员; 多种编码标准明确地说,从来没有做到这一点。 有人认为这种遮蔽,至少在构造函数和setter方法,是猫的喵。 我记得读一个或两个编码标准(但我不记得这)是指定这种阴影的“应当”(而不是“应当”)的实践。
最后一个选择是使用阴影函数声明,以给读者一个提示,功能做什么,但在实现中使用不同的名称。
更新:什么是“阴影”?
#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
阴影(隐藏)所述数据成员width
。 当你在不同的范围已声明同名的两个或多个变量,赢家始终是最里面的范围名。 在一般情况下,它始终是最里面的范围获胜的名称。
虽然你可以使用构造函数的初始化列表避免这个问题,我建议您按照约定来命名数据成员,例如,一个尾随_
或领先m_
。 否则,你很可能有名称冲突,特别是如果你有一个名称,如会员x
和y
。
class A
{
public:
A(int x, int y, int width, int height) : x_(x), y_(y), with_(width), height_(height) {}
int x_;
int y_;
int width_;
int height_;
};
你可以改变的构造函数参数的名字。 当你写
A::A(int x, int y, int width, int height)
{
x = x;
y = y;
width = width;
height = height;
}
那么你指定构造函数的参数来要求自己 ,而使实际的实例变量初始化 ,这就是为什么你要假的值。
一般的解决办法,我建议(并广泛使用)是改变的构造方法的参数的名称:
A::A(int x_initial, int y_initial, int width_initial, int height_initial)
{
x = x_initial;
y = y_initial;
width = width_initial;
height = height_initial;
}