这个 - >引用一切

Ili*_*oly 14 c++

我最近花了很多时间使用javascript,现在又回到了C++.当我从一个方法访问一个类成员时,我倾向于为它添加前缀this->.

class Foo {

  int _bar;

public:  
  /* ... */

  void setBar(int bar) {
    this->_bar = bar;
    // as opposed to
    _bar = bar;
  }
}
Run Code Online (Sandbox Code Playgroud)

在阅读时,它在试图找出它来自何处时为我节省了大脑周期.
我有什么理由不这样做吗?

Yak*_*ont 13

对类变量使用this->是完全可以接受的.

但是,不要使用下划线启动标识符,也不要__在任何地方包含带双下划线的任何标识符.如果违反这两条经验法则,有些类型的保留符号很容易被击中.(特别是,_IdentifierStartingWithACapital由编译器的标准保留).

  • 国际海事组织,"完全可以接受"是夸大事物.*编译器*不会抱怨,但是您应该编写代码以供其他程序员可读,而不仅仅是编译器.从这个角度来看,这显然是一种不好的做法,绝对应该避免. (3认同)
  • 接受这个答案就是保罗西蒙曾经唱过的一个例子,"一个男人听到了他想听的东西而忽视了其余的东西." (3认同)
  • @John如果整个项目使用`this->`进行所有成员变量访问,你会感到困惑,并认为他们每次记录隐藏的成员变量访问权限? (2认同)

Zan*_*ane 10

原则上,访问成员this->是一种编码风格,可以帮助使事情更清晰,但它似乎是一个品味的问题.

但是,您似乎也使用前缀成员_(下划线).我会说那太多了,你应该选择这两种风格中的任何一种.

  • 你不应该用下划线作为前缀. (4认同)
  • @dan:使用单个下划线为成员添加前缀(如果它们不以大写字母开头)是完全正确的.这些类型的评论称为"邪教程序设计",表明对规则的误解并传播误解 (4认同)
  • 我通常用下划线为我的成员添加后缀.前缀可以导致使用保留名称. (2认同)

Joh*_*ing 7

我有什么理由不这样做吗?

是的,有一个原因你不应该这样做.

仅在隐藏名称时才this->严格要求引用成员变量,例如:

class Foo
{
public:
    void bang(int val);
    int val;
};

void Foo::bang(int val)
{
    val = val;
}

int main()
{
    Foo foo;
    foo.val = 42;
    foo.bang(84);
    cout << foo.val;

}
Run Code Online (Sandbox Code Playgroud)

该程序的输出42不是84,因为在bang成员变量中已被隐藏,并val = val导致无操作.在这种情况下,this->需要:

void Foo::bang(int val)
{
    this->val = val;
}
Run Code Online (Sandbox Code Playgroud)

在其他情况下,使用this->没有效果,因此不需要.

这本身并不是不使用的理由this->.然而,这种程序的维护是不使用的理由this->.

您正在使用this->文档来指定后面的可变项是成员变量.但是,对于大多数程序员来说,这并不是this->实际文档的标志.使用this->文件的是:

有一个名字已隐藏在这里,所以我正在使用一种特殊的技术来解决这个问题.

由于这不是您想传达的内容,因此您的文档已被破坏.

而不是使用this->记录名称是成员变量,使用一致的合理命名方案,其中成员变量和方法参数永远不会相同.

编辑 考虑同一想法的另一个例子.

假设在我的代码库中,你发现了这个:

int main()
{
    int(*fn)(int) = pingpong;
    (fn)(42);
}
Run Code Online (Sandbox Code Playgroud)

相当不寻常的构造,但作为一名熟练的C++程序员,你会看到这里发生了什么. fn是一个指向函数的指针,并被分配了值pingpong,无论是什么.然后pingpong使用单int值调用指向的函数42.所以,想知道为什么世界上你需要这样一个小发明,你去寻找pingpong并找到这个:

static int(*pingpong)(int) = bangbang;
Run Code Online (Sandbox Code Playgroud)

好的,那是bangbang什么?

int bangbang(int val)
{
    cout << val;
    return val+1;
}
Run Code Online (Sandbox Code Playgroud)

"现在,等一下.世界上到底发生了什么?为什么我们需要创建一个指向函数的指针,然后调用它?为什么不调用函数?这不是一样的吗?"

int main()
{
    bangbang(42);
}
Run Code Online (Sandbox Code Playgroud)

是的,它是一样的.可观察到的影响是相同的.

想知道这是否真的存在,你会看到:

/*  IMPLEMENTATION NOTE
 *
 *  I use pointers-to-function to call free functions
 *  to document the difference between free functions
 *  and member functions.
 */
Run Code Online (Sandbox Code Playgroud)

因此,我们使用指向函数的唯一原因是显示被调用的函数是自由函数而不是成员函数.

这对你来说似乎只是一种"风格问题"吗?因为这对我来说似乎很精神错乱.