묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결홍정모의 따라하며 배우는 C++
11:11 부근에 Something::temp와 Something::getValue의 앞에 &를 붙이는 이유가 뭔가요? (함수 이름은 포인터(주소)가 아닌가요?)
앞에서 '함수이름'은 포인터와 같다라고 배웠습니다. 그래서 실제로 7.9 함수 포인터 강의에서도 int (*ptr_func)() = func; //func는 함수 이름으로 함수포인터를 선언 및 초기화하고 호출 시에도 ptr_func()라고 호출했습니다.그런데 이번 강의 11:11부근에서 교수님께서 멤버함수의 포인터를 가져올 수 있다 말씀하시면서 선언 및 초기화하실 때 int (Something::*fptr1) = &Something::temp;라고 선언 및 초기화를 해주셨는데Something::temp 앞에 주소 연산자 [&]를 붙여주는 이유를 모르겠습니다. 검색해보니 함수포인터 초기화 시 함수이름에 &를 붙이지 않았다고 해도 내부적으로 형변환을 해준다고 하는 것을 알았습니다.실제로 int (Something::*fptr1) = Something::temp;로 주소 연산자 [&]를 붙이지 않았을 때도 에러 없이 정상 작동하는 것을 확인했습니다.그러나 '함수 포인터는 주소다, 포인터다'라고 배운 개념과 다르게 앞에 &를 붙이지 않으면 내부적으로 자동 형변환 된다는게 모순인 것 같은데 &는 주소를 나타내기 위한 연산자라고 배웠고 원래는 &를 명시적으로 함수이름 앞에 붙이는게 맞다(안붙이면 내부적으로 형변환된다)는 것이 말이 안되는 것 같습니다. 그러면 함수 이름은 포인터가 아닌 것이지 않을까요?
-
미해결홍정모의 따라하며 배우는 C++
함수 포인터 check_fnc에 관해 질문이 있습니다.
#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를 호출하는 것도 맞나요??