this
Указатель
Указатель this
— это указатель, доступный только в нестатических функциях-членах типа struct
class
или union
типа. Он указывает на объект, для которого вызывается функция-член. Статические функции-члены не имеют указателя this
.
Синтаксис
this
this->member-identifier
Замечания
Указатель объекта не является частью самого объекта this
. Это не часть результата инструкции sizeof
объекта. Если нестатическая функция-член вызывается для объекта, компилятор передает адрес объекта функции в качестве скрытого аргумента. Например, при вызове следующей функции
myDate.setMonth( 3 );
можно интерпретировать как:
setMonth( &myDate, 3 );
Адрес объекта доступен в функции-члене в качестве this
указателя. Большинство this
вариантов использования указателя являются неявными. Это законно, хотя и ненужно, использовать явный this
при обращении к членам .class Например:
void Date::setMonth( int mn )
{
month = mn; // These three statements
this->month = mn; // are equivalent
(*this).month = mn;
}
Выражение *this
обычно используется для возврата текущего объекта из функции-члена.
return *this;
this
Указатель также используется для защиты от самостоятельной ссылки:
if (&Object != this) {
// do not execute in cases of self-reference
Примечание.
this
Так как указатель не является изменяемым, назначения this
указателю не допускаются. Более ранние реализации C++ разрешали присвоение this
.
this
Иногда указатель используется напрямую, например для управления самонаправленными даннымиstruct, где требуется адрес текущего объекта.
Пример
// this_pointer.cpp
// compile with: /EHsc
#include <iostream>
#include <string.h>
using namespace std;
class Buf
{
public:
Buf( char* szBuffer, size_t sizeOfBuffer );
Buf& operator=( 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 terminator
buffer = new char[ sizeOfBuffer ];
if (buffer)
{
strcpy_s( buffer, sizeOfBuffer, szBuffer );
sizeOfBuffer = sizeOfBuffer;
}
}
Buf& Buf::operator=( const Buf &otherbuf )
{
if( &otherbuf != this )
{
if (buffer)
delete [] buffer;
sizeOfBuffer = strlen( otherbuf.buffer ) + 1;
buffer = new char[sizeOfBuffer];
strcpy_s( buffer, sizeOfBuffer, otherbuf.buffer );
}
return *this;
}
int main()
{
Buf myBuf( "my buffer", 10 );
Buf yourBuf( "your buffer", 12 );
// Display 'my buffer'
myBuf.Display();
// assignment operator
myBuf = yourBuf;
// Display 'your buffer'
myBuf.Display();
}
my buffer
your buffer
Тип указателя this
Тип this
указателя изменяется в зависимости от того, включает const
ли объявление функции ключевые слова и(или)volatile
Следующий синтаксис описывает тип this
функции-члена:
[cv-qualifier-list
] class-type
* const this
Декларатор функции-члена определяет cv-qualifier-list
. Это может быть const
или volatile
(или оба). class-type
— имя classобъекта .
Указатель this
нельзя переназначить. Квалификаторы const
, volatile
используемые в объявлении функции-члена, применяются к class экземпляру this
указателя в области этой функции, как показано в следующей таблице:
Объявление функции-члена | тип указателя this для именованного classmyClass |
---|---|
void Func() |
myClass * |
void Func() const |
const myClass * |
void Func() volatile |
volatile myClass * |
void Func() const volatile |
const volatile myClass * |
В следующей таблице описаны дополнительные сведения и const
"volatile".
Семантика this
модификаторов
Модификатор | Значение |
---|---|
const |
Не удается изменить данные члена; не может вызывать функции-члены, которые не const являются. |
volatile |
Данные-члены загружаются из памяти при каждом доступе; отключает определенные оптимизации. |
Это ошибка передачи const
объекта в функцию-член, которая не const
является.
Аналогичным образом, это также ошибка передачи volatile
объекта в функцию-член, которая не volatile
является.
Функции-члены, объявленные как const
не могут изменять данные члена. В const
функциях this
указатель — это указатель на const
объект.
Примечание.
Constructors и destructors не может быть объявлен как const
или volatile
. Однако они могут вызываться или const
volatile
вызываться объектами.
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по