this PointerTo understand the this pointer, you need to understand the following things:
static data members of the class. (These data members are sometimes referred to as instance variables since they are a property of each instance / object.)static data member of the class. (These data members are sometimes referred to as class variables since they are a property of the class as a whole rather than a particular object of the class.)If only one copy of each member function definition exists and is used by multiple objects, how does the code in that member function access the non-static data members for the correct object (i.e., the one that called the member function)?
The compiler supplies a special implicit pointer named this that allows a member function to access the non-static data members. The this pointer contains the address of the object that called the member function.
The this pointer is passed as an extra, hidden argument whenever a non-static member functions is called and is available as a local variable within the body of all non-static member functions. The this pointer is not available in static member functions since they can be called using a class name rather than the name of a specific object.
Date d1(6, 12, 2010);
Date d2(3, 23, 2016);
d1.set_month(8); // Passes &d1 as the this pointer for set_month().
d2.set_year(2019); // Passes &d2 as the this pointer for set_year().
Here are some examples of how to use the this pointer:
this // Address of the object that called the member function.
*this // Value of the object that called the member function.
(*this).member_name // Syntax to access a data member of the object that called the member function.
this->member_name // Alternative syntax to access a data member.
(*this).member_function_name(arguments) // Syntax to call another member function using the
// object that called this member function.
this->member_function_name(arguments) // Alternative syntax to call a member function.
The this pointer can not be modified, so assignments to this are not allowed.
For a class named MyClass, the data type of the this pointer is MyClass* (pointer to MyClass). If a member function of MyClass is declared as const, then the data type of the this pointer will instead be const MyClass* (pointer to a MyClass constant). That prevents the this pointer from being used to change the data members of the object to which it points.
Most uses of the this pointer inside a member function's body will be implicit. It is legal, though usually unnecessary, to explicitly use this when referring to data members or calling methods of the class. For example:
void Date::set_month(int new_month)
{
// The following three statements are equivalent.
month = new_month;
this->month = new_month;
(*this).month = new_month;
}
If you have a local variable in a member function that has the same name as a data member of the class, using the this pointer explicitly will allow the compiler to tell them apart:
void Date::set_month(int month)
{
this->month = month; // Assign the local variable named month to the data member named month.
}
Two other common uses for the this pointer are to check for self-assignment and to return a reference to the object that called a member function:
MyClass& MyClass::operator=(const MyClass& other)
{
// If the object that called the member function and the object other have the same
// address, then they are the same object.
if (this != &other)
{
// Code to execute if this does not point to the object other.
...
}
// Return a reference to the object that called the function.
return *this;
}