관리 메뉴

드럼치는 프로그래머

[C/C++] this 포인터 본문

★─Programing/☆─C | C++

[C/C++] this 포인터

드럼치는한동이 2009. 11. 9. 13:42
'this'란 무엇인가?
 
■ 개념 : 멤버 함수를 호출한 객체의 주소를 나타낸다. 이게 무슨 말일까?? 
다음의 이야기를
통해 this를 조금이나마 이해해 보도록 하자!! ^___^ // 이야기 하나 : 해당 객체의 멤버임을 확실하게 나타내기 위해서 this를 사용한다. ---------- #include <iostream> using namespace std; class Point { private: int x; int y; public: Point( int _x, int _y ) : x(_x), y(_y) {} void SetX( int x ) { x = x;
// 당신은 l-value와 r-value가 무엇인지 구분할 수 있겠는가?
// 여기서의 l-value는 지역변수 x이고, r-value는 Point 멤버변수의 x이다! // (그 이유를 모른다면 C책을 다시한번 보아야 할 것이다!) // 이 때 멤버변수와 지역변수를 구분하기 위해 this를 사용한다. this.x = x; // 이렇게 사용하면 된다! } }; // 이야기 두울 : 멤버함수의 진짜 호출 모습! ---------------------------------------------- // 우리가 위에서 설계한 Point 클래스의 멤버함수인 SetX()함수를 살펴보자! // 우리의 눈으로 보이는 SetX()는 다음과 같다. void SetX( int x ) { this.x = x; } // 그러나 컴파일러의 눈에는 다음과 같이 보인다. void SetX( const Point* const this, int x ) { this->x = x; } // 왜 저렇게 보이는 것일까? 실제 멤버함수 SetX()가 호출되는 모습을 통하여 // 알아보도록 하자! int main() { Point p; // 일단 객체를 하나 생성한다! // 일반적으로 우리는 다음과 같이 멤버함수를 호출한다. p.SetX( 10 ); // 허나 실제 호출되는 장면은 다음과 같다! Point::SetX( &p, 10 ); // 결국, this는 우리의 의지와는 무관하게 암시적으로 사용된다. // 왜 그럴까? 그 이유는 간단하다. 동일한 클래스의 객체가 여러개 // 생성된다 하더라도 멤버함수는 하나만 생성되기 때문이다. 즉, // Point 클래스의 객체를 여러개 생성하여도 SetX()함수는 하나만 // 생성된다는 말이다. 객체가 생성될 때 마다 동일한 기능의 함수가 // 생성된다면 메모리의 낭비가 심해지지 않겠는가? 그래서 함수는 // 한개씩만 생성되고 어느 객체가 함수를 호출하였는지를 알기 위해 // this를 함수에 넘겨주는 것이다. // this 매개변수는 암시적으로 정의되므로 굳이 함수 매개변수에 this를 포함할 필요는 // 없다. 그러나 명시적으로 사용하면 오류가 발생되므로 사용하면 안된다. 하지만 함수 // 본체 안에서는 명시적으로 this를 사용할 수 있다. ex) this.x = x; } // 이야기 네엣 : this를 리턴하면 멤버 함수를 계속 호출할 수 있다.----------------- #include <iostream> using namespace std; class Car { public: // 보통 자신을 값으로 리턴하는 경우가 많은데, 이 때는 참조를 통하여 임시객체가 // 생성되는 것을 막아야 한다. 임시객체의 증가로 불필요한 메모리 생성되어 오버헤드가 // 증가한다!! Car* Go() { return this; } // 주소를 넘겨 역참조하는 센스! Car& Stop() { return *this; } // 자신을 레퍼런스로 참조해주는 센스! }; int main() { Car c; c.Go()->Go()->Go(); c.Stop().Stop().Stop(); // 이런 용법은 이미 우리가 사용하고 있다. 바로 다음과 같은 경우이다! // ex) cout << 'A' << 'B' << 'C'; } // 좀 더 깊은 생각!! --------------------------------------------------- // 앞서 우리가 공부해서 알겠지만 멤버함수의 첫번째 인자로 객체의 주소(this)가
// 암시적으로
넘겨지는 것을 알았다. 그런데 멤버함수의 첫번째 인자로 this가 // 넘겨지지 않는 함수가 있는데 그것은 바로 무엇일까?? 바로 static function이다 #include <iostream> using namespace std; class Point { private: int x; int y; public: // 일반적으로 static함수(클래스 함수) 안에서 멤버변수를 사용할 수 없는 것으로 알고 // 있다. 왜? 객체가 없기 때문이다. 그러나 더 정확한 이유는 this가 없기 때문이다. static void foo() // 매개변수에 'const Point* cosnst this'가 없으므로 { x = 10; // Error : this가 없으므로 x자체에 접근이 불가능하다!! } void SetX( int x ) // 그러나 이 멤버함수는 'const Point* cosnst this'가 { // 암시적으로 사용되었고 Point클래스의 객체 주소가 넘겨졌으므로 this.x = x; // this->x = x;가 가능한 것이다!!!! } // 역으로 생각해보면, static함수는 this가 필요없기 때문에 객체 없이도 호출이 가능하다. };


[출처] http://blog.naver.com/checkdisk?Redirect=Log&logNo=110067030048
Comments