이번엔 그것을 정리해보겠다.
일단 정의부터,
객체의 멤버함수는 자신을 소유한 객체의 주소를 가리키는 this 라는 포인터를 자동으로 가지게 된다.
예를 들어 아래와 같이 멤버함수를 실행했다고 하자.
int main()
{
TestClass c1;
c1.TestFunc(); // *
return 0;
}
위의 별표로 표시한 라인이 실행될때 자동으로 this 포인터가 생성이 되고 그것이 함수 내부에 인자로 들어간다.
더 자세히 보자면
TestClass* const this = &c1; // 가리키는 객체를 바꾸면 안되므로 const
//const TestClass* const this = &c1; // const 함수의 경우 멤버 변수도 바꾸면 안되므로 또 const
함수 호출시 자동으로 위 선언이 실행되고
TestFunc() 함수 내부에 this가 인자로서 전달된다.
즉, TestFunc() 내부에서 아래와 같이 this를 사용할 수 있다.
TestFunc()
{
cout << this->m_ID;
}
※ 보충설명:
컴퓨터 내부적으로는 각 객체에 대하여 멤버변수는 각각 메모리를 할당받지만 멤버함수는 그렇게 할 필요가 없다. 어차피 같은 내용이므로 메모리 낭비가 되기 때문이다. 그렇기 때문에 실제 메모리상에 멤버함수의 코드부분을 저장하는 곳은 클래스당 한 곳만 존재하면 되지만, 대신에 각 멤버함수를 객체별로 구분하기 위하여 this 포인터의 개념이 도입된 것이다. [참조: 뇌를 자극하는 C++, p.622]
※ 보충설명:
컴퓨터 내부적으로는 각 객체에 대하여 멤버변수는 각각 메모리를 할당받지만 멤버함수는 그렇게 할 필요가 없다. 어차피 같은 내용이므로 메모리 낭비가 되기 때문이다. 그렇기 때문에 실제 메모리상에 멤버함수의 코드부분을 저장하는 곳은 클래스당 한 곳만 존재하면 되지만, 대신에 각 멤버함수를 객체별로 구분하기 위하여 this 포인터의 개념이 도입된 것이다. [참조: 뇌를 자극하는 C++, p.622]
작성자가 댓글을 삭제했습니다.
답글삭제