有什么理由使用这个 – >
我用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源代码非常重要。