C++ 문법 질문

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답변

  • 좋아요

    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-> 등 다양한 연산자를 오버로딩할 수 있으니 아래 주소를 참고해 보세요.

    http://en.cppreference.com/w/cpp/language/operators

    • 친절하고 자세하고 명쾌하게 핵심을 잡으신 답변. 감사합니다. dbwodlf3 2017.11.27 10:12

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.