inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

8.11 정적 멤버 함수

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

215

jsh4059

작성한 질문수 34

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 를 사용해주어야하는거 아닌가요?

C++

답변 1

5

안소

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

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

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

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

변수가 메모리에 저장되는 것을 알려주는 강의가 어떤강의였죠

1

481

1

메모리 주소 10진수로 출력

1

672

1

클래스 템플릿 특수화에서 boolalpha로 표현된 리턴값에 대해 질문이 있습니다.

1

515

1

여러가지 리턴 타입에 관한 강의가 어떤 걸까요?

1

549

1

메모리 주소에 관한 질분

0

687

1

인터페이스 클래스에서 reportError의 매개변수에 대해 궁금한 것이 있습니다.

0

558

1

형변환 오버로딩에서 const 관련 질문이 있습니다.

0

448

1

Digit 뒤에 reference를 사용하는 이유

0

512

1

4.2 전역 변수, 정적 변수, 내부 연결, 외부 연결

0

325

1

dat파일이...

0

540

1

TODO:대입 연산자 오버로딩에 대한 소스코드입니다.

0

651

1

복사 생성자 관련 질문이 있습니다.

0

456

1

수업 중 궁금한점이 있습니다.

1

392

1

라이브러리자체가 이해가 되지 않습니다.

0

565

1

마지막 예제 질문

0

305

1

증감연산자 위치에 따른 수행 순서 질문입니다.

0

382

1

단항 연산자 오버로딩에서 return 부분에 질문이 있습니다.

1

416

1

friend함수 관련 질문이 있습니다.

0

313

1

operator+ 정의부분에서 궁금한 것이 있습니다.

0

448

1

3분 17초 질문

0

354

1

함수에 값을 대입한다는 개념이 이해가 되지 않습니다.

0

450

1

int getvalue() const에서 const는 왜 뒤에 붙는건가요?

0

453

2

const Something &st에서 const를 빼면 안되나요?

0

304

1

friend함수는 다른 클래스의 멤버함수로 쓸 수 없나요??

1

495

1