了解以下C++函数定义
Understanding the following C++ function definition
double randNormal(double (*fun)(double, double, double), double xmin, double xmax, double sigma, double mju)
{
static double (*Fun)(double, double, double) = NULL, YMin, YMax;
static bool First = true;
if (First)
{
First = false;
srand((unsigned) time(NULL));
}
if (fun != Fun)
{
Fun = fun;
YMin = 0, YMax = Fun(xmin, sigma, mju);
for (int iX = 1; iX < 10000; iX++)
{
double X = xmin + (xmax - xmin) * iX / 10000;
double Y = Fun(X, sigma, mju);
YMax = Y > YMax ? Y : YMax;
}
}
double X = xmin + (xmax - xmin) * rand() / RAND_MAX;
double Y = YMin + (YMax - YMin) * rand() / RAND_MAX;
return Y < fun(X, sigma, mju) ? X : randomNormal(Fun, xmin, xmax, sigma, mju);
}
我对C++很陌生,我正在努力理解上面的代码。当我们定义函数randNormal
时,(*fun)(double, double, double)
的作用是什么?此外,从static double
开始的第二行完成了什么?我将不胜感激你的帮助!
这是一个
函数指针。在本例中,返回一个双精度值并将 3 个双精度值作为参数的函数。 Fun
以相同的方式声明,稍后调用,使用 3 个双精度作为参数)
static double
行声明一个函数指针 Fun 就像 fun 一样和两个双精度值。 此处static
意味着值将保留,并且在下次调用函数时仍然可用。
编辑:要了解有关函数指针的更多信息,请参阅此处:C 中的函数指针如何工作?
> double (*fun)(double, double, double)
是一个指向函数的指针,该函数将 3 个双精度作为参数并返回一个双精度。例如,当您有
double example(double a, double b, double c){
return a+b+c;
}
你可以通过以下方式传递这个函数
double x = randNormal(example,...);
static Fun
在函数调用之间保持其值。这就是为什么在函数中检查它的原因,如果Fun != fun
并且仅当true
时才将参数分配给static
变量。但是,为了更好地解释,我必须知道这个函数的逻辑是什么。
PS:使用函数指针时,typedef
s可以有很大帮助。用
typedef (double)(*FUNCTION_TYPE)(double,double,double);
或者更一般地说,
typedef (return_type)(*FUNCTION_TYPE)(parameter_type);
可以帮助使声明更易于编写和可能阅读。
函数 randNormal 的第一个参数 "double (*fun)(double, double, double)" 是一个函数指针。下面的示例将向您解释函数指针在某个级别的用法。代码注释将详细解释。
#include <iostream>
//Actual function 1
double fnGetMax(double a, double b, double c) {
//return someMathLibrary::StaticMaxOf(a, b ,c);
return a-b-c;
}
//Actual function 2
double fnGetMin(double a, double b, double c) {
//return someMathLibrary::StaticMinOf(a, b ,c);
return a+b+c;
}
//Actual function 3
//which takes the "function pointer" as argument of the actual functions like 1 & 2
double randNormal(double (*fun)(double, double, double), double xmin, double xmax, double sigma, double mju) {
static double (*Fun)(double, double, double) = NULL, YMin, YMax;
static bool First = true;
if (First) {
First = false;
srand((unsigned) time(NULL));
}
if (fun != Fun) {
Fun = fun;
//calling actual function 1 or 2
YMin = 0, YMax = Fun(xmin, sigma, mju);
} else {
//calling actual function 1 or 2
YMax = 0, YMin = Fun(xmax, sigma, mju);
}
return YMin + YMax;
}
int main(int argc, char** argv) {
//Creating function pointer for the actual function 1
double (*funMax_ptr)(double, double, double) = &fnGetMax;
//Creating function pointer for the actual function 2
double (*funMin_ptr)(double, double, double) = &fnGetMin;
//Passing the function pointer to the randNormal (actual function 3)
std::cout << randNormal(funMax_ptr,1.0,2.0,3.0,4.0) << std::endl;
std::cout << randNormal(funMin_ptr,1.0,2.0,3.0,4.0) << std::endl;
return 0;
}
输出:
-6
8
相关文章:
- 不同翻译单元中不可重载的非内联函数定义
- Visual Studio中的函数声明和函数定义问题
- 编写代码时C++出现错误:错误 1 错误 C2601:'circle':本地函数定义是非法的
- 具有enable_if外部类原型的模板类构造函数定义
- 类的前向声明之后的类成员函数定义,在类声明之前
- 为函数定义符号不明确的指针参数
- C++模板专用化 - 无法匹配函数定义
- 错误:在第 6 行'{'标记之前,此处不允许使用函数定义
- 找不到 #define 的函数定义
- 根据类型特征更改函数定义?
- 将抽象基类中的所有纯虚函数定义为 varaidaic 模板
- 命名空间更改函数定义
- "Type&"与C++函数定义中的"Type*"
- C++:为什么允许在另一个函数中声明函数,而不允许在函数定义中声明?
- 如何从 C++ 中的现有模板函数定义新函数
- 私有在函数定义/实现的返回值范围内是什么意思 (c++)?
- 越界成员函数定义是否需要一个完全限定的类名,直到全局范围
- 为什么c++允许成员函数定义中实例的私有成员访问
- Qt基类函数定义
- C++函数定义中参数列表后面额外一对括号的含义