The this pointer (C++ only)
The keyword this identifies a special type of
pointer. Suppose that you create an object named x of
class A, and class A has a nonstatic
member function f(). If you call the function x.f(),
the keyword this in the body of f() stores
the address of x. You cannot declare the this pointer
or make assignments to it.
A static member function does not have a this pointer.
The type of the this pointer for a member function
of a class type X, is X* const.
If the member function is declared with the const qualifier,
the type of the this pointer for that member function
for class X, is const X* const.
const this pointer can by used only with const member
functions. Data members of the class will be constant within that
function. The function is still able to change the value, but requires
a const_cast to do so: void foo::p() const {
member = 1; // illegal
const_cast <int&> (member) = 1; // a bad practice but legal
} A better technique would be to declare member mutable. this pointer for that member function
for class X is volatile X* const.
For example, the compiler will not allow the following: struct A {
int a;
int f() const { return a++; }
};The compiler will not allow the statement a++ in
the body of function f(). In the function f(),
the this pointer is of type A* const.
The function f() is trying to modify part of the
object to which this points.The this pointer is passed as a hidden argument
to all nonstatic member function calls and is available as a local
variable within the body of all nonstatic functions.
For example, you can refer to the particular class object that
a member function is called for by using the this pointer
in the body of the member function. The following code example produces
the output a = 5:
#include <iostream>
using namespace std;
struct X {
private:
int a;
public:
void Set_a(int a) {
// The 'this' pointer is used to retrieve 'xobj.a'
// hidden by the automatic variable 'a'
this->a = a;
}
void Print_a() { cout << "a = " << a << endl; }
};
int main() {
X xobj;
int a = 5;
xobj.Set_a(a);
xobj.Print_a();
}
In the member function Set_a(), the statement this->a
= a uses the this pointer to retrieve xobj.a hidden
by the automatic variable a.
Unless a class member name is hidden, using the class member name
is equivalent to using the class member name with the this pointer
and the class member access operator (->).
this pointer.
The code in the second column uses the variable THIS to
simulate the first column's hidden use of the this pointer:
Code without using this pointer |
Equivalent code, the THIS variable simulating
the hidden use of the this pointer |
|---|---|
|
|
abcdefgh
abcdefghijkl