Wskaźnik this

Wskaźnik this jest wskaźnikiem dostępnym tylko w funkcjach classniestatycznych składowych typu , structlub union . Wskazuje on obiekt, dla którego wywoływana jest funkcja składowa. Statyczne funkcje składowe nie mają this wskaźnika.

Składnia

this
this->member-identifier

Uwagi

Wskaźnik obiektu this nie jest częścią samego obiektu. Nie jest częścią wyniku instrukcji sizeof obiektu . Gdy dla obiektu jest wywoływana niestatyczna funkcja składowa, kompilator przekazuje adres obiektu do funkcji jako ukryty argument. Na przykład następujące wywołanie funkcji:

myDate.setMonth( 3 );

można interpretować jako:

setMonth( &myDate, 3 );

Adres obiektu jest dostępny z poziomu funkcji składowej this jako wskaźnik. Większość this zastosowań wskaźnika jest niejawna. Jest to jednak legalne, choć niepotrzebne, używanie jawnego this elementu podczas odwoływania się do członków obiektu class. Na przykład:

void Date::setMonth( int mn )
{
   month = mn;            // These three statements
   this->month = mn;      // are equivalent
   (*this).month = mn;
}

Wyrażenie *this jest często używane do zwracania bieżącego obiektu z funkcji składowej:

return *this;

Wskaźnik this jest również używany do ochrony przed odwołaniem własnym:

if (&Object != this) {
// do not execute in cases of self-reference

Uwaga

this Ponieważ wskaźnik jest niemodyfikowalny, przypisania do this wskaźnika nie są dozwolone. Wcześniejsze implementacje języka C++ zezwalały na przypisanie do klasy this.

this Czasami wskaźnik jest używany bezpośrednio — na przykład do manipulowania własnymi adresami URL danych structodwołującymi się, gdzie wymagany jest adres bieżącego obiektu.

Przykład

// 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 Typ wskaźnika

this Typ wskaźnika zmienia się w zależności od tego, czy deklaracja funkcji zawiera const słowa kluczowe i/lub volatile . Poniższa składnia opisuje typ this funkcji składowej:

[cv-qualifier-list] class-type* const this

Deklarator funkcji składowej określa .cv-qualifier-list Może to być const lub volatile (lub oba). class-typeto nazwa .class

Nie this można ponownie przypisać wskaźnika. Kwalifikatory const używane w deklaracji funkcji składowej mają zastosowanie do class wystąpienia this punktów wskaźnika w zakresie tej funkcji, jak pokazano w poniższej tabeli:volatile

Deklaracja funkcji składowej this typ wskaźnika dla nazwanego classmyClass
void Func() myClass *
void Func() const const myClass *
void Func() volatile volatile myClass *
void Func() const volatile const volatile myClass *

W poniższej tabeli wyjaśniono więcej informacji const i "volatile".

Semantyka this modyfikatorów

Modyfikator Znaczenie
const Nie można zmienić danych składowych; nie może wywoływać funkcji składowych, które nie constsą .
volatile Dane składowe są ładowane z pamięci za każdym razem, gdy są dostępne; wyłącza niektóre optymalizacje.

Jest to błąd podczas przekazywania const obiektu do funkcji składowej, która nie constjest .

Podobnie jest to również błąd podczas przekazywania volatile obiektu do funkcji składowej, która nie volatilejest .

Funkcje składowe zadeklarowane jako const nie mogą zmieniać danych składowych. W const funkcjach this wskaźnik jest wskaźnikiem const do obiektu.

Uwaga

Constructlubs i destructors nie można zadeklarować jako const lub volatile. Można je jednak wywołać na const obiektach lub volatile .

Zobacz też

Słowa kluczowe