함수 객체 (function object)
「( )」 연산자를 재정의 해서 함수 처럼 사용 가능한 객체
📌 [C++] 연산자 재정의 (Operator Overloading)
[C++] 연산자 재정의 (Operator Overloading)
연산자 재정의 (Operator Overloading)사용자 정의 타입에서 +, - 등 연산자 사용할 수 있는 문법class Point{ int x = 0; int y = 0;public: Point() = default; Point(int x, int y) : x{ x }, y{ y } {}};int main(){ Point p1{ 1, 1 }; Point
zoosso.tistory.com
[예제] 함수 객체
p.operator()(1, 2) 와 같은 형태로 사용
#include <iostream>
template<typename T>
struct Plus
{
T operator()(const T& a, const T& b) const
{
return a + b;
}
};
int main()
{
Plus<int> p; // 함수가 아닌 객체
int n1 = p(1, 2); // 객체 p를 함수 처럼 사용
}
Q) 왜 함수를 사용하면 되지 객체를 사용하는가?
• 상태를 가지는 함수
• 클로저
• 인라인 치환성
• 이름 충돌 방지 (ADL 회피)
📌 [C++] ADL (Argument Dependent Lookup)
[C++] ADL (Argument Dependent Lookup)
ADL (Argument Dependent Lookup)• 함수 검색할 때 인자가 포함된 namespace는 자동으로 검색에 포함! • Koening Lookup 라고도 부름#include namespace Harbang{ class Point {}; void draw(const Point& p) { printf("draw..\n"); }}int mai
zoosso.tistory.com
[예제] 난수 만들기
#include <iostream>
#include <cstdlib>
int urand()
{
return rand() % 10;
}
int main()
{
for (int i = 0; i < 10; i++)
{
printf("%d ", urand());
}
}
난수 생성하지만 중간에 중복 숫자가 보이는 것을 확인할 수 있다.
중복 없는 난수를 만드려면
해당 숫자가 등장한 적이 있다는 상태를 보관해주어야 한다.
전역 변수로 값을 보관할 수도 있지만
일반적으로 좋은 코드가 아니다.
[예제] 함수 객체 (중복 없는 난수)
#include <iostream>
#include <cstdlib>
#include <bitset>
class URandom
{
std::bitset<10> bs;
public:
URandom()
{
bs.set(); // bit 모두 "1"
}
int operator()()
{
if (bs.none()) // "1" 인 bit가 없는 경우
{
return -1;
}
int v = -1;
while (!bs.test(v = rand() % 10));
bs.reset(v); // 해당 bit "0"
return v;
}
};
URandom urand;
int main()
{
for (int i = 0; i < 15; i++)
{
printf("%d ", urand());
}
}
크기를 10으로 해놓아서
11번째 숫자부터는 "-1"
[C++] [STL] bitset
bitset - 비트연산과 관련된 STL 이다. ▶ 비트마스크 (Bitmask) 비트마스크 (Bitmask) 비트마스크 정수의 이진수 표현(Bit)을 자료 구조로 쓰는 기법 현대의 모든 CPU는 이진수를 이용해도 모든 자fy 표현
zoosso.tistory.com
'프로그래밍 언어 > C++' 카테고리의 다른 글
[C++] 오류 처리 방식 (Error Handling) (3) | 2025.03.17 |
---|---|
[C++] 깊은 복사 (Deep Copy) (2) | 2025.03.16 |
[C++] 상속과 복사/대입 연산자 (0) | 2025.03.14 |
[C++] 얕은 복사 (Shallow Copy) (2) | 2025.03.13 |
[C++] 스마트 포인터(Smart Pointer) 원리 (2) | 2025.03.12 |
댓글