为什么我可以在方法中使用“this”

anh*_*ppe 0 c++ methods

好的,这是一个非常基本的问题。

我可以在 C++ 方法/成员函数中使用this指针的真正原因是什么?

换句话说:当我有

class foo
{
    void bar();
}
Run Code Online (Sandbox Code Playgroud)

为什么我可以使用

void foo::bar()
{
    this->...
}
Run Code Online (Sandbox Code Playgroud)

我可以想象两种可能性:

  1. 它是某种自动创建的成员变量吗
  2. 它作为参数传递给每个方法(因此每个方法都由该参数自动扩展)

Tom*_*sen 5

正如其他几个人指出的那样,this关键字通常由编译器通过将其作为第一个参数传递给成员函数来实现,因此成员函数:void SomeClass::func(int a, int b)在内部看起来像:void SomeClass::func(SomeClass* this, int a, int b),而 const 版本像这样:void SomeClass::func(const SomeClass* this, int a, int b)

然而,我觉得最有趣的是,它不是由标准强制执行的。

C++ 标准说(§ 9.3.2 ad 1):

在非静态 (9.3) 成员函数的主体中,关键字 this 是一个纯右值表达式,其值是调用该函数的对象的地址。类的成员函数中 this 的类型XX*. 如果成员函数声明为 const,则 this 的类型为const X*,如果成员函数声明为 volatile,则 this 的类型为volatile X*,如果成员函数声明为 const volatile,则 this 的类型为const volatile X*。[ 注意:因此在 const 成员函数中,调用该函数的对象是通过 const 访问路径访问的。——尾注]

这很有趣,因为与许多其他事情一样,C++ ABI主要留给编译器,这可能很麻烦。因此,虽然对于大多数编译器(甚至可能是全部)来说这当然是正确的,这this是通过作为第一个参数隐式传递来实现的,但标准并不能保证它,所以它可以由新编译器以不同的方式实现,尽管我怀疑它会发生。