The blog post explains “this pointer in C++”. Also, it explains some important points including the places where we need to use “this pointer”. It is my belief you will learn a lot from this blog post.
So let’s first understand this pointer. A “this pointer” is a type of pointer which accessible only within the nonstatic member functions of a class, struct, or union type.
Basically, the keyword ‘this’ is a prvalue (“pure” rvalues) expression, in the body of a non-static member function. The value of ‘this pointer’ is the address of the object for which the function is called.
Note: “this pointer” is not available in static member functions.
Also, we need to remember that “this pointer” isn’t part of the object itself. It’s not reflected in the result of a sizeof statement on the object. When a nonstatic member function is called for an object, the compiler passes the object’s address to the function as a hidden argument.
Let’s see an example, suppose that we create an object named testObj of class Test, and class Test has a nonstatic member function void value(int a).
//class
class Test
{
//member variable
int m_data;
public:
//non-static member function
void value(int a)
{
m_data = a;
}
};If you call the function testObj.value(2), the compiler passes the object’s address to the function as a hidden argument (this keyword). So, when we call value(2), we are actually calling value(&testObj,2).
//non-static member function calling testObj.value(2); can be interpreted as: value(&testObj,2);
Important points related to this pointer in C++
Now it’s time to see some important points related to this pointer. We will also see where we should use this pointer in code.
1. In C++, “this” keyword is a prvalue expression. Which means “this pointer” is nonmodifiable, and assignment to this pointer is not allowed. ( Note: Earlier implementations of C++ allowed assignment to this).
2. “this pointer” isn’t part of the object itself. It’s not reflected in the result of a sizeof statement on the object.
3. Friend functions do not have “this pointer”, because friends are not members of a class.
4. Nonstatic member functions of a class, struct, or union type only has the this pointer.
5. The type of this pointer in a member function of a class X is X*.
6. If the member function is declared const, the type of this is const X*, if the member function is declared volatile, the type of this is volatile X*, and if the member function is declared const volatile,the type of this is const volatile X*.
class X
{
void test() const
{
// Type of this is const X*
}
};
class X
{
void test() volatile
{
// Type of this is volatile X*
}
};
class X
{
void test() const volatile
{
// Type of this is const volatile X*
}
};
7. this pointer mostly use implicitly. But it’s legal to use this pointer explicitly when referring to members of the class. Let’s see an example,
class Test
{
//member variable
int m_data;
public:
//non-static member function
void value(int a);
};
void Test::value( int a )
{
m_data = a; // These three statements
this->m_data = a; // are equivalent
(*this).m_data = a;
}
Thus in a const member function, the object for which the function is called is accessed through a const access path. Let’s see an example,
class Test
{
int m_data;
public:
//constructor
Test():m_data(0)
{
}
//non-const member function
int g()
{
return m_data++;
}
//const member function
int h() const
{
return m_data++; // error
}
};
The m_data++ in the body of Test::h is ill-formed because it tries to modify (a part of) the object for which Test::h() is called. This is not allowed in a const member function because this is a pointer to const( type of this pointer is const Test *)
8. When the local variable’s name is the same as the member’s name, then to avoid ambiguity we can use “this pointer”.
#include
using namespace std;
//class
class Test
{
//member variable
int m;
public:
//non-static member function
void value(int m)
{
// The 'this' pointer is used to
//retrieve the object's m
this->m = m;
}
void print()
{
cout << "m = " << m << endl;
}
};
int main()
{
Test testObj;
testObj.value(6);
testObj.print();
return 0;
}
Output: m = 6
9. “this pointer” is also used to guard against self-reference. See the below expression.
// do not execute in cases of self-reference
if (&Object != this)
{
}
10. Sometimes we use the expression *this to return the current object from a member function.
Test& Test::testFun ()
{
// Some processing
return *this;
}
If you already know how to program and just want to learn C++, you can start with the C++ Fundamentals course. The good thing is that TRIAL IS FREE
Duration: Approx. 43 hours
Rating: 4.6
Now let’s see a C++ example code where I am using this pointer in an overloaded assignment operator. In the overloaded assignment operator function, I have also used this pointer as a guard against self-reference.
Basically, In this example code, I am creating two test objects testBuf1 and testBuf2 of the class Buf. Further, I am assigning the testBuf2 to testBuf1 and displaying the testBuf1 buffer.
#include <iostream>
#include <string.h>
using namespace std;
//class Buf
class Buf
{
public:
Buf( const char* szBuffer);
~Buf();
Buf& operator=( const Buf & );
void Display()
{
cout << m_buffer << endl;
}
private:
//private members variable
char* m_buffer;
size_t m_sizeOfBuffer;
};
//constructor
Buf::Buf(const char* szBuffer)
{
//adding 1 to account for a NULL terminator
size_t sizeOfBuffer = strlen(szBuffer) + 1;
//allocate the memory
m_buffer = new char[sizeOfBuffer];
if (m_buffer)
{
//copy string in member char buffer
strncpy(m_buffer, szBuffer,sizeOfBuffer);
m_sizeOfBuffer = sizeOfBuffer;
}
}
//destructor
Buf::~Buf()
{
if (m_buffer)
{
delete [] m_buffer;
}
}
//assignment operator
Buf& Buf::operator=( const Buf &otherbuf )
{
if( &otherbuf != this )
{
if (m_buffer)
{
delete [] m_buffer;
}
m_sizeOfBuffer = strlen( otherbuf.m_buffer ) + 1;
m_buffer = new char[m_sizeOfBuffer];
strncpy(m_buffer, otherbuf.m_buffer,m_sizeOfBuffer);
}
return *this;
}
int main()
{
Buf testBuf1("Aticleworld");
Buf testBuf2("Amlendra");
// Display Aticleworld
testBuf1.Display();
// assignment operator
testBuf1 = testBuf2;
// Display Amlendra
testBuf1.Display();
return 0;
}
Output:
Aticleworld
Amlendra
Recommended Articles for you:
- Type of this pointer in C++.
- C++ Programming Courses And Tutorials
- Amazing list of Gifts for Programmers, You must.
- Operator Overloading in C++ with some FAQ.
- Introduction of reference in C++.
- A brief introduction of pointers.
- Difference between pointers and references.
- Use of mutable keywords in C++.
- Best electronic kits for programmers.
- References and const in C++ with example programs.
- C++ Interview Questions with Answers.
- List of some Best C++ Books, you must see.