Почему можно добавить два объекта класса Mat без перегрузки оператора +? - PullRequest
0 голосов
/ 11 июля 2020

По ссылке: https://docs.opencv.org/trunk/d3/d63/classcv_1_1Mat.html

оператор + не перегружен в определении класса Mat. Однако oprator + можно использовать для добавления двух объектов класса Mat. Меня это действительно смущает.

1 Ответ

1 голос
/ 11 июля 2020

Если обратиться к документации cv::Mat, то функциональность, которую вы ищете, находится под operator=(const MatExpr& expr): https://docs.opencv.org/trunk/d3/d63/classcv_1_1Mat.html#a2a0798475170fb3a23b5bc63686de334

В частности, этот раздел документации полезен (выделено мной ):

Это перегруженная функция-член, предоставленная для удобства. Она отличается от указанной выше функции только тем, какие аргументы она принимает.

Параметры

expr: Назначенный объект матричного выражения. В отличие от первой формы операции присваивания, вторая форма может повторно использовать уже выделенную матрицу, если она имеет правильный размер и тип, соответствующие результату выражения матрицы . Он автоматически обрабатывается реальной функцией, в которую расширяются матричные выражения. Например, C=A+B расширяется до add(A, B, C), а добавление заботится об автоматическом c C перераспределении.

Следовательно, происходит следующее: перегруженный оператор для присваивания (=) - это то, что вызывается, а MatExpr expr, то есть выражение MatExpr, вычисляется с правой стороны. этого. Так получилось, что вычисляемое выражение является оператором сложения, поэтому выполняется сложение двух cv::Mat, которое затем создает новую матрицу в левой части выражения.

Мораль этого история заключается в поиске ответа в документации. Вот как я узнал об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...