The "this" keyword
The "this" keyword is a special type of reference variable, that is implicitly defined within each constructor and non-static method as a first parameter of the type class in which it is defined. For example, consider the following class written in C#.
Demo.cs
Conclusion
- The reference variable "this" is allocated within the method stack whenever a non-static method or constructor is called. It means the "this" reference variable can be allocated several times to hold the address of a single object.
- The reference variable "this" is automatically initialized with the reference of the current object for which the non-static method or constructor is called.
Practical proof of the preceding statement (using a C++ program)
Demo.cpp
- #include<iostream.h>
- #include<conio.h>
- class demo
- {
- public:
- demo( )
- {
- demo * &ptr=this;
- fun1( );
- cout<<"address of this in demo( ) = "<<(unsigned int)&ptr;
- cout<<endl<<endl<<"address of object using this = "<<(unsigned int)this;
- cout<<endl;
- }
- void fun1( )
- {
- demo * &ptr=this;
- fun2( );
- cout<<"address of this in fun1( ) = "<<(unsigned int)&ptr;
- cout<<endl<<endl;
- }
- void fun2( )
- {
- demo * &ptr=this;
- fun3( );
- cout<<"address of this in fun2( ) = "<<(unsigned int)&ptr;
- cout<<endl<<endl;
- }
- void fun3( )
- {
- demo * &ptr=this;
- cout<<"address of this in fun3( ) = "<<(unsigned int)&ptr;
- cout<<endl<<endl;
- }
- } *globalptr;
- void main()
- {
- clrscr( );
- demo *localptr = new demo();
- cout<<endl<<endl<<"address of object in heap using local pointer = "<<(unsigned int)localptr;
- globalptr=localptr;
- cout<<endl<<endl<<"address of object in heap using global pointer = "<<(unsigned int)localptr;
- cout<<endl<<endl<<"address of global pointer = "<< (unsigned int)globalptr;
- cout<<endl<<endl<<"address of local pointer = "<<(unsigned int)&localptr;
- getch( );
- }
Output of demo.cpp
Conclusion
- The various addresses (65302, 65314, 65326 and 65338) of this reference variable proves that it is allocated several times whenever a constructor or a non-static method is called.
- The same addresses (3814, 3814, and 3814) of the object from inside main( ), from outside main( ) and even from the constructor, proves that the object can be referenced from the stack and a global region using a reference variable defined by the user inside the function main( ) or outside the function main( ) and even from the stack allocated for a method of a class (constructor and non-static) using the "this" keyword.
- In my programming experience: variables allocated in {somewhere} have the address in digits.
Current results of demo.cpp:
Variables allocated in |
Have the address in digits |
Current Result of demo.cpp |
Stack region |
5 Digits |
65302, 65314, 65326,65338 and 65348 |
Heap region |
4 Digits |
3814 |
Global region |
3 Digits |
170 |
Hence, I can say that:
- The "this" reference variable is allocated on the stack; that proves that it is allocated in method scope because it has the address in 5 digits.
- The object allocated using the new keyword is in the heap region because it has the address in 4 digits.
- The global pointer (globalptr) is allocated to the global region and hence it has the address in 3 digits.