Поделиться через


this Указатель

Указатель this — это указатель, доступный только в нестатических функциях-членах типа structclassили 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 вызываться объектами.

См. также

Ключевые слова