成员名称和构造函数的参数名称[复制]之间的冲突(Conflicts between member n

2019-08-01 07:59发布

可能重复:
成员VS方法参数用C ++访问

我有了一些成员,如类xywidthheight 。 在它的构造,我不会做这样的:

A::A(int x, int y, int width, int height)
{
    x = x;
    y = y;
    width = width;
    height = height;
}

这并没有真正意义当与G ++编译xywidthheight变得怪异值(如-1405737648 )。

什么是解决这些命名冲突的最佳方式是什么?

Answer 1:

您可以使用初始化列表就好了相同名称:

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)
{
}

但没有什么不对的第一个建议。



Answer 2:

如果你必须在构造函数中使用赋值(而不是使用初始化列表,这是首选)的特定模式来解决这个问题是使用this指针,如下所示:

this->a = a;


Answer 3:

如果可能的话,最好还是通过初始化列表来设置数据成员,在这种情况下,有一个与论据阴影成员名称没有问题。 另一种替代方法是使用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);
}

最里面的声明iint i=10 ,阴影变量i在宣布for声明,这反过来阴影变量i在功能范围,这反过来阴影全局变量声明i

在手边的问题,参数xywidth ,和height的非默认构造类A阴影具有相同名称的那些参数的部件数据。

您的width=width; 什么也没做是因为参数width阴影(隐藏)所述数据成员width 。 当你在不同的范围已声明同名的两个或多个变量,赢家始终是最里面的范围名。 在一般情况下,它始终是最里面的范围获胜的名称。



Answer 4:

虽然你可以使用构造函数的初始化列表避免这个问题,我建议您按照约定来命名数据成员,例如,一个尾随_或领先m_ 。 否则,你很可能有名称冲突,特别是如果你有一个名称,如会员xy

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_;
};


Answer 5:

你可以改变的构造函数参数的名字。 当你写

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;
}


文章来源: Conflicts between member names and constructor argument names [duplicate]