Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Указатель this — это указатель, доступный только в нестатических функциях-членах типа classstructили 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 Иногда указатель используется напрямую, например для управления самонаправленными структурами данных, где требуется адрес текущего объекта.
Пример
// 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 * |
В следующей таблице описаны дополнительные сведения и constvolatileсведения.
Семантика this модификаторов
| Модификатор | Значение |
|---|---|
const |
Не удается изменить данные члена; не может вызывать функции-члены, которые не constявляются. |
volatile |
Данные-члены загружаются из памяти при каждом доступе; отключает определенные оптимизации. |
Это ошибка передачи const объекта в функцию-член, которая не constявляется.
Аналогичным образом, это также ошибка передачи volatile объекта в функцию-член, которая не volatileявляется.
Функции-члены, объявленные как const не могут изменять данные члена. В const функциях this указатель — это указатель на const объект.
Примечание.
Конструкторы и деструкторы не могут быть объявлены как const или volatile. Однако они могут вызываться или constvolatile вызываться объектами.