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

Why can I use 'this' in methods

本文关键字:this 我可以 方法 为什么      更新时间:2023-10-16

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

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

换句话说:当我有

class foo
{
    void bar();
}

为什么我可以使用

void foo::bar()
{
    this->...
}

我可以想象两种可能性:

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

正如其他几个人所指出的,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 是一个 prvalue 表达式,其值是为其调用函数的对象的地址。类X的成员函数中的 this 类型是 X* 。如果成员函数被声明为 const,则其类型为 const X*,如果成员函数声明为易失性,则其类型为 volatile X*,如果成员函数被声明为 const volatile,则其类型为 const volatile X* 。[ 注意:因此,在 const 成员函数中,调用该函数的对象是通过 const 访问路径访问的。

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

当在

类成员上调用成员函数时,C++使用关键字 this 来引用类似于指向调用该函数的类实例的不可修改指针的内容。它的行为就像它是函数的参数一样。

你可以把foo.bar(1);想象成有点像bar(&foo, 1);。你可以想到
int foo::f(int);有点像int f(foo const* this, int);.

如果您查看类函数的汇编代码,您会注意到传递了一个隐藏的参数。此参数称为 this 指针,只不过是当前对象的地址。如果未传递此地址,则编译器将不知道要调用哪个对象。另一种用法是返回一个当前对象地址,该地址在后续操作(尤其是赋值(的运算符重载中非常有用。