¿Qué es el puntero this en C++?
Aprende cómo funciona el puntero this en C++, incluyendo autorreferencia de objetos y encadenamiento de métodos.
En C++, cada función miembro de clase (método) recibe implícitamente un parámetro especial llamado puntero this.
El puntero this representa la dirección del objeto para el cual se invoca la función.
En otras palabras, dentro de un método de clase, this permite acceder al objeto actual que se está manipulando.
1. ¿Qué es el puntero this?
El puntero this es un puntero implícito que se pasa automáticamente a cada método de instancia. Cada función miembro no estática accede a la dirección del objeto sobre el cual opera a través de este puntero.
#include <iostream>
using namespace std;
class Book {
private:
string title;
public:
Book(string t) {
this->title = t; // uso de this
}
void Show() {
cout << "Libro: " << this->title << endl;
}
};
int main() {
Book b("Aprendiendo C++");
b.Show();
}
Aquí, this->title accede al miembro title del objeto actual.
Escribir simplemente title = t; produciría el mismo resultado,
pero this es útil cuando el nombre del parámetro entra en conflicto con el de un miembro.
2. Conflicto entre el nombre de un parámetro y el de un miembro
En el siguiente ejemplo, los parámetros del constructor tienen los mismos nombres que los miembros de la clase.
En este caso, se debe usar this para evitar ambigüedades.
class Book {
private:
string title;
double price;
public:
Book(string title, double price) {
this->title = title; // sin "this", se asignaría el parámetro a sí mismo
this->price = price;
}
void Show() const {
cout << "Libro: " << title << " | Precio: " << price << " €" << endl;
}
};
int main() {
Book b("C++ Moderno", 120.5);
b.Show();
}
La expresión this->title hace referencia al miembro title de la clase.
Sin this, el compilador no podría distinguir entre el parámetro y el miembro.
3. Dirección de memoria del puntero this
Cada objeto tiene una dirección this diferente, ya que cada instancia ocupa una posición distinta en memoria.
#include <iostream>
using namespace std;
class Book {
private:
string title;
public:
Book(string t) : title(t) {}
void PrintAddress() const {
cout << "Dirección del objeto (this): " << this << endl;
}
};
int main() {
Book b1("C++ Primer");
Book b2("Effective C++");
b1.PrintAddress();
b2.PrintAddress();
}
La salida será diferente para cada objeto, ya que this contiene la dirección única de cada instancia.
4. Encadenamiento de métodos (Method Chaining)
El puntero this puede devolverse desde los métodos para permitir el encadenamiento de llamadas.
De esta forma, se pueden ejecutar varias llamadas de métodos en una sola instrucción.
#include <iostream>
#include <string>
using namespace std;
class Book {
private:
string title;
double price;
int pageCount;
public:
Book() : title(""), price(0), pageCount(0) {}
Book* SetTitle(string t) {
this->title = t;
return this; // devuelve su propia dirección
}
Book* SetPrice(double p) {
this->price = p;
return this;
}
Book* SetPageCount(int c) {
this->pageCount = c;
return this;
}
void Show() const {
cout << title << " (" << pageCount << " páginas) - "
<< price << " €" << endl;
}
};
int main() {
Book b;
b.SetTitle("Programación Orientada a Objetos con C++")
->SetPrice(149.90)
->SetPageCount(580)
->Show();
}
Esta técnica se conoce como encadenamiento de métodos y se usa comúnmente en
los patrones de diseño Builder o Fluent Interface.
5. Sobrecarga de operadores con el puntero this
El puntero this también se usa frecuentemente en la sobrecarga de operadores.
Por ejemplo, para sumar dos objetos Book en función de su precio:
#include <iostream>
#include <string>
using namespace std;
class Book {
private:
string title;
double price;
public:
Book(string t, double p) : title(t), price(p) {}
// Sobrecarga del operador (+)
Book operator+(const Book &other) const {
double totalPrice = this->price + other.price;
return Book("Paquete: " + this->title + " & " + other.title, totalPrice);
}
void Show() const {
cout << title << " - " << price << " €" << endl;
}
};
int main() {
Book b1("C++ Primer", 180.0);
Book b2("C++ Moderno Efectivo", 220.0);
Book combo = b1 + b2;
combo.Show();
}
Aquí, this->price representa el precio del operando izquierdo.
Esto es útil cuando se necesitan combinar o comparar varios objetos.
6. Uso de this en constructores
Dentro de un constructor, this puede usarse para referirse a la dirección del objeto
antes de que su inicialización esté completa.
Generalmente se usa con fines de depuración o registro.
class Book {
public:
Book() {
cout << "Creando un nuevo objeto Book... Dirección: " << this << endl;
}
};
Esto es especialmente útil en estructuras de objetos complejas (por ejemplo, Book → Author → Publisher) para rastrear el ciclo de vida de un objeto durante la ejecución.
7. this no puede usarse en funciones estáticas
Las funciones estáticas pertenecen a la clase en sí, no a un objeto específico.
Por lo tanto, el puntero this no existe dentro de las funciones estáticas.
class Book {
public:
static void Info() {
// cout << this; // ERROR: "this" no se puede usar en una función estática
cout << "Esta es una función estática." << endl;
}
};
8. TL;DR
- El puntero
thisrepresenta la dirección del objeto actual. this->miembro→ se usa para acceder a los datos del objeto.- Cuando los nombres de parámetros y miembros son iguales,
thises necesario. return this;→ permite el encadenamiento de métodos.thistambién puede usarse en la sobrecarga de operadores.thisno está disponible en funciones estáticas.- Todos los ejemplos pueden ejecutarse en Visual Studio 2022 o GCC 11+.