有没有理由使用这个 - >

Mil*_*kov 16 c++

我用C++编程多年,但我对一件事情仍有疑问.在其他人代码的许多地方,我看到类似的东西:

void Classx::memberfunction()
{
    this->doSomething();
}
Run Code Online (Sandbox Code Playgroud)

如果我需要导入/使用该代码,我只需删除this-> part,我从未见过任何破坏或有一些副作用.

void Classx::memberfunction()
{
    doSomething();
}
Run Code Online (Sandbox Code Playgroud)

那么,你知道使用这种结构的任何理由吗?

编辑:请注意我在这里谈论成员函数,而不是变量.我知道当你想要区分成员变量和函数参数时,可以使用它.

编辑:明显重复: 有没有理由不使用"这个"("自我","我",......)?

sth*_*sth 39

它真正有所作为的唯一地方是派生类中的模板:

template<typename T>
class A {
protected:
  T x;
};

template<typename T>
class B : A<T> {
public:
  T get() {
    return this->x;
  }
};
Run Code Online (Sandbox Code Playgroud)

由于C++编译器中名称查找的细节,必须明确说明它x是类的(继承)成员,最容易完成this->x.但这是一个相当深奥的案例,如果你没有模板化的类层次结构,你真的不需要显式地使用它this来访问类的成员.


drb*_*rby 28

如果同一范围内的另一个变量具有相同的名称,则this->将消除歧义.

void Bar::setFoo(int foo)
{
    this->foo = foo;
}
Run Code Online (Sandbox Code Playgroud)

此外,它清楚地表明您正在引用成员变量/函数.

  • 只是回答这个问题. (5认同)
  • 在我看来,像这样使用它使它成为不良命名约定的创可贴。它不必要地使代码变得混乱。 (3认同)
  • @MadKeithV: this-&gt; 是一种语言和工具支持的命名约定,与 m_ 前缀不同。 (2认同)

And*_*ent 8

如果存在可能使用与您的成员函数同名的宏定义并且您不确定它是否已被可靠地定义,则可以保证触发编译器错误.

不开玩笑,我很确定我必须这样做才是出于这个原因!

  • 如果应用于函数,它具有保证调用可能虚函数的哪个版本的效果,防止多态并且通常用于调用覆盖函数的父函数.它不是这个 - > doSomething()的安全等价物. (7认同)
  • 似乎没有人提到另一种解析成员名称的方法是使用http://en.wikipedia.org/wiki/Scope_resolution_operator.例如Classx :: doSomething(); (3认同)
  • 是的,我已经忘记了这个案子!谢谢安迪。 (2认同)

pet*_*hen 5

作为“代码原因”,要从成员中区分局部参数或值(优先级):

class Foo
{
    int member;
    void SetMember(int member)
    {
       this->member = member;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这种做法一开始就不好用,通常可以在本地解决。

第二个原因是更多的“环境”:有时它可以帮助Intellisense过滤我真正想要的东西。但是,当我使用它来查找我要寻找的成员时,我也很重要,也应该删除它。

所以是的,有充分的理由,但是它们都是暂时的(从长远来看,这是不好的)。

  • 我不同意这一定是一个坏习惯。如果您对一个对象或变量有一个好的,清楚的,含糊的名称...为什么要更改它? (2认同)