this : 멤버함수를 호출한 객체의 주소를 나타낸다.
1. 일반멤버함수는 첫번째 인자로 this가 추가된다.
2. static 멤버함수는 this가 추가되지 않는다.
다음의 Point 클래스에서
class Point { int x, y; public: void set(int a, int b) { x = a; // this->x = a; y = b; // this->y = b; } static void foo(int a) { x = a; } };
함수
void set(int a, int b)의 경우 void set(Point* const this, int a, int b)로 컴파일된다.
자신의 객체를 의미하는 this가 추가되고 컴파일된다.
이는 동일한 클래스의 객체가 여러개 생성된다 해도 멤버함수는 하나만 생성되기 때문이다. 만약 객체가 생성될 때 마다 동일한 기능의 함수가 생성된다면 메모리 낭비가 심해질 수 있기 때문에 하나의 함수만 생성된 후, 어느 객체의 함수를 호출하였는지 알기 위해 this를 함께 넘겨주는 것이다.
실제 함수에서 접근하는 x, y 역시 this->x, this->y의 원리로 this가 있기 때문에 접근가능하다.
실행되는 main함수를 보면
int main() { Point::foo(10); // static 멤버함수는 객체없이 호출가능 Point p; p1.set(10,20); }
함수를 호출하는 p.set(10, 20) 역시 set(&p1, 10, 20)으로 변해 자신의 포인터를 넘겨줍니다.
그렇다면 static 멤버함수 foo의 경우는 어떨까?
static void foo(int a)-> void foo(int a)로 this가 없다.
그렇기 때문에 static 멤버함수 내부에서 x로의 접근이 불가능하다
(this->x가 되어야 하는데 this가 없기 때문에 접근이 안된다)
static함수를 호출할 때 Point::foo(10)과 같이 객체 생성없이 호출이 가능한 이유는 this가 없기 때문에 가능하다.
'Software Development > C, C++' 카테고리의 다른 글
2_new2_예제 (0) | 2014.07.21 |
---|---|
2_new1_new,operator new, operator delete (0) | 2014.07.20 |
1_this4_다중 상속의 멤버함수 포인터 (0) | 2014.07.20 |
1_this3_멤버 변수의 포인터 (0) | 2014.07.20 |
1_this2_함수포인터의 this (0) | 2014.07.20 |