28

我想知道在 C++ 中为成员变量和函数参数使用相同的名称是否是一种好习惯。

我来自 Java 背景,这很常见。我想知道在 C++ 中是否存在以下缺点(代码有效):

class Player
{
    public:
    void setState(PlayerState *state)
    {
        this->state = state;
    }

    private:
       PlayerState *state;
}

谢谢你的回答。据我了解,虽然它有效,但更好的做法是放置某种标记来区分成员变量和函数参数,例如:

 _ or m_

在某些编辑器(如 Qt Designer)中,成员变量以不同的颜色显示。这就是为什么似乎没有必要添加任何前缀的原因。

4

9 回答 9

19

这是正确的,并且是标准允许的。但更好的方法是对成员变量使用一些命名约定。例如,您可以m_对所有成员变量使用前缀,然后任何人都可以推断出m_state它是什么。它增加了代码的可读性,并避免了常见错误。

另外,如果m_state是成员,则不必this->m_state = state在成员函数中编写,只需编写m_state = state. 在您当前的代码中,this->部分变得必要,没有state = state它将成为自分配。

于 2012-04-20T16:34:20.757 回答
9

通常人们只是在变量后面加一个下划线,或者对函数参数使用较短的描述性较差的变量名。

我个人不喜欢同名的东西,因为读起来很容易出错。

于 2012-04-20T16:34:27.453 回答
4

我发现为成员变量赋予与构造函数初始化参数相同的名称是一个不错的选择。

以下是我的理由:

  • 减少标识符的数量,从而降低复杂性
  • 你不需要发明那么多标识符
  • 如果可能的话,相同的东西应该有相同的名字,从逻辑上讲,我知道
    parameter != member
  • 上下文和索引可以允许为同一事物赋予相同的名称
  • 如果所有引用都具有相同的名称,您更容易通过搜索找到对逻辑事物的引用(标识符)
于 2014-06-16T08:46:03.447 回答
3

C++ 和 Java 之间没有任何区别,唯一的缺点是您必须键入this->state = state而不是state = arg.

但是您的代码是完全可以接受的,它更多的是样式而不是其他任何东西。

于 2012-04-20T16:35:17.723 回答
1

我建议您遵循一些编码风格约定。我个人使用:

class Player
{
    public:
    void setState(PlayerState *state)
    {
        _state = state;
    }

    private:
       PlayerState* _state;
}
于 2012-04-20T16:34:20.370 回答
1

这比其他任何事情都更像是一个风格问题。大多数时候,没有问题:state对于变量或值来说是一个非常糟糕的名称,因为变量和值应该是限定名词,例如:

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 )
{
}

看起来更清晰(但对于简单的数据持有者,区别可能不是那么重要)。

于 2012-04-20T17:24:52.623 回答
1

请注意,如果变量遮蔽另一个变量,某些编译器(vs 2015)可能会生成警告。当然,可以禁用这些警告。但我认为启用这些检查是一个好习惯。

于 2017-07-14T08:50:55.607 回答
0

很好,事实上它甚至可能是好的形式,只要它只在你的构造函数中。

于 2012-04-20T16:34:35.373 回答
0

这样做:

class Player
{
    public:
    void setState(PlayerState *state)
    {
        this->m_state = state;
    }

    private:
       PlayerState *m_state;
}

过一段时间你会感谢我的。哈哈.. (:

“m_”(“Member”)前缀将成员与函数和其他东西区分开来。对于诸如智能感知(或任何其他 IDE 自动建议)之类的东西非常有用。

另外,标记m_stateconst您以后不打算更改它。以防万一。

于 2012-04-20T16:41:24.377 回答