【问题标题】:Parameters Naming for Constructor构造函数的参数命名
【发布时间】:2009-11-23 03:14:21
【问题描述】:

在 Java 中,通常我可以将构造函数的参数与成员变量同名。

public A(int x)
{
    this.x = x;
}

private int x;

在 C++ 中,我不能。通常,我必须这样做。

public:
    A(int x_) : x(x_) 
    {
    }

private:
    int x;

有没有更好的方法?由于构造函数参数名称难看,IDE IntelliSense 会弹出构造函数参数窗口。

【问题讨论】:

  • 这个问题毫无意义,因为它基于一个不正确的前提:你断言你不能在 C++ 中做到这一点。好吧,你可以。就像您在 Java 中所做的那样。所以,没有问题。你从哪里得到这个用 C++ 做不到的奇怪想法?

标签: c++


【解决方案1】:

在 C++ 中,如果需要,您可以:

struct A {
  int x;
  A(int x) : x(x) {
    foo(this->x);
    // if you want the member instead of the parameter here
  }
};

虽然我也经常为成员使用风格名称(例如_x),但我为非公开成员使用。如果x 在本例中是公共的,我会这样做,如果我认为它更具可读性,请考虑重命名 ctor 的参数。

编辑:由于人们似乎走偏了,我将在_x 上澄清一下。该标准保留了一些标识符名称:

  • 任何名称空间中带有两个相邻下划线的名称
  • 任何名称空间中前导下划线后跟大写字母的任何名称
  • 在全局范围内带有前导下划线的任何名称

由于成员的范围仅限于类,因此它们不属于第三类。也就是说,最好不要继续偏离轨道。 :) 如果您愿意,请随时询问有关 C++ 中保留标识符的问题,并在 cmets 中发布指向它的链接。

【讨论】:

  • 你不应该用前导下划线命名事物
  • -1。 C++ 标准 17.4.3.1.2/1:“以下划线开头的每个名称都保留给实现,用作全局命名空间中的名称。”
  • 数据成员不在全局命名空间中。
  • 数据成员可以隐藏全局命名空间中的成员。这可能是不受欢迎的行为。
  • 例如,实现可以在operator new 中使用_x。这意味着每次在类实现中调用全局 operator new 时,您都会在 A::_x 中获得未定义的值。
【解决方案2】:

您实际上可以在 C++ 中以 Java 方式执行此操作:

public:
    A(int x)
    {
        this->x = x;
    }

但也可以只说 x(x):

public:
    A(int x) : x(x) { }

【讨论】:

  • 可以使用 ctor 初始化器来做到这一点。
  • 谢谢,我刚刚测试并更新了我的答案,尽管我也支持你的答案。
【解决方案3】:

C++ 足够聪明,可以识别出你的意思是哪个x,你可以这样写:

class A {
  int x;
  A( int x ) : x(x) {};
};

【讨论】:

    【解决方案4】:

    Google style 是让成员后面有下划线:

    public:
      A(int x) : x_(x) {
      }
    
    private:
      int x_;
    

    漂亮多了。

    【讨论】:

    • Google 的需求往往与其他人的需求大不相同,他们的 C++ 风格指南反映了这一点。如果您正在编写供 Google 使用的代码,我会推荐它;在所有其他情况下,请先仔细查看他们的推理。
    • @Roger:说得好,我绝不是建议随便采用整个 Google 风格指南。但是,我发现他们的 C++ 风格指南总体上是通用的。在这种情况下,Microsoft 样式将是 int m_x 或 int _x。在我们讨论的范围内,每个人都会同意成员函数应该以某种方式进行区分。我只是指出我碰巧喜欢的一种观点。
    • 我确实认为您理解我的观点,但我认为在您的示例中并不明显,而且我认为其他人可能会误解并不恰当地应用 Google 的选择。 (所以这就是反对票的原因。)
    【解决方案5】:

    我认为这是不可能的。但是,我强烈建议对成员变量使用一致的命名约定,以将它们与参数和局部变量区分开来。

    在我的公司里,我们通常用'm'前缀来表示成员变量,例如:

    int mMyMemberVariable;
    

    int m_MyMemberVariable;
    

    这只是风格的一个例子——一致性是关键。

    【讨论】:

      【解决方案6】:

      一种方法(有些人可能认为这是 C++ 方法)是在类的字段前面加上 m_ 以消除字段和构造函数参数名称之间的歧义。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-31
        • 2020-11-08
        • 1970-01-01
        • 1970-01-01
        • 2021-05-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多