class ="no-loc" dir="ltr" lang="en-us">this -pointer">class ="no-loc" dir="ltr" lang="en-us">this pointer

class="no-loc" dir="ltr" lang="en-us">此指针是仅在 classclassstructunion 或 类型的非状态成员函数中可访问的指针。 它指向为其调用成员函数的对象。 静态成员函数没有 class ="no-loc" dir="ltr" lang="en-us">class 指针。

语法

class  ="lang-cpp">class ="no-loc" dir="ltr" lang="en-us">this class ="no-loc" dir="ltr" lang="en-us">this  - > member-identifier

注解

对象的 class ="no-loc" dir="ltr" lang="en-us">指针不是对象本身的一 class 部分。 它未反映在 对象上的 sizeof 语句的结果中。 为对象调用非状态成员函数时,编译器会将对象的地址作为隐藏参数传递给该函数。 例如,以下函数调用:

class  ="lang-cpp">myDate.setMonth ( 3 ) ;

可解释为:

class  ="lang-cpp">setMonth & ( myDate, 3 ) ;

对象的地址可从成员函数中作为此指针的 class ="no-loc" dir="ltr" lang="en-us">class 提供。 大多数 class ="no-loc" dir="ltr" lang="en-us">class 指针使用隐式。 在引用 的成员时,使用显式 class ="no-loc" dir="ltr" lang="en-us">这是合法的,但这是不必要的 classclass 。 例如:

class  ="lang-cpp">void Date::setMonth ( int mn ) { month = mn; // 这三个语句 class ="no-loc" dir="ltr" lang="en-us">this  - month = > mn; // 等效于 (* class ="no-loc" dir="ltr" lang="en-us">this ) .month = mn; }

表达式 *class ="no-loc" dir="ltr" lang="en-us">这通常用于从成员函数返回 *class 当前对象:

class  ="lang-cpp">return * class ="no-loc" dir="ltr" lang="en-us">this  ;

class="no-loc" dir="ltr" lang="en-us">此指针也用于防止 class 自引用:

class  ="lang-cpp">if (Object & != class ="no-loc" dir="ltr" lang="en-us">this ) { // 在自引用情况下不执行
class ="NOTE">

注意

由于 class ="no-loc" dir="ltr" lang="en-us">此指针不可修改,因此不允许向 classclass ="no-loc" dir="ltr" lang="en-us">分配此 指针。 C++ 的早期版本实现允许赋值为 class ="no-loc" dir="ltr" lang="en-us">此 class

有时 class ,="no-loc" dir="ltr" lang="en-us">此指针直接用于操作自引用数据 classstruct uri,其中当前对象的地址是必需的。

示例

class  ="lang-cpp">// class ="no-loc" dir="ltr" lang="en-us">this  _pointer.cpp // compile with: /EHsc #include < iostream #include >< string.h > using namespace std; classBuf { public: Buf ( char* szBuffer, size_t sizeOfBuffer ) ;Buf & 运算符= ( const Buf & ) ; void Display () { cout << buffer << endl; } private: char* buffer; size_t sizeOfBuffer; };Buf::Buf ( char* szBuffer, size_t sizeOfBuffer ) { sizeOfBuffer++; // account for a NULL 终止符缓冲区 = new char[ sizeOfBuffer ]; if (buffer) { strcpy_s ( buffer, sizeOfBuffer, szBuffer ) ; sizeOfBuffer = sizeOfBuffer; } }Buf & Buf::operator= ( const Buf & otherbuf ) { if ( & otherbuf != class ="no-loc" dir="ltr" lang="en-us">this ) { if (buffer) delete  [] buffer; sizeOfBuffer = strlen ( otherbuf.buffer ) + 1; buffer = new char[sizeOfBuffer]; strcpy_s ( buffer, sizeOfBuffer, otherbuf.buffer ) ; } return * class ="no-loc" dir="ltr" lang="en-us">this ;} int main () { Buf myBuf ( my buffer", 10 ) ;Buf yourBuf ("your buffer",12 ) ;显示"my buffer"myBuf.Display () ;assignment 运算符 myBuf = yourBuf;显示"缓冲区"myBuf.Display () ;}
class  ="lang-Output">缓冲区

class ="no-loc" dir="ltr" lang="en-us">this -pointer">Type of the class ="no-loc" dir="ltr" lang="en-us">this pointer

class="no-loc" dir="ltr" lang="en-us">和 关键字可以在函数声明中修改此指针 classconstvolatile 的类型。 若要声明具有上述任一特性的函数, (参数) 后添加 关键字。

请考虑一个示例:

class  ="lang-cpp">// type_of_ class ="no-loc" dir="ltr" lang="en-us">this  _pointer1.cpp Point class { unsigned X () const ; }; int main () { }

前面的代码声明成员函数 Xclass ,其中 ="no-loc" dir="ltr" lang="en-us">此指针 Xclassconst 被视为指向 对象的 const 指针。 可以使用cv-mod-list选项的组合,但它们始终修改 由 ="no-loc" dir="ltr" lang="en-us"指向的对象>指针,而不是指针本身。 以下声明声明函数 ,其中 Xclass ="no-loc" dir="ltr" lang="en-us">指针指向 Xclassconstconst 对象:

class  ="lang-cpp">// type_of_ class ="no-loc" dir="ltr" lang="en-us">this  _pointer2.cpp class Point { unsigned X () ; const }; int main () { }

class="no-loc" dir="ltr" lang="en-us">成员函数中的此 类型由 class 以下语法描述。 cv-qualifier-list由成员函数的声明符确定。 它可以是 constvolatile (两者) 。 -type是 的名称 class

[cv-qualifier-list] -typeconstclass="no-loc" dir="ltr" lang="en-us">thisconst

换句话说 class ,="no-loc" dir="ltr" lang="en-us">指针 class 始终是 const 指针。 无法重新分配它。 成员函数声明中使用的 或 限定符适用于该函数范围内该指针指向的实例 constvolatileclassclass ="no-loc" dir="ltr" lang="en-us">指针 constvolatile 指向的实例。

下表介绍了有关这些修饰符的工作方式的更多信息。

class ="no-loc" dir="ltr" lang="en-us">this -modifiers">Semantics of class ="no-loc" dir="ltr" lang="en-us">this 修饰符

修饰符 含义
const 无法更改成员数据;无法调用不是 的成员函数 const
volatile 每次访问成员数据时,会从内存中加载成员数据;禁用某些优化。

将 对象传递给不是 的成员 const 函数是一个错误 const

同样,将 对象传递给不是 的成员 volatile 函数也是一个错误 volatile

声明为 的成员函数不能更改成员数据 - 在此类函数中 constclass ,="no-loc" dir="ltr" lang="en-us">此指针是 constclass 指向 const 对象的指针。

class ="NOTE">

注意

Con struct ors 和 de struct ors 不能声明为 constvolatile 。 但是,可以在 或 对象上 const 调用 volatile 它们。

另请参阅

关键字