我应该在课堂上使用“this”吗

Should I use `this` within a class?

本文关键字:this 课堂 我应该      更新时间:2023-10-16

在C++中的类的成员函数中,如果我使用this->dataMember还是仅使用dataMember,会有什么不同吗?什么被认为是更好的风格?性能有什么不同吗?

(我不是在谈论局部变量与数据成员同名的情况,据我所知,在这种情况下,您必须使用this->来区分它们。)

一般来说,这是一个地方惯例的问题。大部分我见过的地方除非必要,否则不使用this->我也喜欢大会,但我听说有人喜欢系统地使用它。

有两种情况是必要的。第一个是如果你隐藏了本地范围内具有相同名称的名称;如果你有会员命名为toto,您还将函数参数命名为toto。许多的编码约定标记成员或参数以避免这种情况大小写,例如所有成员名称都以mym_开头,或参数名称将从CCD_ 9开始。

另一种情况是this->可以在模板中用于创建名称依靠的如果模板类继承自依赖类型,并且您想要访问基础的成员,例如:

template <typename T>
class Toto : public T
{
public:
    int f()
    {
        return this->g();
    }
};

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

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

  1. 它将函数名转换为依赖名称,以便在类模板中找到基类成员函数
  2. 它禁止依赖于参数的查找。ADL有它的优点,但它会导致令人惊讶的行为,如果它不妨碍我的话,我喜欢它
  3. 它没有真正的缺点,因此出于一致性的原因,我将它用于所有成员函数调用
  4. 我用Python编写了很多程序,其中明确的self是强制性的,所以这对我来说并不是一个真正的负担

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

在C++中一个类的成员函数中,如果我使用这个->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();
}

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

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

性能有什么不同吗?

我敢肯定没有。

这是一个风格问题。有些人喜欢额外的this->,这样可以更明显地表明您正在访问类成员。但是,如果您觉得没有它就足够明显,那么生成的代码或性能就不会有任何差异。

(除了您提到的作用域重叠的情况外,当尝试命名依赖类型的基类的成员时,this->在模板中也是强制性的。)

使用this->调用成员是多余的,除非您想快速在语义上区分本地和成员。很多人使用m_前缀作为类成员,以避免一直写this->

当你有一个隐藏/私有成员时使用这个=)在任何其他情况下都没有区别=)

在IBM信息中心,我引用了以下

除非隐藏了类成员名称,否则使用该类成员名称相当于将类成员名称和此指针一起使用类成员访问运算符(->)。

使用"this->"更好(您确信是成员),但它不会产生任何影响

如果模板函数调用成员函数,使得该调用不依赖于任何模板参数,则this->可用于帮助编译器作为MyUtopicClass<int, double, double>::vin()的替代方案。