C++ 문법 질문
조회수 1334회
openCV를 공부하다가 다음과 같은 경우를 만났습니다.
Range r1(0, 3), r2(3, 7);
int data[] = {
10, 11, 12, 13, 14, 15, 16,
20, 21, 22, 23, 24, 25, 26,
30, 31, 32, 33, 34, 35, 36,
40, 41, 42, 43, 44, 45, 46,
};
Mat m1, m2;
m1 = Mat(4, 7, CV_32S, data);
m2 = m1(r1, r2);
질문드리고자 하는 사항은, 위에서 m1(r1, r2); 라는 코드입니다.
m1(); 이라는 형태로 보아서, 함수같아 보입니다. 그런데, m1은 객체명입니다.
이게 어떻게 가능한건가요?
문법적으로는 구분이 가능하다는 것은 알겠는데, 저러한 방식으로 정의할 수 있는 방법에 대해서 궁금합니다. 그리고 저런 식으로 정의를 하는 것을 무엇이라고 말하는지도 궁금합니다.
m2 = m1(r1, r2);에서 m1이 Mat이라는 class의 overloading이라고는 생각되지 않습니다. instance 객체가 생성자가되는 저것을 무엇이라고 해야하고 어떤 문법인건가요??
답변 해 주시면 감사하겠습니다.
생성자 함수. 생성자. 소멸자. 흠...
1 답변
-
함수 처럼 사용할 수 있는 객체를 함수자(functor) 또는 함수 객체 라고 부릅니다.
이는 operator() 를 오버로딩하여 사용할 수 있습니다.
Mat 클래스에 보면 Mat operator()(Range row, Range col) 이 있습니다. 이 연산자를 통해 좀더 간결하고 직관적이게 행열의 원소에 접근할 수 있습니다.
예를 하나 들면 아래처럼
void operator()()
작성하여 객체를 함수 처럼 사용할 수 있습니다.#include <iostream> struct Print { void operator()() { std::cout << "hello world" << std::endl; } void operator()(char const* str) { std::cout << str << std::endl; } }; int main() { Print p; p(); p("bye~"); return 0; }
보시면 아시겠지만
operator()
는 여러 수의 파라미터를 사용할 수 있고, 이 또한 오버로딩이 가능합니다.이 외에
operator[]
,operator*
,operator->
등 다양한 연산자를 오버로딩할 수 있으니 아래 주소를 참고해 보세요.
댓글 입력