C++ 使用非前缀成员变量时如何命名构造函数参数?
当然,没有一个正确的方法可以做到这一点,但我甚至想不出任何像样的命名方案,这就是为什么我在这里问。(因此:尽管所有答案都是主观的,但它们还是有用的!) 问题如下:对于简单聚合结构,我们不使用成员变量前缀C++ 使用非前缀成员变量时如何命名构造函数参数?,c++,initialization,naming-conventions,initializer-list,C++,Initialization,Naming Conventions,Initializer List,当然,没有一个正确的方法可以做到这一点,但我甚至想不出任何像样的命名方案,这就是为什么我在这里问。(因此:尽管所有答案都是主观的,但它们还是有用的!) 问题如下:对于简单聚合结构,我们不使用成员变量前缀 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()
: 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?)
{ }
};
在这种情况下,其他人在使用什么?我倾向于使用“a”前缀,如“a whatever”
为什么要发明前置/后置补丁?我只是用同一个名字。C++是为工作而设计的。p>
struct Info {
int x;
string s;
size_t z;
Info(int x, string s, size_t z)
: x(x)
, s(s)
, z(z)
{ }
};
这是直截了当的 您可以使用与成员名称相同的参数名称(但有些人会感到困惑)
我见过对成员使用前缀/后缀(
,m
,my
,在这种情况下与参数没有冲突)或对参数使用前缀/后缀(根据我的经验,前缀p
是最常用的用法).我在这里看到,构造函数参数使用尾随下划线,例如:
struct Info {
int i, j;
Info( int i_, int j_ ) : i( i_ ), j( j_ ) { }
};
使用相同的名称-它们不会碰撞 “在查找构造函数(12.6.2)的mem初始值设定项表达式中使用的名称时,函数参数名称为
可见并隐藏在包含函数声明的块、类或命名空间范围中声明的实体的名称。“3.4.1C++ 2003 < p>相信只要使用初始化列表,就可以使用相同的名称:
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);
}
};
我用的是:
struct Info {
int x;
string s;
size_t z;
Info(int x, string s, size_t z)
: x(x)
, s(s)
, z(z)
{ }
};
这可能有点令人惊讶,但这是完全合法的
另见:
如果只是将成员设置为相应参数的值,请使用初始值设定项列表。在这里,对成员变量和参数使用相同的名称是绝对安全的。如果您不能简单地赋值,但必须调用函数,则必须使成员和参数的名称易于区分,同时也易于使关系可见,在这里前缀或后缀是一个很好的选择 建议使用前缀
a
,但我发现将第一个字母或原始名称改为大写以获取参数名称的额外工作非常烦人,这会阻止简单地使用复制和粘贴(让它保持不变不是一个选项,因为您不想通过为每个案例添加前缀来观察潜在的含义变化)
对于不能使用初始值设定项列表的情况,我提出了a
,它可以用作原始名称之前的前缀
struct Info {
int value;
char description[MAX_DESCRIPTION_SIZE];
Info(int value, char* a_description)
: value(value)
{
someSafeCopy(description, a_description);
}
};
我所看到的(主要来自Java开发人员)是使用相同的名称。然后在构造函数中执行
this->s=s
,等等@Juancho:是的,但不幸的是,这不适用于构造函数中的初始值设定项列表。@Frerich Raabe-它更适用于初始值设定项列表。@Frerich可能重复-您不必为初始值设定项列表使用它。s
做你想做的事(但可能不是最初期望的)。因此,它工作得“更好”(你不必使用这个->
来消除歧义)。出于同样的原因,你在布尔表达式中使用额外的括号:因为大多数人(包括我)不记得在某些情况下语言是如何工作的。它避免了“心理减速”"在阅读代码时。@Frerich,这个问题很有启发性。与记住20+优先规则不同,我认为这是没有用的,记住这个规则对我来说是非常有用的。如果你有一个空的正文,只有初始值设定项列表,你就不必担心其他任何事情。这不是很好吗?+1:哦,我的天,这当然很混乱唱歌读:-)-但这当然是一个有效的选择:-)这是一个老话题,但我们应该重新思考clang++
在使用-Wshadow编译时出现了一个警告,这似乎是有原因的。也许同时你改变了主意,但不是吗?
struct Info {
int value;
char description[MAX_DESCRIPTION_SIZE];
Info(int value, char* a_description)
: value(value)
{
someSafeCopy(description, a_description);
}
};