Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El puntero
El puntero this es un puntero accesible solo dentro de las funciones miembro no estáticas de un tipo class, struct o union. Señala al objeto para el que se llama a la función miembro. Las funciones miembro estáticas no tienen un puntero this.
Sintaxis
this
this->member-identifier
Comentarios
El puntero this de un objeto no forma parte del objeto en sí. No forma parte del resultado de una instrucción sizeof en el objeto. Cuando se llama a una función miembro no estática para un objeto, el compilador pasa la dirección del objeto a la función como un argumento oculto. Por ejemplo, la siguiente llamada de función:
myDate.setMonth( 3 );
se puede interpretar de esta manera:
setMonth( &myDate, 3 );
La dirección del objeto está disponible desde la función miembro como puntero this. La mayoría de los usos del puntero this son implícitos. Es válido, aunque innecesario, usar explícitamente this cuando se hace referencia a los miembros de class. Por ejemplo:
void Date::setMonth( int mn )
{
month = mn; // These three statements
this->month = mn; // are equivalent
(*this).month = mn;
}
La expresión *this suele utilizarse para devolver el objeto actual desde una función miembro:
return *this;
El puntero this también se usa para protegerse de la referencia automática:
if (&Object != this) {
// do not execute in cases of self-reference
Nota:
Dado que el puntero this no es modificable, no se permiten asignaciones al puntero this. Las implementaciones anteriores de C++ permitían asignaciones a this.
En ocasiones, el puntero this se usa directamente; por ejemplo, para manipular estructuras de datos a los que se hace referencia automáticamente, donde se requiere la dirección del objeto actual.
Ejemplo
// 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
Tipo del puntero this
El tipo del puntero this cambia en función de si la declaración de función incluye las palabras clave const o volatile. La siguiente sintaxis describe el tipo de this en una función miembro:
[cv-qualifier-list] class-type* const this
El declarador de la función miembro determina cv-qualifier-list. Puede ser const o volatile (o ambos).
class-type es el nombre del class.
No se puede reasignar el puntero this. Los calificadores const o volatile que se usan en la declaración de funciones miembro se aplican a la instancia class a la que apunta el puntero this en el ámbito de dicha función, como se muestra en la siguiente tabla:
| Declaración de función miembro | tipo de puntero de this para un class denominado myClass |
|---|---|
void Func() |
myClass * |
void Func() const |
const myClass * |
void Func() volatile |
volatile myClass * |
void Func() const volatile |
const volatile myClass * |
En la siguiente tabla se explica más sobre const y volatile.
Semántica de modificadores this
| Modificador | Significado |
|---|---|
const |
No se pueden cambiar los datos de los miembros; no se pueden invocar funciones miembro que no sean const. |
volatile |
Los datos de miembros se cargan desde la memoria cada vez que se obtiene acceso; deshabilita ciertas optimizaciones. |
Es un error pasar un objeto const a una función miembro que no sea const.
De igual forma, es un error pasar un objeto volatile a una función miembro que no sea volatile.
Las funciones miembro declaradas como const no pueden cambiar los datos de los miembros. En funciones const, el puntero this es un puntero a un objeto const.
Nota:
Los constructores y destructores no se pueden declarar como const o volatile. Pueden, sin embargo, invocarse en objetos const o volatile.