为什么我可以在方法中使用'this'
Why can I use 'this' in methods
好的,这是一个非常基本的问题。
我可以在 c++ 方法/成员函数中使用 this 指针的真正原因是什么?
换句话说:当我有
class foo
{
void bar();
}
为什么我可以使用
void foo::bar()
{
this->...
}
我可以想象两种可能性:
- 它是某种自动创建的成员变量吗
- 它作为参数传递给每个方法(因此每个方法都由该参数自动扩展(
正如其他几个人所指出的,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 指针,只不过是当前对象的地址。如果未传递此地址,则编译器将不知道要调用哪个对象。另一种用法是返回一个当前对象地址,该地址在后续操作(尤其是赋值(的运算符重载中非常有用。
- 函数向量_指针有不同的原型,我可以构建一个吗
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 为什么我可以通过引用修改常量返回
- 我可以在 C++ 中的函数体之外进行操作吗?
- 我可以重新分配/覆盖std::字符串吗
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 为什么我可以使用比分配的内存更多的内存
- 在一个读写器队列中,我可以用volatile替换原子吗
- 我可以把基础班提升为儿童班吗
- 我可以做些什么来消除或最小化这种将提供相同功能和行为的代码重复
- 我可以使用什么来停止循环而不是"返回 0"?
- 假设我有作业运算符,我的复制构造函数是this = obj可以
- 为什么我可以在方法中使用'this'
- 我可以在运算符=中使用placement new(this)吗
- 我可以有一个返回*this并处理非常量对象的const成员函数吗