好的,这是一个非常基本的问题。
我可以在c ++方法/成员函数中使用 this 指针的真正原因是什么?
换句话说:当我有
时class foo
{
void bar();
}
为什么我可以使用
void foo::bar()
{
this->...
}
我可以想象两种可能性:
答案 0 :(得分:4)
正如其他几个人所指出的,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.2ad 1):
在非静态(9.3)成员函数的主体中,关键字this是一个prvalue表达式,其值是调用该函数的对象的地址。类
X
的成员函数中的类型为X*
。如果成员函数声明为const,则其类型为const X*
,如果成员函数声明为volatile,则其类型为volatile X*
,如果成员函数声明为const volatile,则类型为这是const volatile X*
。 [注意:因此在const成员函数中,调用函数的对象是通过const访问路径访问的。 - 后注]
这很有意思,因为与许多其他事情一样,C ++ ABI主要留给编译器,这可能很麻烦。因此,虽然对于大多数编译器(甚至可能是全部)来说肯定是正确的,但this
通过隐式传递作为第一个参数来实现,但标准不能保证它,因此它可以通过新的方式实现。编译器,虽然我怀疑它会发生。
答案 1 :(得分:3)
当在类成员上调用成员函数时,C ++使用关键字="Q"&ceiling(month(A)/3)
来引用类似于指向调用该函数的类实例的不可修改指针的内容。它的行为就好像它是函数的参数。
您可以将this
视为foo.bar(1);
类似。
你可以想到
bar(&foo, 1);
类似int foo::f(int);
。
答案 2 :(得分:1)
如果查看类函数的汇编代码,您会注意到传递了一个隐藏参数。此参数称为this指针,只不过是当前对象的地址。如果未传递此地址,则编译器将不知道要调用哪个对象。另一种用法是返回一个当前对象地址,这对于后续操作(特别是赋值)在操作符重载时非常有用。