Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Wskaźnik
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 strukturami danych, w których 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 volatile wystąpienia class punktów wskaźnika w zakresie tej funkcji, jak pokazano w poniższej tabeli:this
| 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 opisano więcej informacji na temat const elementów 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
Konstruktory i destruktory nie mogą być deklarowane jako const lub volatile. Można je jednak wywołać na const obiektach lub volatile .