在这段代码中,我改变了作为函数参数的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);
答案 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引用,这意味着您可以修改函数中引用参数的值。如果使用局部变量调用此版本并修改参数,则在调用返回后将修改局部变量。
你也问这是否可以......我个人试图不使用参数,如果我可以避免它,因为我认为返回值通常更清晰。然而,它没有任何问题。我要说的唯一警告是,你应该与你传递参数的方式保持一致。