函数指针是一种特殊类型的指针,它指向一个函数而不是指向数据。函数指针允许你在程序运行时动态地选择要调用的函数,这对于实现回调函数、事件处理、动态加载库和创建通用函数接口等任务非常有用。
要声明一个函数指针,你需要指定它将指向的函数的签名,包括返回类型和参数列表。函数指针的声明形式如下:
return_type (*function_pointer_name)(parameter_types);
return_type:函数的返回类型。function_pointer_name:函数指针的名称。parameter_types:函数的参数类型列表。例如,下面是一个声明函数指针的示例:
int (*addPtr)(int, int); // 声明一个指向返回int类型、接受两个int参数的函数指针
你可以将函数指针初始化为指向特定的函数。这样,函数指针将指向该函数的代码,以便你可以使用它来调用该函数。以下是初始化函数指针的示例:
addPtr = add; // 将函数指针addPtr指向add函数
addPtr 指向了 add 函数。一旦函数指针指向了函数,你可以使用它来调用该函数,就像调用普通函数一样。示例如下:
int result = addPtr(5, 3); // 使用函数指针调用add函数
result 将包含 add(5, 3) 的返回值,即 8。你还可以创建函数指针的数组或指向函数指针的指针,以处理多个函数或更复杂的情况。这些构造允许你在运行时选择要执行的函数。
- int (*operation[])(int, int) = {add, subtract}; // 创建一个包含add和subtract函数指针的数组
- int result1 = operation[0](5, 3); // 调用add函数
- int result2 = operation[1](5, 3); // 调用subtract函数
- int (*(*ptrToFuncPtr))(int, int) = &addPtr; // 创建一个指向addPtr的指针
- int result = (*ptrToFuncPtr)(5, 3); // 通过指针调用addPtr指向的add函数
除了普通函数,C++还支持成员函数指针,用于调用类的成员函数。成员函数指针的声明和使用方式略有不同,如下所示:
- class MyClass {
- public:
- int add(int a, int b) {
- return a + b;
- }
- };
-
- int (MyClass::*memberFunctionPtr)(int, int) = &MyClass::add; // 成员函数指针声明和初始化
-
- MyClass obj;
- int result = (obj.*memberFunctionPtr)(5, 3); // 使用成员函数指针调用成员函数
std::function和std::bindC++还提供了更高级的功能,如 std::function 和 std::bind,它们可以用于封装函数指针和函数对象,使函数调用更灵活和容易管理。
- #include
- #include
-
- int add(int a, int b) {
- return a + b;
- }
-
- int main() {
- std::function<int(int, int)> operation = add; // 使用std::function封装函数指针
- int result = operation(5, 3); // 调用封装的函数指针
- std::cout << "Result: " << result << std::endl;
-
- return 0;
- }
std::function 允许你将函数指针、函数对象和lambda表达式封装为一个可调用的对象,从而提供了更大的灵活性。
总之,C++函数指针是一种强大的工具,可用于实现动态函数调用和创建通用接口。通过了解函数指针的基本概念和用法,你可以更好地理解和利用这一功能来满足各种编程需求。
- void display(string name) {
- cout << "hello " << name << endl;
- }
- void display2() {
- cout << "hahahhaha" << endl;
- }
- int main() {
-
- void (*p1)() = lambda_use;
- p1();
-
- typedef void (*func1)();
- func1 p2 = display2;
- p2();
-
-
- typedef void (*func2)(string name);
- func2 p3=display;
- p3("张三");
-
- void (*p4)(string name) = display;
- p4("李四");
-
-
- return 0;
- }

- class base {
- public:
- void display() {
- cout << "这是base类的display!" << endl;
- }
- static void run() {
- cout << "这是静态成员函数run!" << endl;
- }
- };
- base b;
- void (base:: * p2)() = &base::display;//指向普通成员函数
- (b.*p2)();
-
- //使用typedef
- typedef void (*func)();
- func p1 = &base::run;//指向静态成员函数
- p1();
-
- //不使用typedef
- void(*p1)() = &base::run;//指向静态成员函数
- p1();
- typedef void (*Func)(string name);
- Func p2= [](string name) {
- cout << "hello !" << name << endl;
- };
- void (*p1)(string name) = [](string name) {
- cout << "hello !" << name << endl;
- };
- p1("张三");
- p2("赵六");
