강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

jsh4059님의 프로필 이미지
jsh4059

작성한 질문수

홍정모의 따라하며 배우는 C++

8.11 정적 멤버 함수

함수호출에 관한 질문이 있습니다

작성

·

209

0

#include <iostream>

using namespace std;

class Something

{

private:

int a;

static int b;

public:

int temp()

{

return a=1;

}

static int getS()

{

return b;

}

};

int Something::b = 1024;

int main()

{

Something s1;

int (Something::*fptr)() = &Something::temp;

cout << (s1.*fptr)() << endl;

int(*fptr2)() = &Something::getS;

cout << fptr2() << endl;

}

제가 코드를 짜봤는데 여기서 temp의 주소를가지고 있는 함수를 포인터 fptr을 이용하여 함수호출을 하기위해선 dereference 를 사용하여 (s1.*fptr)()이런식으로 사용하였지만 왜 static 멤버 함수인 getS 를 호출할려면 dereference 를 하지 않아야하는건가요? 제 생각에는 getS의 주소를 지닌 fptr2포인터를 이용하여 함수 getS를 호출할려면 dereference 를 사용해주어야하는거 아닌가요?

답변 1

5

함수 종류마다 함수 포인터 문법이 다르다고 이해해주시면 될 것 같아요.

일반 전역 함수와 똑같이 static 멤버 함수는 '정적'인 성격을 가지고 있고 딱히 어디에 종속되어 있지는 않아요. 

원래 일반적으로 함수 포인터를 실행시킬 땐 dereferencing 을 하지 않습니다.(함수포인터 앞에 *를 붙이는 것을 dereferencing 이라고 설명하신 것 같아서 이렇게 언급합니다!)  7.7 함수포인터 강의에서 배우셨던걸 다시 복습해보시면 dereferencing 을 사용안하셨던걸 기억하실 수 있을 거에요. fptr2() 그냥 이런식으로 바로 포인터를 통해 호출할 수 있었습니다. static 멤버 함수는 객체와 무관하게 연산이 이루어지기 때문에 일반 함수 포인터로 취급 받습니다. 그렇기 때문에 static 멤버 함수는 7.7 강의에서 배우셨을 함수포인터 사용방법과 똑같이 사용하시면 되는거에요!

반면 일반 멤버함수는 객체에 종속됩니다. 호출 자체가 자신이 속한 객체에 종속되는 것입니다. 그래서 멤버 함수의 주소를 담은 포인터는 호출할 때 조금 다른 방식으로 호출되는 것 같습니다. 왜 문법이 이렇게 되는지는 저도 자세하게는 모르겠지만..! 멤버함수는 일반 전역함수와 static 멤버함수와는 달리 (객체포인터->*멤버함수포인터)(매개변수) 이런식의 문법을 지켜야한다고 생각하시면 됩니다. 

jsh4059님의 프로필 이미지
jsh4059

작성한 질문수

질문하기