6

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

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

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

  Info()
  : x(-1)
  , s()
  , z(0)
  { }
};

然而,有时提供一个初始化器 ctor 来初始化结构体是很有用的,但是 - 当参数的最自然名称已经被成员变量本身占用时,我无法为参数提出一个合适的命名方案:

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

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

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

4

8 回答 8

12

使用相同的名称 - 它们不会发生冲突。

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

于 2011-03-09T13:22:51.223 回答
11

为什么要发明前/后缀?我只是使用相同的名称。C++ 就是为此而设计的。

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

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

这是直截了当的。

于 2011-03-09T13:22:11.117 回答
6

我倾向于使用“a”前缀——就像在“a whatever”中一样。

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


struct Time {
  Time(time_t aUnixTime) : UnixTime(aUnixTime) {}
  time_t UnixTime;
};
于 2011-03-09T13:20:24.643 回答
3

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

struct Info {
  int i, j;
  Info( int i_, int j_ ) : i( i_ ), j( j_ ) { }
};
于 2011-03-09T13:22:29.233 回答
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);
  }
};
于 2011-03-09T13:26:10.583 回答
3

我正在使用这个:

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

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

这可能有点令人惊讶,但这是完全合法的。

也可以看看:

我可以为字段和构造函数参数使用相同的名称吗?

构造函数的参数命名

于 2011-03-09T13:28:17.767 回答
1

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

我已经看到成员(_, m,my_在这种情况下与参数没有冲突的情况下很流行)或参数(根据p我的经验,前缀 of 是最流行的)使用前缀/后缀。

于 2011-03-09T13:22:14.493 回答
0

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

Erik 的回答建议使用 prefix a,但我发现将第一个字母或原始名称更改为大写以使参数名称非常烦人,它阻止了简单地使用复制和粘贴(让它保持不变不是一个选项,因为你不这样做'不想通过为每个单独的情况添加前缀来观察潜在的含义变化)。

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

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

    Info(int value, char* a_description)
    : value(value)
    {
        someSafeCopy(description, a_description);
    }
};
于 2017-09-04T10:58:32.537 回答