C++ 함수 - 함수 포인터

진경천·2023년 9월 15일
0

C++

목록 보기
30/90

함수 포인터 자료형(*ptr_func)(자료형)

함수 포인터는 함수의 시작 주소를 가리키는 포인터 상수이다

#include <iostream>

using namespace std;

int sum(int x, int y) {
	return x + y;
}

int(*f)(int, int);
int main() {
	int(*f)(int, int) = sum;
	// 포인터를 반환하는 것이 아닌 함수포인터임을 나타내기 위해 괄호를 붙인다
	int(&f0)(int, int) = sum;

	cout << (*f)(1, 2) << endl;
	cout << f(1, 2) << endl;	// 역참조 가능
	cout << (&f0)(1, 2) << endl;
	cout << f0(1, 2) << endl;
    
    return 0;
}
  • 코드 실행결과

    3
    3
    3
    3

예제

게임 속 케릭터가 데미지를 입는 것과 죽었을 경우 저장해둔 diecallback 함수를 실행한다.

#include <iostream>

using namespace std;

struct Character {
	int health;
	void (*dieCallback)();
};

void damaged(Character& character) {
	character.health -= 100;
	cout << "damaged!" << endl;
	cout << "character health : " << character.health << endl;
	if (character.health <= 0) {
		cout << "you die" << endl;
		if(character.dieCallback)
			character.dieCallback();
	}
}

void gameOver() {
	cout << "GameOver" << endl;
}

int main() {
	Character character0{ 200, nullptr };
	Character character1{ 200, gameOver };

	damaged(character0);
	damaged(character0);
	damaged(character1);
	damaged(character1);

	return 0;
}
  • 코드 실행 결과

    damaged!
    character health : 100
    damaged!
    character health : 0
    you die
    damaged!
    character health : 100
    damaged!
    character health : 0
    you die
    GameOver

auto

변수를 초기화할 때 특정 타입을 명시하는 대신, auto를 사용하여 초기값에 맞춰 타입이 자동으로 선언되도록 한다.

#include <iostream>
#include <functional>

using namespace std;

void print() {
	cout << "Hello" << endl;
}

int pow1(int a) {
	return a * a;
}

int main() {
	auto f = print;
	auto& r = print;
	// auto는 자료형을 자동으로 지정해준다

	auto i = 1;

	f();
	r();

	cout << typeid(i).name() << endl;

	function<int(int)> func = pow1;
	cout << func(2) << endl;
	// <functional> 헤더 파일 내의 함수를 이용함
	return 0;
}
  • 코드 실행 결과

    Hello
    Hello
    int
    4

typedef

typedef는 이미 존재하는 타입에 새로운 이름을 붙여주어 이를 자료형의 키워드로 사용한다.

#include <iostream>
#include <functional>

using namespace std;

void printGood(int a) {
	cout << "good" << endl;
}

typedef float real32;
typedef double real64;
typedef void (FuncType)(int);

using integer = int;
using functype = void(int);
// 자료형의 이름 변환

int main(){
	real32 r32;
	real64 r64;
	integer i;

	cout << typeid(r32).name() << endl;
	cout << typeid(r64).name() << endl;
	cout << typeid(i).name() << endl;

	FuncType* f = printGood;
	functype* r = printGood;
	f(1);
	r(1);

	return 0;
}
  • 코드 실행 결과

    float
    double
    int
    good
    good

profile
어중이떠중이

0개의 댓글