我应该在类中使用`this`吗?

43

在C++类的成员函数中,是否使用this->dataMember与只使用dataMember有所区别?哪种方式被认为更好?是否有性能差异?

(我不是在讨论本地变量与数据成员名称相同的情况,在这种情况下,必须使用this->来区分它们。)

7个回答

53
作为一般准则,这是一个本地惯例的问题。大多数我见过的地方除非必要不使用this->,这也是我偏爱的惯例,但我听说有些人更喜欢系统地使用它。
它是必要的两种情况。第一种情况是如果您在本地范围内隐藏了相同名称的名称;例如,您有一个名为的成员,并且您还命名了函数参数。许多编码约定标记成员或参数以避免这种情况,例如所有成员名称都以mym_开头,或者参数名称将以the开头。
另一种情况是this->可以在模板中用于使名称依赖于特定情况。如果模板类继承自依赖类型,并且您想访问基类型的成员,则这很重要。
template <typename T>
class Toto : public T
{
public:
    int f()
    {
        return this->g();
    }
};

如果没有这里的this->g()将是一个非依赖名称,编译器将在模板定义的上下文中查找它,而不考虑基类。


2
这是一个很好的答案,我没有考虑过模板情况。 - Joshua Hedges

14

当我调用成员函数时,我总是使用this

  1. 这将函数名转换为依赖名称,以便在类模板中查找基类成员函数。
  2. 它抑制了参数相关的查找。ADL具有其优点,但它可能导致令人惊讶的行为,如果不妨碍我的话,我喜欢它。
  3. 它没有真正的缺点,所以出于一致性考虑,我对所有成员函数调用都使用它。
  4. 我经常使用Python编程,其中明确的self是强制性的,因此对我来说并不是真正的负担。

但是对于数据成员,只有在必要时才使用它,因为没有进行ADL。回答您的具体问题:

在C ++中的类的成员函数中,如果我使用this->dataMember或者只是dataMember,会有区别吗?

是的,如果这在类模板内部,则认为dataMember是非依赖名称,这可能导致语义差异。例如:

#include <iostream>

int i = 1;

struct R {
  int i;
  R(): i(2) { }
};

template<typename T>
struct S: T {
  void f() {
    std::cout << i << ' '     // selects ::i
              << this->i      // selects R::i
              << std::endl;
  }
};

int main() {
  S<R>().f();
}

什么被认为是更好的风格?

我认为社区内对此并没有强烈的意见。可以使用任何一种风格,但要保持一致。

有性能差异吗?

我相信没有。


9
这是一种风格问题。一些人喜欢多加this->以使访问类成员更加明显。但如果你觉得没有它也很明显,那么生成的代码和性能不会有任何区别。
(除了你提到的作用域重叠的情况外,在模板中尝试命名类型依赖基类的成员时,this->也可能是必需的。)

8

只使用this->来调用成员是多余的,除非你想快速区分局部变量和成员变量之间的语义差异。 许多人在类成员中使用m_前缀,以避免一直写this->


3

当您有一个隐藏/私有成员时,请使用此方法=)在其他情况下,它没有任何区别=)

引用IBM信息中心的话:

除非类成员名称被隐藏,否则使用类成员名称等同于使用带有this指针和类成员访问运算符(->)的类成员名称。


1

使用 "this->" 更好(您可以确定它是成员),但这并没有什么区别


1
如果模板函数调用一个成员函数,而该调用不依赖于任何模板参数,则可以使用this->作为替代方法来帮助编译器,而不是MyUtopicClass<int, double, double>::vin()

6
注意:如果 vin 是一个虚函数,那么 this->vin()MyUtopicClass<int, double, double>::vin() 是不同的。 - aschepler

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