面试题答案
一键面试普通函数指针和类成员函数指针的区别
- 调用方式:
- 普通函数指针:直接通过指针调用函数,语法为
(*funcPtr)(args)
,这里funcPtr
是普通函数指针,args
是函数参数。普通函数在内存中有独立的地址,不依赖于任何对象。 - 类成员函数指针:需要通过类对象或指向类对象的指针来调用,语法为
(obj.*memFuncPtr)(args)
或(ptr->*memFuncPtr)(args)
,其中obj
是类对象,ptr
是指向类对象的指针,memFuncPtr
是类成员函数指针。类成员函数与类的特定对象相关联,除了函数代码外,还需要对象的this
指针来确定操作的具体对象。
- 普通函数指针:直接通过指针调用函数,语法为
- 指针类型:
- 普通函数指针:类型只包含函数的参数列表和返回类型,例如
int (*funcPtr)(int, int)
表示指向返回int
类型,接受两个int
类型参数的普通函数指针。 - 类成员函数指针:类型除了函数的参数列表和返回类型外,还与类相关,例如
void (MyClass::*memFuncPtr)(int)
表示指向MyClass
类中接受一个int
参数且返回void
的成员函数指针。
- 普通函数指针:类型只包含函数的参数列表和返回类型,例如
定义和使用指向MyClass::memberFunction
的指针
假设有如下MyClass
类:
class MyClass {
public:
void memberFunction(int param) {
std::cout << "Member function called with param: " << param << std::endl;
}
};
定义和使用指向memberFunction
的指针如下:
#include <iostream>
class MyClass {
public:
void memberFunction(int param) {
std::cout << "Member function called with param: " << param << std::endl;
}
};
int main() {
// 定义类成员函数指针
void (MyClass::*memFuncPtr)(int) = &MyClass::memberFunction;
MyClass obj;
// 通过对象调用成员函数指针
(obj.*memFuncPtr)(42);
MyClass* ptr = &obj;
// 通过对象指针调用成员函数指针
(ptr->*memFuncPtr)(100);
return 0;
}
使用类成员函数指针时需要注意的事项
- 初始化:类成员函数指针必须初始化后才能使用,要确保其指向类的实际成员函数。
- 对象关联性:调用类成员函数指针时,必须通过有效的类对象或指向类对象的指针,否则会导致未定义行为。
- 多态性:如果类成员函数是虚函数,使用类成员函数指针调用时不会体现多态性。要实现多态调用,需要使用
virtual
函数结合dynamic_cast
等机制,而不是直接使用类成员函数指针。