inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

11:11 부근에 Something::temp와 Something::getValue의 앞에 &를 붙이는 이유가 뭔가요? (함수 이름은 포인터(주소)가 아닌가요?)

미해결

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

앞에서 '함수이름'은 포인터와 같다라고 배웠습니다. 그래서 실제로 7.9 함수 포인터 강의에서도 int (*ptr_func)() = func; //func는 함수 이름으로 함수포인터를 선언 및 초기화하고 호출 시에도 ptr_func()라고 호출했습니다. 그런데 이번 강의 11:11부근에서 교수님께서 멤버함수의 포인터를 가져올 수 있다 말씀하시면서 선언 및 초기화하실 때 int (Something::*fptr1) = &Something::temp;라고 선언 및 초기화를 해주셨는데 Something::temp 앞에 주소 연산자 [&]를 붙여주는 이유 를 모르겠습니다. 검색해보니 함수포인터 초기화 시 함수이름에 &를 붙이지 않았다고 해도 내부적으로 형변환을 해준다고 하는 것을 알았습니다. 실제로 int (Something::*fptr1) = Something::temp;로 주소 연산자 [&]를 붙이지 않았을 때도 에러 없이 정상 작동하는 것을 확인했습니다. 그러나 '함수 포인터는 주소다, 포인터다'라고 배운 개념과 다르게 앞에 &를 붙이지 않으면 내부적으로 자동 형변환 된다는게 모순인 것 같은데 &는 주소를 나타내기 위한 연산자라고 배웠고 원래는 &를 명시적으로 함수이름 앞에 붙이는게 맞다(안붙이면 내부적으로 형변환된다)는 것이 말이 안되는 것 같습니다. 그러면 함수 이름은 포인터가 아닌 것이지 않을까요?

  • c++
  • 함수포인터
  • 함수이름
픽린 댓글 3 좋아요 1 조회수 133

함수 포인터 check_fnc에 관해 질문이 있습니다.

미해결

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

#include <iostream> #include <array> using namespace std; bool isEven(const int& number) { if (number % 2 == 0) return true; else return false; } bool isOdd(const int& number) { if (number % 2 != 0) return true; else return false; } void printNumbers(const array<int, 10>& my_array, bool (*check_fnc)(const int&)=isEven) { for (auto element : my_array) { if (check_fnc(element) == true) cout << element << " "; } cout << endl; } int main() { std::array<int, 10> my_array = { 0,1,2,3,4,5,6,7,8,9 }; printNumbers(my_array); printNumbers(my_array, isOdd); return 0; } 에서 if (check_fnc(element) == true)부분인데요, check_fnc가 함수 포인터고 이것이 함수의 주소를 저장하니까 isEven으로 기본값을 설정하면, 포인터가 isEven으로 찾아가서 함수를 호출하는 것이 맞나요? 그리고 printNumbers(my_array, isOdd)부분에서는 check_fnc가 isOdd의 주소를 저장했으니까 if (check_fnc(element) == true)의 check_fnc가 isOdd를 호출하는 것도 맞나요??

  • 함수포인터
  • 함수호출
  • C++
Ambition 댓글 1 좋아요 1 조회수 389

인기 태그

인프런 TOP Writers

주간 인기글