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 객체가 생성자가되는 저것을 무엇이라고 해야하고 어떤 문법인건가요??

답변 해 주시면 감사하겠습니다.

생성자 함수. 생성자. 소멸자. 흠...

  • 2017년 11월 26일에 작성됨
    인공생명(Aritificial Life)와 인공지능에 관심이 많은 학생입니다. 주로 Python을 애용 합니다.

조회수 88


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

  • 2017년 11월 27일에 작성됨

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

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close