함수 포인터는 함수의 시작 주소를 가리키는 포인터 상수이다
#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를 사용하여 초기값에 맞춰 타입이 자동으로 선언되도록 한다.
#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는 이미 존재하는 타입에 새로운 이름을 붙여주어 이를 자료형의 키워드로 사용한다.
#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