함수 객체란?함수처럼 동작하는 객체로, 함수를 호출할때 ( )를 붙이는데 이 또한 연산자입니다.다시말해 ( ) 연산자를 오버로딩한 객체를 함수 객체라고 합니다.다른 말로는 함수자(Functor)라고 합니다. 함수 객체를 사용하는 이유1. 다른 멤버 변수와 멤버 함수를 가질 수 있습니다.2. 함수 객체의 서명이 같더라도 객체 타입이 다르면 서로 전혀 다른 타입으로 인식합니다.3. 일반 함수보다 속도가 빠릅니다.=> 함수의 주소를 전달하여 콜백하는 경우 이 함수 포인터는 인라인이 될 수 없습니다.일반적인 함수는 스택에 호출 주소가 적재되고 호출시 스택의 주소를 통해 내용을 부르고 돌아오며 함수 호출의 오버헤드가 생기는데, 인라인을 하게되면 이를 줄일 수 있습니다.※인라인(inline): 코드 라인 자체가 안..
콜백 함수일반적으로 클라이언트가 서버 코드를 호출하는데 이를 콜(Call)이라 하고,서버가 클라이언트를 호출하면 콜백(Callback)이라 한다.STL의 많은 알고리즘도 콜백을 이용해 클라이언트 정책을 반영한다.윈도의 모든 프로시저는 시스템이 호출하는 "콜백 함수"이다. 함수 포인터를 활용한 콜백 메커니즘 코드 #include using namespace std;///배열의 모든 원소에 반복적인 작업을 수행하게 추상화void For_each(int* begin, int* end, void(*pf)(int)) { while (begin != end) { pf(*begin++); }}void Print1(int n) { cout For_each함수가 Print1, 2, 3을 호출하는 콜백 메커니즘입니다...
멤버 함수 호출멤버 함수 호출은 포인터 선언에 어떤 클래스의 멤버 함수를 가리킬건지 클래스이름을 지정해줘야 합니다.Ex) 시그니처가 void Point::Print(int n)인 멤버 함수 포인터 선언void(Point::*pf)(int) 로 pf 멤버 포인터 선언- * 객체로 멤버 함수 호출 시에는 .* 연산자를 이용한다. 예를 들어 (객체.*pf)(10) 처럼 사용- * 주소로 멤버 함수 호출 시에는 -> * 연산자를 이용한다. 예를 들어 (주소->*pf)(10) 처럼 사용 코드#include using namespace std;class Point { int x; int y;public: explicit Point(int _x = 0, int _y = 0) : x(_x), y(_y) {} void ..
정적 함수 호출함수 시그니처(반환과 매개변수 일치)를 맞춰주기만 하면 쉽게 선언 할 수 있다. 코드#include using namespace std;void Print(int n) { cout Main 외에 있는 코드들에 보이는 함수들은 반환이 void이고 매개변수를 int형 하나를 받고있기에함수 포인터의 시그니처를 이와 같이 맞춰줘야 합니다.그렇기에 void (*pf) (int)로 똑같이 맞춰줍니다. 결과
함수 포인터함수의 시작 주소를 저장하는 포인터주로 변수를 저장할때 포인터를 써왔지만 함수도 스택에 주소가 저장되기 때문에 포인터를 통해 참조가능. 함수의 시작 주소를 저장하는 포인터로 함수 시그니처(함수의 반환 타입과 매개변수 리스트)와 같게 선언. #include using namespace std;void Print(int n) { cout void(*pf)(int)void : 반환값이 없다.(*pf): 함수 포인터(int): 매개변수를 int형으로 받는다.Print 전역변수를 pf에 할당해주기 위해서는 함수포인터의 반환값과 매개변수 즉 시그니처를 맞춰줘야함. 결과
1. 다음 이항 연산자 +가 호출하는 오버로딩 함수 두 개를 고르세요.Point p1, p2;p1+p2;operator+(p2,p1);p1.operator+(p2);operator+(p1,p2);p2.operator(p1);답: 2,31번이 안되는 이유: 매개변수의 순서가 p2가 먼저오기 때문에 p2+p1에 대해서 가능하므로 X4번 역시 this인 자기자신이 p2기 때문에 불가능 2. 다음 세 인자를 받는 () 연산자 오버로딩 함수 선언으로 맞는 것은?func(10, 20, 30);void operator()(void);void operator()(int);void operator()(int, int);void operator()(int,int,int);답: 4이유: 오버로딩은 함수이름이 같지만 전달받는..
클래스 타입 변환 연산자타입 변환 연산자 오버로딩을 통해 자기 자신의 타입을 다른 타입으로 변환소스코드#include using namespace std;class Point { int x; int y;public: explicit Point(int _x = 0, int _y = 0) : x(_x), y(_y) {} void Print() const { cout 코드 내용Point형 pt를 생성자 매개변수 2,3을 전달하여 생성.int형 n에 pt를 넣으면 타입변환 오버로딩 함수가 호출되어 this.pt의 x값만 반환되며 n에 들어가게됨.그 결과 n에는 pt의 2값이 들어갈 수 있어 결과적으로 2가 출력.실행 결과
타입 변환 연산자 오버로딩클래스에 각기 다른 타입으로 생성자를 오버로딩 하는 방식소스코드#include using namespace std;class A {};class B {public: /*B() { cout 코드 내용A 클래스 타입 a, int형 n, double형 d를 그리고 B클래스타입 b 총 4개를 미리 정의b에 각각 a, n, d에 대한 생성자로 할당해줌.B클래스에 있는 오버로딩된 생성자들을 통해 특정 타입을 인자로 받는 생성자 호출을 통한 타입 변환(객체 생성 후 대입)이 가능해짐!실행 결과