【问题标题】:C++ Member VariablesC++ 成员变量
【发布时间】:2012-04-29 04:40:42
【问题描述】:

考虑以下类:

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

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

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

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

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

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

方法 3:改为使用“m”或“_”表示所有成员变量(这是我的首选方法)。

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

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

【问题讨论】:

  • @R.MartinhoFernandes:为简单起见,这是一个示例。
  • 第三个。没有必要在 C++ 中使用this->,除非您正在处理模板化基类。把冗长的噪音留给 Java 和 PHP。
  • 方法 4:消除 setter 以提供更高级别的操作(当然,这并不总是实用)。
  • 感谢大家的精彩回复!我希望我能接受你所有的答案。 @JerryCoffin:绝对有道理,但是,正如你提到的,这并不总是实用的。

标签: c++ class variables scope member


【解决方案1】:

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

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

您的选择 1:

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

首先,许多程序员往往觉得这很麻烦,不断地输入'this->'。其次,更重要的是,如果您的任何变量与参数或局部变量共享名称,则旨在更改“数字”名称的查找替换可能会影响位于查找替换范围内的成员变量好吧。

您的选择 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' 用于全局变量之类的东西,那么这种样式将很好地融合并受到读者的期待。

【讨论】:

    【解决方案2】:

    这是一个风格问题,因此是个人偏好,或者是与您合作的团队或与您合作的团队的老板的偏好。

    【讨论】:

    • 弗拉德是对的。只要确保无论您最终使用哪种风格,您都不会对此感到虔诚。这只是风格,没有别的。关键是您需要了解代码在做什么,而不管其编写的风格如何,所以不要想太多 :) 只需遵循周围的代码,除非您有充分的技术理由不这样做。
    【解决方案3】:

    选项 4

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

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

    【讨论】:

    • 正如所写,这不是答案。
    • @JonathanSampson 我是说他不应该更喜欢。
    • @EvanMulawski 方法 3 采用匈牙利表示法。 :)
    • 这有一个缺点,你不能在参数和成员名称之间进行机械转换,并且很快就会用完缩写。
    【解决方案4】:

    个人喜好

    但是这里有一个很好的非语言级别的讨论

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

    【讨论】:

    • Aaand 链接已失效
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

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

      选项 4

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

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

      【讨论】:

        猜你喜欢
        • 2011-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多