개발/C, C++

1_ this1

huiyu 2014. 7. 20. 12:51

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가 없기 때문에 가능하다.



728x90
반응형

'개발 > 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