В этом коде я изменяю переменную 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);
c++
1
Bleach 5 Май 2016 в 13:30

4 ответа

Лучший ответ

Это правильно в данном конкретном случае и не имеет побочных эффектов, поскольку аргумент здесь является копией фактического переданного параметра.

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

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

Поэтому, как правило, я бы не рекомендовал изменять параметры. Оставьте эту оптимизацию компилятору.

2
Alexander Stepaniuk 5 Май 2016 в 10:39

Есть несколько вещей, которые вы должны уяснить относительно параметров функции:

void IPThreshold( double dThresh, double dMaxval, int iType, bool bTreshOtsu );

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

void IPThreshold( double& dThresh, double& dMaxval, int& iType, bool bTreshOtsu );

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

Вы также спрашиваете, нормально ли это ... ну, я лично пытаюсь не использовать для этого параметры, если я могу этого избежать, поскольку я думаю, что возвращаемые значения обычно более ясны. Однако в этом нет ничего плохого. Единственное предостережение, которое я хотел бы сказать, заключается в том, что вы должны соответствовать значению того, как вы передаете свои параметры.

1
Dennis 5 Май 2016 в 10:56

Вы можете создать временную переменную, встроенную в самый нижний вызов функции, следующим образом:

threshold(CurImg,CurImg,dThresh,dMaxval, bTreshOtsu ? iType|THRESH_OTSU : iType);
1
vegi 5 Май 2016 в 10:50

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

Это нормально, и вам не нужна дополнительная переменная.

2
πάντα ῥεῖ 5 Май 2016 в 10:32