"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)
执行,方法中的代码可以访问参数a
、b
和c
,还可以访问指针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
我在某处读到,“this”关键字是 class 的任何方法中的默认参数(我想它是不可见的或其他东西)。 这是真的吗?
你可以这么想;即当您进行方法调用时
myObject.Foo(1, 2, 3);
并且方法Foo(int a, int b, int c)
执行,方法中的代码可以访问参数a
、b
和c
,还可以访问指针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