C++函数指针作为参数
时间: 2024-06-04 19:03:06 浏览: 17
C++函数指针作为参数的示例代码如下:
```cpp
#include <iostream>
using namespace std;
void printHello() {
cout << "Hello!" << endl;
}
void printWorld() {
cout << "World!" << endl;
}
void callFunction(void (*func)()) {
func();
}
int main() {
callFunction(printHello); // 输出:Hello!
callFunction(printWorld); // 输出:World!
return 0;
}
```
在上述代码中,我们定义了两个函数`printHello()`和`printWorld()`,它们分别输出"Hello!"和"World!"。然后我们定义了一个名为`callFunction()`的函数,它的参数是一个函数指针`void (*func)()`。在`callFunction()`函数中,我们通过调用函数指针来间接调用传入的函数。在`main()`函数中,我们通过将`printHello`和`printWorld`函数的指针作为参数传递给`callFunction()`函数来实现函数指针作为参数的调用。
相关问题
C++函数作为参数传递
当我们将函数作为参数传递给另一个函数时,我们可以使用函数指针或函数对象(函数器)来实现。
1. 函数指针:
使用函数指针,我们首先需要定义一个与要传递的函数具有相同签名(参数和返回值类型)的函数指针类型。然后,我们可以将函数的名称赋给指针,并将该指针作为参数传递给另一个函数。
例如,假设我们有一个函数 `void foo(int)`,我们希望将其作为参数传递给另一个函数 `void bar(void (*func)(int))`,则可以这样做:
```cpp
void foo(int x) {
// 函数体
}
void bar(void (*func)(int)) {
// 调用函数指针所指向的函数
func(42);
}
int main() {
// 将函数指针作为参数传递给另一个函数
bar(foo);
return 0;
}
```
2. 函数对象(函数器):
C++中的函数对象是可调用对象,可以像函数一样被调用。我们可以定义一个类,并在该类中实现 `operator()` 运算符重载。然后,我们可以创建该类的对象,并将该对象作为参数传递给另一个函数。
例如,假设我们有一个函数对象类 `Foo`,我们希望将其作为参数传递给另一个函数 `void bar(Foo)`,则可以这样做:
```cpp
class Foo {
public:
void operator()(int x) {
// 函数体
}
};
void bar(Foo func) {
// 调用函数对象
func(42);
}
int main() {
// 将函数对象作为参数传递给另一个函数
Foo foo;
bar(foo);
return 0;
}
```
无论是使用函数指针还是函数对象,我们都可以将函数作为参数传递给其他函数,并在接受参数的函数中调用该函数。这样可以实现更灵活的代码设计和功能扩展。
C++指针作为函数参数该怎么写
在 C++ 中,指针作为函数参数可以通过以下两种方式传递:
1. 传递指针的地址:函数接受一个指针的指针,即一个指向指针的指针。这样函数就可以修改原始指针的值。
```c++
void func(int **ptr) {
*ptr = new int(10);
}
int main() {
int *ptr = nullptr;
func(&ptr);
std::cout << *ptr << std::endl; // 输出 10
delete ptr;
return 0;
}
```
2. 传递指针的引用:函数接受一个指针的引用,即一个指向指针的引用。这样函数也可以修改原始指针的值。
```c++
void func(int* &ptr) {
ptr = new int(10);
}
int main() {
int *ptr = nullptr;
func(ptr);
std::cout << *ptr << std::endl; // 输出 10
delete ptr;
return 0;
}
```
注意,当函数返回时,如果该指针是通过 new 分配的动态内存,则必须在使用完指针后手动释放内存。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)