В этом коде я изменяю переменную iType, которая является параметром функции. Работает нормально, но правильно ли?
void ImgCoreQCV::IPThreshold( double dThresh, double dMaxval, int iType, bool bTreshOtsu ) {
if(bTreshOtsu)
iType |= THRESH_OTSU;
if(undoVector.back().channels()!=1)
cvtColor(undoVector.back(),CurImg,CV_BGR2GRAY);
threshold(CurImg,CurImg,dThresh,dMaxval,iType);
}
Я имею в виду, что я не создавал новую переменную, а изменил ее:
int iThreshType = iType;
if(bTreshOtsu)
iThreshType = iType | THRESH_OTSU;
threshold(CurImg,CurImg,dThresh,dMaxval,iThreshType);
4 ответа
Это правильно в данном конкретном случае и не имеет побочных эффектов, поскольку аргумент здесь является копией фактического переданного параметра.
Но в общем случае может возникнуть проблема, если вы случайно измените параметр, переданный по ссылке.
Кроме того, изменение параметров обычно ухудшает читаемость кода. И может потребоваться больше времени для понимания того, что на самом деле происходит в функции.
Поэтому, как правило, я бы не рекомендовал изменять параметры. Оставьте эту оптимизацию компилятору.
Есть несколько вещей, которые вы должны уяснить относительно параметров функции:
void IPThreshold( double dThresh, double dMaxval, int iType, bool bTreshOtsu );
Вышеупомянутая функция передает копии каждого из значений параметра в тело функции. При вызове с локальной переменной значение локальной переменной не изменяется после того, как вы изменили его в функции.
void IPThreshold( double& dThresh, double& dMaxval, int& iType, bool bTreshOtsu );
Выше функция будет использовать неконстантные ссылки , что означает, что вы можете изменить значение указанного параметра внутри функции. Если вы вызываете эту версию с локальной переменной и изменяете параметр, то локальная переменная будет изменена после возврата вызова.
Вы также спрашиваете, нормально ли это ... ну, я лично пытаюсь не использовать для этого параметры, если я могу этого избежать, поскольку я думаю, что возвращаемые значения обычно более ясны. Однако в этом нет ничего плохого. Единственное предостережение, которое я хотел бы сказать, заключается в том, что вы должны соответствовать значению того, как вы передаете свои параметры.
Вы можете создать временную переменную, встроенную в самый нижний вызов функции, следующим образом:
threshold(CurImg,CurImg,dThresh,dMaxval, bTreshOtsu ? iType|THRESH_OTSU : iType);
Пока у вас нет параметров по ссылке, изменение значения не будет иметь никакого эффекта вне вашей функции.
Это нормально, и вам не нужна дополнительная переменная.
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.