我应该在课堂上使用`this`吗?

Ben*_*Ben 23 c++ class this

在C++中的一个类的成员函数中,如果我使用this->dataMember或只是 dataMember?它会有所作为吗?什么被认为是更好的风格?有任何性能差异吗?

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

Jam*_*nze 31

作为一般规则,这是一个地方惯例的问题.this->除非必要,我见过的大多数地方都没有使用,这也是我更喜欢的惯例,但我听说有人喜欢系统地使用它.

有必要时有两种情况.第一个是你在本地范围内隐藏了同名的名字; 如果您有一个名为的成员toto,并且您还命名了您的函数参数toto.许多编码约定标记成员或argments以避免这种情况,例如所有成员名称以my或开头m_,或者参数名称将以the.

另一种情况是this->可以在模板中使用以使名称相关.如果模板类继承自依赖类型,并且您想要访问基类的成员,则这是相关的,例如:

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

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

  • 这是一个很好的答案,我没有考虑模板案例。 (2认同)

asc*_*ler 7

这是一种风格问题.有些人喜欢这个额外的东西this->,让你更明显的是你正在访问一个班级成员.但如果你觉得没有它就足够明显,生成的代码或性能就没有区别了.

(除了您提到的重叠范围的情况,this->在尝试命名依赖于类型的基类的成员时,在模板中也是必需的.)


Not*_*fer 5

this->除非你想在语义上快速区分本地人和成员,否则用来呼叫成员是多余的.很多人都m_为班级成员使用前缀,以避免一直写作this->.


Phi*_*ipp 5

我总是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();
}
Run Code Online (Sandbox Code Playgroud)

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

我不认为社区内有这方面的强烈意见.使用任何一种风格,但要保持一致.

有任何性能差异吗?

我很确定没有.