C++中 void(*)() 和 void(&)() 的区别
Difference between void(*)() and void(&)() in C++
在本示例代码中,func1
是void (*)(int, double)
的类型,funky
是void(&)(int, double)
的类型。
#include <iostream>
using namespace std;
void someFunc(int i, double j) {
cout << i << ":" << j << endl;
}
int main(int argc, char *argv[]) {
auto func1 = someFunc;
auto& func2 = someFunc;
cout << typeid(func1).name() << endl;
cout << typeid(func2).name() << endl;
func1(10, 20.0);
func2(10, 30.0);
}
输出显示差异:
PFvidE
FvidE
10:20
10:30
实际上,这两种类型之间有什么区别?
如果您希望能够为函数分配指针,然后稍后更改指针指向的内容,则使用auto fp = func
。如果没有,则使用参考auto& rp = func
,因为您无法重新分配它:
#include <iostream>
using namespace std;
int funcA(int i, int j) {
return i+j;
}
int funcB(int i, int j) {
return i*j;
}
int main(int argc, char *argv[]) {
auto fp = funcA;
auto& rp = funcA;
cout << fp(1, 2) << endl; // 3 (1 + 2)
cout << rp(1, 2) << endl; // 3 (1 + 2)
fp = funcB;
//rp = funcB; // error: assignment of read-only reference 'rp'
cout << fp(1, 2) << endl; // 2 (1 * 2)
return 0;
}
我试图想出一个更实际的例子来说明为什么任何人都会这样做,下面是一些使用指针数组根据用户输入调用函数的代码(arr
的任何元素也可以在运行时更改以指向另一个函数(:
#include <iostream>
using namespace std;
void funcA(int i, int j) {
std::cout << "0: " << i << ", " << j << endl;
}
void funcB(int i, int j) {
std::cout << "1: " << i << ", " << j << endl;
}
void funcC(int i, int j) {
std::cout << "2: " << i << ", " << j << endl;
}
int main(int argc, char *argv[]) {
if (argc < 2) {
cout << "Usage: ./a.out <val>" << endl;
exit(0);
}
int index = atoi(argv[1]);
if (index < 0 || index > 2) {
cout << "Out of bounds" << endl;
exit(0);
}
void(* arr[])(int, int) = { funcA, funcB, funcC };
arr[index](1, 2);
return 0;
}
auto func1 = someFunc;
auto& func2 = someFunc;
假设你有另一个函数,你想让func2指向另一个函数
void function()
{
cout<<"Hello world"<<endl;
}
所以你在下面做
func2 = function();
你得到的只是编译错误。func2
的原因是引用,一旦初始化引用,就不能更改。
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- "void function()"和"void *function()"有什么区别?
- C++ - 在线程中使用时,将函数的返回值声明为 void/void* 之间有什么区别吗?
- 类型转换时C++ (void *) 变量和 (void *&) 变量有什么区别
- void和void有什么区别
- C++中void函数和非void函数之间的区别
- "C++ void Pointer"和"C# var"的区别
- C++:contructor() 和 constructor(void) 之间的区别
- void() 和 void{} 有什么区别?
- void(int) 和 void (*)(int) 之间的区别
- 在c++中,VOID和VOID有区别吗
- void(int) 和 void(*)(int) 有什么区别?
- "void f1(const class &c)"和"void f2(class const &c)"有什么区别?
- Qt5中的void QSqlQuery::clear()和void QSqlQuery::finish()之间有什么区别
- 没有参数和C++中的void参数有什么区别
- 如果两者都以相同的方式工作,那么使用 void func(struct myStruct s) 和 void func(myStruct s) 有什么区别?
- (void*) 和 (void(*)(参数类型)) 强制转换有什么区别
- C++中 void(*)() 和 void(&)() 的区别