c++ - 通过 "pass by value"将一个函数传递给另一个函数

标签 c++ parameter-passing function-pointers implicit-conversion function-declaration

代码

void printA()
{
   cout << "A\n";
}

void print1( void (*func_ptr)(void) )
{
   func_ptr();
}

void print2( void func(void))
{
   func();
}

int main()
{
  //Method 1a (passing function pointer)
  print1(&printA);
  //Method 1b (why does it work even though I didn't pass a reference or a pointer?)
  print1(printA);

  //Method 2 (passing the whole function ?)
  print2(printA);

  return 0;
}

方法 1a 有意义:print1 需要一个引用或指针。
问题一:
方法 1b 没有意义:为什么编译器不抛出错误。即使我没有将 printA() 的引用或指针传递给 print1(),为什么它仍然有效?
问题2:
方法 2a 意味着创建函数 printA() 的新拷贝并将其传递给函数 print2()。 换句话说,函数 printA() 是按值传递给函数 print2() 的吗?
问题3:
函数的标识符是引用吗? (这可能有帮助)
非常感谢。

最佳答案

该函数声明的参数

void print2( void func(void));

由编译器调整为指向函数类型的指针

void print2( void ( *func )(void));

上述两个声明声明了相同的函数,并且可能都存在于同一编译单元中,尽管编译器可以发出一条消息,表明存在冗余函数声明。

另一方面,用作上面所示函数的参数的函数指示符会隐式转换为指向该函数的指针。

你甚至可以写例如

print2(**********printA);

因此,对于这个你的问题

Method 2a implies a new copy of the function printA() is made and passed to function print2(). In other words, is the function printA() is passed to function print2() by value?

那么函数的拷贝都不会被传递。它是指向传递的函数的指针。

关于c++ - 通过 "pass by value"将一个函数传递给另一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69888911/

相关文章:

c++ - 稍后设置 wxTE_PASSWORD

c++ - 直方图均衡的属性?在没有人工制品的情况下增强对比度?

c++ - 如何创建一个充满 C 风格函数指针和 lambda 的 vector (有和没有捕获)

c++ - C++结构中的回调

c++ - 精确的纹理叠加

c++ - 在使用 c++ 和 opencv 计算垫子的大小和方向时出错

javascript - 使用 native ajax 将 Javascript 函数输出分配给 PHP session 变量 [无需 JQuery 且无需用户操作(无点击)]

C# 将双数组传递给 C++ dll

c - 良好做法:非变异函数何时应要求使用指针而不是副本?

c++ - 不允许从函数返回函数。我怎么能?