this pointer
这个指针
句法
this | | |
---|
关键词this
是prvalue表达其值为调用成员函数的对象的地址。它可以出现在以下上下文中:
1%29内的任何非静电体成员函数,包括成员初始化列表
2%29声明在%28可选%29 cv-限定符序列之后的任何位置,包括动态异常规范28%被反对的人占29%,除规格外%28C++11%29,尾随返回类型%28自C++11%29
3%29默认成员初始化器%28自C++11%29
类型this
在类的成员函数中X
是X*
%28指针到X
%29。如果成员函数是简历-合格,类型this
是cv X*
%28指针指向相同的cv-限定X
%29。由于构造函数和析构函数不能被cv限定,所以this
在他们里面总是X*
,即使在构造或破坏Const对象时也是如此。
在任何上下文中使用非静态类成员时,this关键字允许%28非静态成员函数体、成员初始化程序列表、默认成员初始化器%29、隐式成员初始化项。this->在名称之前自动添加,从而生成成员访问表达式%28,如果成员是虚拟成员函数,则会导致调用%29的虚拟函数。
在类模板中,this是依赖表达,以及显式this->可用于强制另一个表达式成为依赖项。
施工期间对象的值,如果对象或其任何子对象的值是通过不是直接或间接从构造函数%27s获得的glvalue访问的。this
指针,因此获得的对象或子对象的值未指定。换句话说,不能在构造函数中别名此指针:
二次
extern struct D d;
struct D {
D(int a) : a(a), b(d.a) {} // b(a) or b(this->a) would be correct
int a, b;
};
D d = D(1 // because b(d.a) did not obtain a through this, d.b is now unspecified
二次
可以执行delete this;
,如果程序能够保证将对象分配给new
但是,这会使指向已分配对象的每个指针都无效,包括this
指针本身:后面delete this;
返回时,该成员函数不能引用类%28的成员,因为这涉及到this
%29并且不能调用其他成员函数。例如,在控件块的成员函数中使用std::shared_ptr
当对托管对象的最后一次引用超出作用域时,负责减少引用计数。
二次
class ref
{
// ...
void incRef() { ++mnRef; }
void decRef() { if (--mnRef == 0) delete this; }
};
二次
例
二次
class T
{
int x;
void foo()
{
x = 6; // same as this->x = 6;
this->x = 5; // explicit use of this->
}
void foo() const
{
// x = 7; // Error: *this is constant
}
void foo(int x) // parameter x shadows the member with the same name
{
this->x = x; // unqualified x refers to the parameter
// 'this->' required for disambiguation
}
int y;
T(int x) : x(x), // uses parameter x to initialize member x
y(this->x) // uses member x to initialize member y
{}
T& operator= ( const T& b )
{
x = b.x;
return *this; // many overloaded operators return *this
}
};
class Outer {
int a[sizeof(*this)]; // error: not inside a member function
unsigned int sz = sizeof(*this // OK: in default member initializer
void f() {
int b[sizeof(*this)]; // OK
struct Inner {
int c[sizeof(*this)]; // error: not inside a member function of Inner
};
}
}
二次
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。