有什么理由使用这个 – >

我用C ++编程了很多年,对于一件事我仍然有疑问。 在其他人的许多地方代码我看到像这样的东西:

void Classx::memberfunction() { this->doSomething(); } 

如果我需要导入/使用那个代码,我只是删除这个 – >部分,我从来没有看到任何破碎或有一些副作用。

 void Classx::memberfunction() { doSomething(); } 

那么,你知道有什么理由使用这样的结构吗?

编辑:请注意,我在这里谈论成员函数,而不是variables。 我明白它可以用来当你想区分一个成员variables和函数参数。

编辑:明显的重复: 是否有任何理由不使用“这个”(“自我”,“我”,…)?

为了保证您触发编译器错误,如果有一个macros可能被定义与您的成员函数相同的名称,并且您不确定它是否可靠未定义。

没有开玩笑,我敢肯定,我必须这样做正是因为这个原因!

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

 template<typename T> class A { protected: T x; }; template<typename T> class B : A<T> { public: T get() { return this->x; } }; 

由于在C ++编译器中查找名称的详细信息,必须明确指出x是类的(inheritance)成员,最容易用this->x 。 但是这是一个相当深奥的情况,如果你没有模板化的类层次结构,你并不需要明确地使用this来访问类的成员。

如果在同一个范围内有另一个同名的variables,则this->将消除模糊性。

 void Bar::setFoo(int foo) { this->foo = foo; } 

此外,它明确指出你正在引用一个成员variables/函数。

作为“代码原因”,从成员中区分一个本地参数或值(优先):

 class Foo { int member; void SetMember(int member) { this->member = member; } } 

然而,这是不好的开始,通常可以在当地解决。

第二个原因是更多的“环境”:它有时帮助智能感知过滤我真正想要的东西。 不过,我也是当我用这个find我要找的成员的时候我也应该删除这个。

所以是的,有很好的理由,但是都是暂时的(从长远来看也是糟糕的)。

我可以想象可读性,比如当你使用额外的括号把事情弄清楚的时候。

我认为这主要是为了帮助读者。 它明确指出被调用的是对象上的方法,而不是普通的函数。 在阅读代码时,知道被调用的函数可以改变当前对象中的字段是有帮助的。

这已经被问了好几次了,但是很难find它,因为“这个”似乎是search的终结词。

这是我自己的问题: 是否有任何理由不使用“这个”(“自我”,“我”,…)?

这样做的目的是为了明确所使用的variables是一个成员variables,而不是局部variables或全局variables。 在大多数情况下,这并不是必须的,但是如果您在更严格的范围内声明相同名称的variables,则显式说明范围可能会有所帮助。

在我工作过的公司,我们只是在成员variables前面加上了“m_”。 有时可能会有所帮助,我更喜​​欢使用“this->”。

编辑:添加一个链接到GCC文档 ,它解释了使用this->来获得非依赖性查找才能正常工作的情况。

这实际上是风格问题,适用于许多其他语言,如Java和C#。 有些人喜欢看到明确的this (或self ,或Me ,或其他),而其他人则不这样做。 只要按照你的风格指南去做,如果是你的项目,你就可以决定指导原则。

我不认为它对编译器有什么影响,但我总是写这个 – >,因为我相信它使代码自我logging。

消歧:如果在同一个命名空间中有另一个类似的命名函数/variables? 我从来没有见过任何其他原因使用。

这是你自己的select。 当你使用这个时,我发现它更清楚。 但是,如果你不喜欢它,你可以忽略它。

我更喜欢没有明确的这个指针。 对于方法调用来说,它不会增加很多值,但它有助于将局部variables与成员variables区分开来。

我不记得确切的情况,但是我已经看到(非常罕见的)例子,我必须编写“this-> membername”来成功地用GCC编译代码。 我记得的一点是,这与模糊不清有关,因此花了我一些时间来找出解决办法。 在Visual Studio中,不使用this->编译好的代码。

另一种情况是,在C ++ 11之后,这种情况已经发生在this被捕获的lambda上。

你可能有这样的东西:

 class Example { int x; public: std::function<void()> getIncrementor() { return [this] () -> void { ++(this->x); } } }; 

尽pipe你的lambda是在一个类中生成的,但是它只能通过捕获局部variables(如果你的编译器是C ++ 14)或者捕获它来访问局部variables。 在第二种情况下,lambda的内部,根本不是x ,但只有this->x

我将用它来隐式调用操作符(下面的返回和参数types只是组成代码的假象)。

 struct F { void operator[](int); void operator()(); void f() { (*this)[n]; (*this)(); } void g() { operator[](n); operator()(); } }; 

我更喜欢*this语法。 它有一个稍微不同的语义,因为使用*this不会隐藏与会员同名的非成员操作符函数。

有很多很好的答案,但是没有一个提到在源代码中使用this->使得它更容易阅读,特别是当你正在阅读一些长函数的代码,但是即使是一个简短的函数,想象一下代码:

 bool Class::Foo() { return SomeValue; } 

从看这个代码,你不能清楚地知道SomeValue是什么。 它可能甚至是一些#定义,或静态variables,但如果你写

 bool Class::Foo() { return this->SomeValue; } 

你清楚地知道SomeValue是同一个类的非静态成员variables。

因此,它不仅帮助您确保函数或variables的名称不会与其他名称发生冲突,而且还会使其他人更容易阅读和理解源代码,有时编写自我logging源代码非常重要。