this 포인터
this 포인터는 클래스, struct 또는 공용 구조체 형식의 비정적 멤버 함수에서만 액세스할 수 있는 포인터이며 멤버 함수가 호출되는 개체를 가리킵니다. 비정적 멤버 함수는 this 포인터를 갖지 않습니다.
this
this->member-identifier
설명
개체의 this 포인터는 개체 자체의 일부분이 아니며 개체의 sizeof 문에 대한 결과에 반영되지 않습니다. 대신 비정적 멤버 함수가 개체에 대해 호출되는 경우 컴파일러가 개체의 주소를 숨겨진 인수로 함수에 전달합니다. 예를 들어, 다음 함수 호출은
myDate.setMonth( 3 );
이렇게 해석할 수 있습니다.
setMonth( &myDate, 3 );
개체의 주소를 멤버 함수 안에서 this 포인터로 사용할 수 있습니다. 대개 this는 암시적으로 사용됩니다. 클래스의 멤버를 참조할 때는 this를 명시적으로 사용하는 것이 좋습니다. 예를 들면 다음과 같습니다.
void Date::setMonth( int mn )
{
month = mn; // These three statements
this->month = mn; // are equivalent
(*this).month = mn;
}
멤버 함수에서 현재 개체를 반환하기 위해 *this 식이 주로 사용됩니다.
return *this;
this 포인터를 사용하여 자신에 대한 참조를 막기도 합니다.
if (&Object != this) {
// do not execute in cases of self-reference
참고
this 포인터는 수정할 수 없으므로 this에 할당할 수 없습니다.이전의 C++ 구현에서는 this에 할당할 수 있었습니다.
예를 들어, 현재 개체의 주소가 필요할 경우 자신을 참조하는 데이터를 조작하기 위해 this 포인터를 직접 사용하기도 합니다.
예제
// this_pointer.cpp
// compile with: /EHsc
#include <iostream>
#include <string.h>
using namespace std;
class Buf
{
public:
Buf( char* szBuffer, size_t sizeOfBuffer );
Buf& operator=( const Buf & );
void Display() { cout << buffer << endl; }
private:
char* buffer;
size_t sizeOfBuffer;
};
Buf::Buf( char* szBuffer, size_t sizeOfBuffer )
{
sizeOfBuffer++; // account for a NULL terminator
buffer = new char[ sizeOfBuffer ];
if (buffer)
{
strcpy_s( buffer, sizeOfBuffer, szBuffer );
sizeOfBuffer = sizeOfBuffer;
}
}
Buf& Buf::operator=( const Buf &otherbuf )
{
if( &otherbuf != this )
{
if (buffer)
delete [] buffer;
sizeOfBuffer = strlen( otherbuf.buffer ) + 1;
buffer = new char[sizeOfBuffer];
strcpy_s( buffer, sizeOfBuffer, otherbuf.buffer );
}
return *this;
}
int main()
{
Buf myBuf( "my buffer", 10 );
Buf yourBuf( "your buffer", 12 );
// Display 'my buffer'
myBuf.Display();
// assignment opperator
myBuf = yourBuf;
// Display 'your buffer'
myBuf.Display();
}