什么时候应该使用this->?

5
我想知道这个->是否应该同时使用:
void SomeClass::someFunc(int powder)
{
     this->powder = powder;
}

//and
void SomeClass::someFunc(bool enabled)
{
     this->isEnabled = enabled;
}

我想知道后者是否必须正确,或者isEnabled = enabled就足够了。
谢谢

2
为什么不直接试一下呢?只有在存在歧义的情况下才需要使用 this->(例如第一个情况,其中参数优先级更高,但还有其他情况,比如某些晦涩的模板情况)。 - falstro
我知道什么是有效的,什么是无效的,我只是想知道哪种是适当的面向对象编程。 - jmasterx
9
正确的面向对象编程并未对此发表评论。就像括号位置一样,这是一种编码风格问题。 - stonemetal
1
当你喜欢 IntelliSense(又称自动完成)时,它是常用的。 - Hans Passant
@GeneBushuyev 不要混淆你的代码。如果可能指定this,请使用它。唯一的例外是静态变量(特别是那些因某种原因喜欢在静态和动态之间移动的变量)。PS-我同意stonemetal关于风格的看法。尤其是当你心情非常糟糕时,确保所有以m_为前缀的变量都有this->在前面是很好的。如果编码标准被设计成丑陋的,请不要阻挡它的道路。 - user645280
显示剩余2条评论
4个回答

4
this->

当直接使用成员会产生歧义时,需要使用别名。这可能发生在模板代码中。

考虑以下情况:

#include <iostream>

template <class T>
class Foo
{
   public:
      Foo() {}
   protected:
      void testing() { std::cout << ":D" << std::endl; }
};

template <class T>
class Bar : public Foo<T>
{
   public:
      void subtest() { testing(); }
};

int main()
{
   Bar<int> bar;
   bar.subtest();
}

由于调用testing()取决于模板参数,因此这将失败。要表明您指的是该函数,您必须执行this->testing();Foo<T>::testing();

错误信息:

temp.cpp: In member function ‘void Bar<T>::subtest()’:
temp.cpp:16:32: error: there are no arguments to ‘testing’ that depend on a template parameter, so a declaration of ‘testing’ must be available [-fpermissive]
temp.cpp:16:32: note: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)

1
这不是因为模糊性,而是因为依赖名称的查找被推迟到实例化点。 - Gene Bushuyev

3

this仅仅是指向对象本身的指针。它是为了提高可读性而设计的,这样你就知道你正在引用对象的函数或变量,而不是函数内部的某些东西。

我认为除了可读性之外,没有其他好的理由:-)

如果您想避免模糊的引用,那么这也是很好的。假设您有一个全局变量和一个函数内部具有相同名称的变量,那么this->将引用全局变量。


在某些情况下,这有助于消除歧义(尽管这可能是一个可读性问题)。 - Nate

1

我认为在C++中可以省略this->,但这可能是个人偏好。无论是否使用该代码,其功能仍然相同。


0

我倾向于遵循这个简单的规则:

  • 属性:如果它不是方法的参数,那么显然就是类的属性(我通常依赖命名约定来区分它们),不使用this
  • 方法:使用this->来区分类方法和独立函数

第二个原因是为了保持一致性,因为在template代码中可能需要它(尤其是在我的个人项目中,我写过很多这样的代码)。

这背后的理念很简单:写出足够的内容以明确表达意思(即使你的读者更容易理解),但不要多写(这会导致冗余),如Antoine de Saint-Exupery所说:

完美不是当你无法再增加时,而是当你无法再减少时。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接