如何在使用非前缀成员变量时命名构造函数参数?

时间:2011-03-09 13:17:18

标签: c++ initialization naming-conventions initializer-list

当然没有一种正确的方法可以做到这一点,但我甚至无法想到任何体面的命名方案,这就是我在这里问的原因。 (所以:虽然所有答案都是主观,但它们仍然会有用!)

问题如下:对于简单的聚合结构,我们不使用成员var前缀。

struct Info {
  int x;
  string s;
  size_t z;

  Info()
  : x(-1)
  , s()
  , z(0)
  { }
};
然而,提供初始化结构的初始化器ctor有时是有用的,但是当参数的最自然名称已被成员变量本身占用时,我无法为参数提供一个合适的命名方案: / p>
struct Info {
  int x;
  string s;
  size_t z;

  Info(int x?, string s?, size_t z?)
  : x(x?)
  , s(s?)
  , z(z?)
  { }
};

在这种情况下,其他人使用了什么?

8 个答案:

答案 0 :(得分:12)

使用相同的名称 - 它们不会发生碰撞。

“在构造函数(12.6.2)的mem-initializer表达式中查找使用的名称...时,函数参数名称为 可见并隐藏包含函数声明的块,类或命名空间范围中声明的实体的名称。“3.4.1 C ++ 2003

答案 1 :(得分:7)

为什么要发明前/后缀?我只是用同一个名字。 C ++旨在实现这一目标。

struct Info {
  int x;
  string s;
  size_t z;

  Info(int x, string s, size_t z)
  : x(x)
  , s(s)
  , z(z)
  { }
};

直截了当。

答案 2 :(得分:5)

我倾向于使用“a”前缀 - 就像“无论什么”一样。

Info(int aX, string const & aS, size_t aZ);


struct Time {
  Time(time_t aUnixTime) : UnixTime(aUnixTime) {}
  time_t UnixTime;
};

答案 3 :(得分:3)

我在这里看到的东西是使用尾随下划线来构造函数参数,例如:

struct Info {
  int i, j;
  Info( int i_, int j_ ) : i( i_ ), j( j_ ) { }
};

答案 4 :(得分:3)

我相信只要您使用初始化列表,就可以使用相同的名称:

struct Info {
  int x;
  string s;
  size_t z;

  Info(int x, string s, size_t z) : x(x) , s(s) , z(z)
  { }
};

如果你必须做一些工作来初始化一个字段,你仍然可以使用相同的名称,但它会不太方便:

struct Example {
  char *c;
  size_t l;

  Example(char *c, size_t l) : l(l), c(new char[l])
  {
      // in the block c is the parameter and this->c is the member
      std::copy(c, c + l, this->c);
  }
};

答案 5 :(得分:3)

我正在使用它:

struct Info {
  int x;
  string s;
  size_t z;

  Info(int x, string s, size_t z)
  : x(x)
  , s(s)
  , z(z)
  { }
};

这可能有点意外,但这完全合法。

另见:

Can I use identical names for fields and constructor parameters?

Parameters Naming for Constructor

答案 6 :(得分:1)

您可以使用与成员名称相同的参数名称(但有些名称会让人感到困惑)。

我已经看到成员使用前缀/后缀(_mmy_很受欢迎,在这种情况下与参数没有冲突)或参数(a根据我的经验,p的前缀是最常用的。)

答案 7 :(得分:0)

如果只将成员设置为相应参数的值,请使用初始化列表。这里使用相同的名称作为成员变量和参数是绝对安全的。如果您不能简单地分配值,但必须调用函数,那么使成员和参数的名称易于区分,但也很容易使关系可见,这里前缀或后缀是一个不错的选择。

Erik's answer建议使用前缀a,但我发现额外的工作是将第一个字母或原始名称更改为大写,以使参数名称非常烦人,它会阻止简单地使用copy&粘贴(让它保持不变不是一个选项,因为你不想通过为每个案例添加前缀来观察意义上的潜在变化。)

对于无法使用初始化列表的情况,我想出了a_,它可以用作原始名称前的前缀。

struct Info {
    int value;
    char description[MAX_DESCRIPTION_SIZE];

    Info(int value, char* a_description)
    : value(value)
    {
        someSafeCopy(description, a_description);
    }
};