我是否应该在C+;中对成员变量和函数参数使用相同的名称+;? 我想知道C++中的成员变量和函数参数是否使用相同的名称是不错的做法。
我来自Java背景,这是很常见的。我想知道C++中是否存在以下缺点(代码工作):我是否应该在C+;中对成员变量和函数参数使用相同的名称+;? 我想知道C++中的成员变量和函数参数是否使用相同的名称是不错的做法。,c++,parameters,naming-conventions,C++,Parameters,Naming Conventions,我来自Java背景,这是很常见的。我想知道C++中是否存在以下缺点(代码工作): 职业玩家 { 公众: 无效设置状态(播放状态*状态) { 这个->状态=状态; } 私人: 玩家状态*状态; } 谢谢你的回答。据我所知,更好的做法是使用某种标记来区分成员变量和函数参数,如: _ or m_ 在某些编辑器(如Qt Designer)中,成员变量以不同的颜色显示。这就是为什么似乎没有必要添加任何前缀。我建议您遵循一些编码风格惯例。我个人使用: class Player { publi
职业玩家
{
公众:
无效设置状态(播放状态*状态)
{
这个->状态=状态;
}
私人:
玩家状态*状态;
}
谢谢你的回答。据我所知,更好的做法是使用某种标记来区分成员变量和函数参数,如:
_ or m_
在某些编辑器(如Qt Designer)中,成员变量以不同的颜色显示。这就是为什么似乎没有必要添加任何前缀。我建议您遵循一些编码风格惯例。我个人使用:
class Player
{
public:
void setState(PlayerState *state)
{
_state = state;
}
private:
PlayerState* _state;
}
这是正确的,也是标准允许的。但更好的方法是对成员变量使用一些命名约定。例如,您可以对所有成员变量使用
m_
前缀,然后任何人都可以推断m_状态是什么。它增加了代码的可读性,并避免了常见错误
此外,如果m_state
是成员,则不必在成员函数中写入this->m_state=state
,只需写入m_state=state
。在当前代码中,这个->
部分是必需的,没有它,state=state
将成为自赋值。通常人们只是在变量后面加一个下划线,或者对函数参数使用较短的、描述性较差的变量名
我个人不喜欢同名的东西,因为读它的时候,很容易出错。 它很好,实际上它甚至可能是好的形式,只要它在你的构造函数中。
< P> > C++和java之间没有什么区别。唯一的缺点是您必须键入this->state=state
,而不是state=arg
但是您的代码是完全可以接受的,它更多的是样式设计,而不是其他任何东西。这样做:
class Player
{
public:
void setState(PlayerState *state)
{
this->m_state = state;
}
private:
PlayerState *m_state;
}
以后你会感谢我的。哈哈。。(:
“m_3;”(“Member”)前缀将成员与函数和其他内容区分开来。对于intellisense(或任何其他IDE自动建议)等内容非常有用
另外,如果以后不打算更改,请将m_state
标记为const
。以防万一。这更像是一个样式问题。大多数情况下,
没有问题:state
对于变量或值来说是一个非常糟糕的名称,
as变量和值应为限定名词,例如:
void setState( PlayerState* newState )
{
currentState = newState;
}
不管怎么说,在理论上。在实践中,我发现使用前缀很有用,
大致如下:
class Player
{
PlayerState* myState;
public:
void setState( PlayerState* newState )
{
myState = newState;
}
};
阅读代码时,如果名称以my
开头,则它显然是一个
成员变量(如果它以our
开头,则为静态成员
变量)
还要注意,在构造函数中,您可以执行以下操作:
Player::Player( PlayerState* state )
: state( state )
{
}
但是,我不确定这对可读性有何影响:
Player::Player( PlayerState* initialState )
: myState( initialState )
{
}
看起来更清晰(但对于简单的数据持有者,区别可能更大)
不太重要。)我发现给成员变量起与构造函数初始化参数相同的名字是一个很好的选择
以下是我的理由:
- 减少标识符的数量,从而降低复杂性
- 你不需要发明那么多标识符
- 如果可能的话,相同的事物应该有相同的名称,也就是说,从逻辑上讲,我知道
参数!=成员
- 上下文和索引允许为同一事物赋予相同的名称
- 通过搜索,您可以更轻松地找到逻辑对象的引用(标识符),
如果所有引用都具有相同的名称
请注意,有些编译器()如果一个变量影响另一个变量,则可能会生成警告。当然,可以禁用此类警告。但我认为启用这些检查是一种良好的做法。纯粹是选择和约定的问题,遵循贵组织的编码准则。我认为除了不必编写这->
。我总是在前后使用某种下划线,但这是一个品味问题。有些人,以m开头attrib名称,例如这里将是mState,如果代码由其他人修改,最好这样做,您的代码越可读,对集/获取成员越小心,否则您将以[PDF]结尾。我使用大写的“F”表示“字段”,但这只是历史记录。如果使用初始值设定项列表,则会更清楚地显示分配给什么的内容(除非是C#,否则不能)我个人喜欢这些领先的下划线,因为它们一般都是标准库和编译器功能。我喜欢尾随下划线。我不喜欢任何下划线!有名字的修饰,和我的ATI等。我在C++中看到了足够的下划线。所有这些都取决于你的公司遵循的编码风格。在许多c#和java编码风格指南中,前导下划线非常常见:)。如果前导下划线后面没有大写字母,则也可以使用前导下划线@阿列克西奥正式宣布。实际上,您增加了与前导下划线冲突的风险(而且您永远不会从某些编译器定义没有下划线的符号中解脱出来——我在使用简单的linux
)时遇到了问题)。更一般地说,应该避免使用前导下划线和尾随下划线,因为它们很难看到,并且使读取代码更加困难。myState
和\u state
之间只有一个字符的区别,前者可读性更高。使m\u state
const
意味着你不能支持赋值。@JamesKanze它实际上取决于你把const
关键字放在哪里