C ++成员变量

时间:2012-04-17 19:44:36

标签: c++ class variables scope member

考虑以下课程:

class A
{
  A();
  int number;
  void setNumber(int number);
};

您可以通过3种方式实现'setNumber':

方法1 :使用'this'指针。

void A::setNumber(int number)
{
  this->number = number;
}

方法2 :使用范围解析运算符。

void A::setNumber(int number)
{
  A::number = number;
}

方法3 :相反,用'm'或'_'表示所有成员变量(这是我首选的方法)。

void A::setNumber(int number)
{
  mNumber = number;
}

这只是个人偏好,还是选择特定方法有好处?

6 个答案:

答案 0 :(得分:13)

这主要是个人偏好,但让我分享我对这个问题的看法,这个问题来自同时制作许多小游戏的公司内部(因此我周围使用了很多编码风格)。

此链接有几个相关的好答案:Why use prefixes on member variables in C++ classes

您的选择1:

void A::setNumber(int number)
{
  this->number = number;
}
  

首先,许多程序员往往发现这很麻烦,不断输入'this-> ”。其次,更重要的是,如果你的任何变量与参数或局部变量共享一个名称,一个find-replace设计说,更改'number'的名称可能会影响位于find-replace范围内的成员变量as好。

您的选择2:

void A::setNumber(int number)
{
  A::number = number;
}
  

我遇到的问题是,在大型类或具有大型函数的类中(您无法看到函数或类被意外命名),A ::(thing)的格式看起来非常很像访问命名空间的一部分,因此可能会产生误导。另一个问题与上一个选项中的#2相同,如果您的名字与您正在使用的任何变量相似,那么有时可能会出现意外混淆。

您的选择3:

void A::setNumber(int number) 
{
  mNumber = number;
}
  

这是这三个选项中最好的选项。通过创建(并保持!)包含清晰且有意义的前缀的语法,您不仅可以创建本地(或全局)变量不会共享的唯一名称,而且可以立即清除声明该变量的位置,无论你发现它的上下文如何。我已经看到它像'mVariable'一样完成,就像这个'm_variable'一样,它主要取决于你是否喜欢下划线来大写连接。另外,如果你的风格倾向于为指针添加诸如'p'之类的东西,或者为全局变量添加'g',那么这种风格将很好地融合并且被读者所期待。

答案 1 :(得分:7)

这是一种风格,个人偏好,或与您合作的团队或与您合作的团队的老板的偏好。

答案 2 :(得分:5)

选项4

void A::setNumber(int n)
{
  number = n;
}

为什么为成员使用相同名称的好处是一个参数。没有好处可以来。当然,现在很清楚,但是当你的方法变大,原型不再适合屏幕,并且其他一些开发人员编写代码时,他可能会忘记对会员进行资格认定

答案 3 :(得分:2)

其所有个人偏好

但这是一个很高的非语言水平的讨论

https://stackoverflow.com/questions/381098/what-naming-convention-do-you-use-for-member-variables

答案 4 :(得分:2)

我想说方法1和方法3之间的选择是个人或组织风格的问题。

方法2是次要的,因为Class :: member通常表示一个静态成员变量,因此如果用于消除参数和成员变量之间的歧义,会引起混淆。

答案 5 :(得分:0)

我将通过提供更好的变体来同意Luchian。您提供的其他示例过于繁琐或令人困惑。

选项4

void A::setNumber(int aNumber)
{
  theNumber = aNumber;
}

这是我们在雇主处使用的编码标准的一部分,而且您所描述的内容非常清楚。这不是匈牙利的表示法。