C++函数指针做类的成员
时间: 2023-11-07 20:49:27 浏览: 52
C++函数指针可以用于作为类的成员函数。在C++中,成员函数指针的类型是`typedef int (A::* pClassFun)(int, int);`,其中A是类的名称,`pClassFun`是指向A类成员函数的指针类型。成员函数指针的声明和普通函数指针有所不同,需要使用`A::*`来指定成员函数的作用域。
使用成员函数指针时,我们需要先创建一个对象,然后通过对象来调用指定的成员函数。可以使用`.*`或者`->*`运算符来调用成员函数指针所指向的函数。
例如,对于以下代码段:
```cpp
class A {
public:
int add(int a, int b) {
return a + b;
}
};
typedef int (A::* pClassFun)(int, int);
int main() {
pClassFun pointer = &A::add;
A aa;
cout << (aa.*pointer)(10, 20);
}
```
其中`pClassFun`是一个指向A类的成员函数的指针类型,`pointer`是一个指向A类的`add`成员函数的指针。在`main`函数中,我们创建了一个A类的对象`aa`,然后使用`.*`运算符来调用成员函数指针`pointer`所指向的`add`函数,并传递参数10和20,最后将结果输出到控制台。
通过使用成员函数指针,我们可以在运行时动态地选择调用不同的成员函数,这对于设计灵活的代码结构非常有用。
相关问题
C++类成员函数函数指针
C++中类成员函数指针是一个指向类成员函数的指针,它可以用来调用该类的成员函数。类成员函数指针的类型与类成员函数的类型有关,它包含两个部分:一个是成员函数的类型,另一个是成员函数所属的类的指针类型。
在C++中,类成员函数指针是通过使用运算符::来声明的。例如,假设有一个名为Foo的类,其中包含一个名为bar的成员函数,可以使用以下方式声明一个指向bar的成员函数指针:
```
void (Foo::*functionPtr)(); //声明一个指向Foo类的成员函数的指针
```
这里使用了void类型来表示bar函数的返回值,使用Foo::*来表示成员函数所属的类类型,使用functionPtr来表示指向bar函数的指针。
要调用指针所指向的成员函数,可以使用以下语法:
```
Foo obj;
(obj.*functionPtr)(); //调用obj对象的bar成员函数
```
在这里,使用obj.*来表示调用obj对象的成员函数指针,然后使用()来调用该函数。
需要注意的是,类成员函数指针与普通函数指针不同,因为它需要传递类对象的指针或引用作为参数,才能正确调用成员函数。因此,在使用类成员函数指针时,需要先创建类对象,并将其指针或引用传递给成员函数指针。
C++类函数指针成员变量
C++类函数指针成员变量可以用于实现回调函数等功能。下面是一个简单的例子:
```cpp
#include <iostream>
class MyClass {
public:
void func1() {
std::cout << "func1" << std::endl; }
void func2() {
std::cout << "func2" << std::endl;
}
void (MyClass::*funcPtr)(); // 声明函数指针成员变量
};
int main() {
MyClass obj;
obj.funcPtr = &MyClass::func1; // 将函数指针成员变量指向func1
(obj.*obj.funcPtr)(); // 调用func1,输出:func1
obj.funcPtr = &MyClass::func2; // 将函数指针成员变量指向func2
(obj.*obj.funcPtr)(); // 调用func2,输出:func2
return 0;
}
```
在上面的例子中,我们定义了一个名为`MyClass`的类,其中包含了两个成员函数`func1`和`func2`,以及一个函数指针成员变量`funcPtr`。在`main`函数中,我们首先将`funcPtr`指向`func1`,然后通过`(obj.*obj.funcPtr)()`的方式调用`func1`;接着将`funcPtr`指向`func2`,再次通过`(obj.*obj.funcPtr)()`的方式调用`func2`。
相关推荐
![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)