当然没有一种正确的方法可以做到这一点,但我甚至无法想到任何体面的命名方案,这就是我在这里问的原因。 (所以:虽然所有答案都是主观,但它们仍然会有用!)
问题如下:对于简单的聚合结构,我们不使用成员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?)
{ }
};
在这种情况下,其他人使用了什么?
答案 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?
答案 6 :(得分:1)
您可以使用与成员名称相同的参数名称(但有些名称会让人感到困惑)。
我已经看到成员使用前缀/后缀(_
,m
,my_
很受欢迎,在这种情况下与参数没有冲突)或参数(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);
}
};