Wskaźnik this
Wskaźnik this
jest wskaźnikiem dostępnym tylko w funkcjach class
niestatycznych składowych typu , struct
lub 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-type
to 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 const są . |
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 const
jest .
Podobnie jest to również błąd podczas przekazywania volatile
obiektu do funkcji składowej, która nie volatile
jest .
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ż
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla