¿Cuándo debo hacer uso explícito del puntero "este"?
¿ Cuándo debo escribir explícitamente this->member
en un método de una clase?
Por lo general, no es necesario, this->
está implícito.
A veces, existe una ambigüedad en el nombre, donde se puede utilizar para eliminar la ambigüedad de los miembros de la clase y las variables locales. Sin embargo, aquí hay un caso completamente diferente en el que this->
se requiere explícitamente.
Considere el siguiente código:
template<class T>
struct A {
T i;
};
template<class T>
struct B : A<T> {
T foo() {
return this->i; //standard accepted by all compilers
//return i; //clang and gcc will fail
//clang 13.1.6: use of undeclared identifier 'i'
//gcc 11.3.0: 'i' was not declared in this scope
//Microsoft C++ Compiler 2019 will accept it
}
};
int main() {
B<int> b;
b.foo();
}
Si lo omite this->
, algunos compiladores no sabrán cómo tratarlo i
. Para indicarle que i
efectivamente es miembro de A<T>
, para any T
, this->
se requiere el prefijo.
Nota: aún es posible omitir this->
el prefijo usando:
template<class T>
struct B : A<T> {
int foo() {
return A<T>::i; // explicitly refer to a variable in the base class
//where 'i' is now known to exist
}
};
Si declara una variable local en un método con el mismo nombre que un miembro existente, tendrá que usar this->var para acceder al miembro de la clase en lugar de a la variable local.
#include <iostream>
using namespace std;
class A
{
public:
int a;
void f() {
a = 4;
int a = 5;
cout << a << endl;
cout << this->a << endl;
}
};
int main()
{
A a;
a.f();
}
huellas dactilares:
5
4