代码
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/