#include <iostream>
class MyClass {
public:
void memberFunction() {
std::cout << "Hello, World!" << std::endl;
}
};
int main() {
MyClass obj;
obj.memberFunction();
return 0;
}
위와 같이 main func에서 객체 obj를 선언하면 obj라는 이름으로 MyClass 객체가 스택에 할당된다.
그리고 컴파일러가 Symbol Table에 변수 이름과 (데이터 타입), 객체의 주소를 매핑한다.

#include <iostream>
class MyClass {
public:
void memberFunction() {
std::cout << "Hello, World!" << std::endl;
}
};
int main() {
MyClass* obj = new Myclass( );
obj->memberFunction();
delete obj;
return 0;
}
이 방식은 다음과 같이 일어난다.
즉, 컴파일러가 컴파일 시 데이터 타입을 Myclass임을 아느냐 또는 Myclass에 대한 포인터임을 아느냐의 차이가 있고
런타임에서는 해당 객체가 있는 주소에 바로 접근해서 함수를 호출하느냐 포인터에 저장된 주소에 접근해서 멤버 함수를 호출하느냐의 차이가 있는 것이었다.