更改函数内的参数值是正确的

时间:2016-05-05 10:30:24

标签: c++

在这段代码中,我改变了作为函数参数的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 个答案:

答案 0 :(得分:2)

只要您没有参考参数,更改值就不会对您的功能产生任何影响。

这样做很好,你不需要额外的变量。

答案 1 :(得分:1)

在这种特殊情况下是正确的,它没有副作用,因为这里的参数是传递的实际参数的副本。

但是如果你无意中改变参考传递的参数,它可能会在一般情况下造成麻烦。

同样修改参数通常会使代码更难读。并且可能需要更多时间来理解函数中发生的事情。

因此,通常我不建议修改参数。将此优化保留给编译器。

答案 2 :(得分:1)

您可以创建一个内联最低函数调用的临时变量,如下所示:

threshold(CurImg,CurImg,dThresh,dMaxval, bTreshOtsu ? iType|THRESH_OTSU : iType);

答案 3 :(得分:1)

关于功能参数,您应该清楚几点:

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

上述函数会将每个参数值的副本传递给函数体。当使用局部变量调用时,在函数中修改局部变量后,局部变量的值将保持不变。

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

在函数上方将使用非const引用,这意味着您可以修改函数中引用参数的值。如果使用局部变量调用此版本并修改参数,则在调用返回后将修改局部变量。

你也问这是否可以......我个人试图不使用参数,如果我可以避免它,因为我认为返回值通常更清晰。然而,它没有任何问题。我要说的唯一警告是,你应该与你传递参数的方式保持一致。