3

这是我在编写 C++ 时经常做的事情,我一直想知道它是否是一个“坏”习惯(这种行为是否标准化?)

假设我有一堂课:

Class Foo {
  public:
    Foo(int x) {
      //this->x is the member "x" of Foo
      //x is the paramater "x" to the function
      this->x = x; //Sets Foo::x to x (parameter x)
    }

  private:
    int x;


};

请注意Foo::Foo(int x),参数是如何命名x的,它与成员变量的名称相同Foo

我通常只使用 usethis->x = x;为成员变量分配参数的值,这似乎对我有用(我通常使用 MSVC)。在 MSVC(和我认为的 GCC)中,访问x将访问参数 namedx而不是成员named x。这是所有 c++ 编译器的标准化行为吗?是否有任何东西阻止编译器仅x与成员变量而不是参数变量关联?(例如:this->x;相当于this->x = this->x;

4

3 回答 3

5

我同意 Rob 的观点,任何符合标准的编译器都可以让你做你正在做的事情,但你的代码很难阅读。

命名约定非常重要。选择一个命名约定,并且永远不要在同一个程序中更改它。

我在使用 C++ 编程时使用此指南:http: //geosoft.no/development/cppstyle.html 这是最常见的命名约定列表,每个都包含一个简短说明,说明为什么选择该特定命名约定。复制此列表并根据自己的喜好对其进行自定义。

第 11 项(根据命名约定)直接解决了您的问题,并为您提供了更好的选择。

于 2013-10-18T23:52:54.010 回答
5

是的,使用任何兼容的编译器,参数x将隐藏 member x。然而,与您所写的内容相比,一个更有趣的替代方法是:

class Foo {
public:
    Foo(int x) : x(x) {}
private:
    int x;
};

除了不可读之外,它实际上会完全按照您的意愿行事。

于 2013-10-18T23:41:52.537 回答
0

尽管初始化列表可能是规范的方法,但分配发生的顺序不受您的控制。但是,简单地将'm_'或添加'_'到您的成员是使用的一种方法。另一种方法是采用约定在'_'您的参数之前添加(如果您喜欢更简洁的成员变量声明)。像这样,

class Foo {
public:
    Foo(int _x) : x(_x), y(0) {}
    Foo(int _x,int_y) { x=_x; y=_y; }
private:
    int x, y;
};

使用它也很有效。

于 2013-10-19T00:32:12.760 回答