"this" 是 class 方法中的默认参数吗?

Is "this" a default parameter in a class method?

我在某处读到,“this”关键字是 class 的任何方法中的默认参数(我想它是不可见的或其他东西)。 这是真的吗?

你可以这么想;即当您进行方法调用时

myObject.Foo(1, 2, 3);

并且方法Foo(int a, int b, int c)执行,方法中的代码可以访问参数abc,还可以访问指针this:

void MyObjectClass :: Foo(int a, int b, int c)
{
   printf("a=%i b=%i c=%i this=%p\n", a, b, c, this);
}

... this 没有在参数列表中明确列出,但它作为 method-call 的一部分传递(因为没有它,Foo 将无法访问它自己的任何一个 member-variables,这对大多数方法来说都是一个问题)

“默认参数”是错误的术语。 this 可以被认为是传递给成员函数的隐式参数。如果没有成员函数,那么您可以使用这样的自由函数来模拟它们:

struct Foo {
    int x = 0;
};

void set_x(Foo* THIS, int x) {
    THIS->x = x;
}

然而,成员函数确实存在,上面可以写成:

struct Foo {
    int x = 0;
    void set_x(int x) {
       this->x = x;
    }
};

this 未显式传递给 Foo::set_x。尽管如此,在方法内部您可以使用它来引用当前对象。可以说是成员函数的隐式参数。

然而,这还不是全部。在成员函数中,您实际上不需要 this 来引用 class 的成员。除了 this->x 之外,仅 x 也可以工作,并且与其他语言相比,除非必要,否则省略 this-> 是常见的风格。有关详细信息,请参阅 https://en.cppreference.com/w/cpp/language/this.

请注意,它不是 class 的 所有 方法的隐式参数。在静态成员函数中不能通过this引用当前对象,因为静态成员函数中没有“当前对象”。

也与 python 比较,其中 self 被显式传递:

 class Foo:
     def __init__(self):
          self.x = 0
     def set_x(self,x):
          self.x = x