클래스객체에서 필드는 메모리에 여러개지만 메소는 하나뿐인데
어떻게 구분할까요?
class Point
{
int x=0, y=0;
public:
void Set(int a,int b)
{
x = a;
y = b;
}
};
int main()
{
Point p1;
Point p2;
p1.Set(10,20);
}
멤버 함수는 1번째 인자로 객체의 주소(this)가 추가됩니다
위에 Set은 실제는void Set(Point* const this, int a, int b) 이런식으로 호출되는데요
class Point
{
int x=0, y=0;
public:
void Set(Point* const this, int a, int b)
{
this->x = a
this->y = b
}
};
코드를 바꿔보면 위와 같이 나오는데요
이런 메소드콜을 '디스콜' 이라고합니다!
좀더 정확하게 원리를 알고싶다면
어셈 코드를 보게되면 알수있습니다.
push 20 ; 00000014H
push 10 ; 0000000aH
lea ecx, DWORD PTR _p1$[ebp]
call ?Set@Point@@QAEXHH@Z ; Point::Set
이렇게 나오는데요 10, 20 패러미터를 전달한다음
객체를 레지스터로 보내줍니다.
그리고 위에 ecx를 사용하면 this가 p1객체가 되는겁니다.
추가로 클래스 안에서 this를 안넘기는 메소드도 있습니다.
바로 Static 메소드 이죠
흔히 Static메소드 안에서는 필드에 접근이 불가능하다고 알고계실텐데요
바로 this포인터가 없기 때문입니다.
다음번엔 이와 관련된 이야기로 이어가겠습니다.
감삽니다.
'프로그램-잉 > C++' 카테고리의 다른 글
타이머 만들기 (0) | 2020.11.03 |
---|---|
스레드 만들기 (0) | 2020.10.29 |
멤버함수 포인터 (0) | 2020.10.27 |
VS Code C++ 17 사용법 (0) | 2020.10.25 |
VS Code에서 Boost Library 사용법 (0) | 2020.10.24 |