일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- gitlab
- c#
- Flutter
- 포인터
- c# 윈폼
- jupyter
- Data Structure
- 도커
- 플러터
- dart 언어
- C# delegate
- Houdini
- c# 추상 클래스
- C++
- HTML
- c언어
- 구조체
- 깃
- jupyter lab
- C언어 포인터
- 유니티
- github
- docker
- c# winform
- Python
- 다트 언어
- git
- vim
- Unity
- Algorithm
Archives
- Today
- Total
nomad-programmer
[Programming/C++] 멤버 함수에 대한 포인터 본문
일반적인 함수에 대한 포인터를 만들던 방식으로는 멤버 함수를 가리킬 수 없다. 멤버 함수에 대한 포인터를 만드는 문법은 조금 다르기 때문이다.
#include <iostream>
using namespace std;
// void XX() 형태의 함수에 대한 포인터
typedef void (*FP1)(int);
// void Point::XX() 형태의 멤버 함수에 대한 포인터
typedef void (Point::*FP2)(int);
int main(int argc, const char * argv[]) {
Point pt(12, 34);
FP1 fp1 = &Point::SetX; // 오류
FP2 fp2 = &Point::SetX; // 성공
// 함수 포인터를 사용해서 함수 호출
(pt.*fp2)(100);
return 0;
}
(pt.*fp2)(100) 코드는 일단 멤버 함수기때문에 어떤 객체의 멤버 함수를 호출할지 지정해줄 필요가 있다. 그래서 객체 pt의 이름을 써주었다. 그리고 fp2는 포인터이기 때문에 *fp2처럼 만들어서 '포인터가 가리키는 함수'를 의미하게 만든다.
함수 호출을 위한 ( ) 연산자는 우선 순위가 매우 높기 때문에 괄호를 사용해서 pt.*fp2가 먼저 해석되게 만든다.
정적 멤버 함수에 대한 포인터
정적 멤버 함수의 경우에는 멤버가 아닌 함수에 대한 포인터를 그대로 사용하면 된다.
#include <iostream>
using namespace std;
class Example{
public:
static void Count();
};
typedef void (*FP)();
int main(int argc, const char * argv[]) {
FP fp = &Example::Count;
fp();
return 0;
}
정적 멤버 함수는 원래부터 객체를 사용하지 않고 호출한다. 멤버가 아닌 함수와 호출하는 방법이 동일하다는 뜻이다. 그렇기 때문에 같은 형식의 함수 포인터를 사용할 수 있다.
'Programming > C++' 카테고리의 다른 글
[Programming/C++] 정적 멤버 함수에서 객체 생성 (0) | 2023.01.17 |
---|---|
[Programming/C++] virtual, override, final 키워드 (0) | 2023.01.16 |
[Programming/C++] const 함수 (0) | 2023.01.16 |
[Programming/C++] inline 함수 (0) | 2023.01.16 |
[Programming/C++] 구조체의 비트 필드 (0) | 2023.01.14 |
Comments