C++成员函数指针是否不含实例信息?相关技术问询
关于C++成员函数指针的疑问
先看测试代码:
#include <iostream> class A { public: int a; A(int val) : a{val}{} int f(int); int (A::*p)(int); }; int A::f(int in) { return in + a; } int main() { A a1(1000); A a2(2000); // 注释这两行会触发段错误 a1.p = &A::f; // 无实例信息 a2.p = &A::f; // 无实例信息 std::cout << a1.p << " " << a2.p << '\n'; std::cout << std::boolalpha << (a1.p == a2.p) << '\n'; std::cout << (a1.*(a1.p))(5) << '\n'; std::cout << (a1.*(a2.p))(5) << '\n'; std::cout << (a2.*(a1.p))(5) << '\n'; std::cout << (a2.*(a2.p))(5) << std::endl; }
运行结果:
1 1 true 1005 1005 // 与上一行结果相同 2005 2005 // 与上一行结果相同
问题解答
问题1:成员函数的地址不需要等到绑定实例才确定
成员函数是类的共享资源,所有类的实例都会共用同一份函数代码,所以&A::f本身就是一个固定的地址,和具体实例无关。a1.p和a2.p里存的都是这个地址,所以它们相等。调用时绑定实例的作用,是把实例的地址作为this指针传递给成员函数,这样函数才能访问该实例的成员变量(比如代码里的a),这也是不同实例调用同一个成员函数会得到不同结果的原因。问题2:赋值
&A::f给成员函数指针的意义
成员函数指针的核心作用是封装函数逻辑,实现调用的灵活性:- 可在运行时动态给指针赋值不同的同签名成员函数,不用修改调用代码就能切换执行逻辑;
- 可将成员函数指针作为参数传递给其他函数,让外部代码指定用某个实例调用某个成员函数;
- 实现操作与实例的解耦:同一个函数指针可配合不同实例调用,复用操作逻辑。
内容的提问来源于stack exchange,提问作者starriet 차주녕
相关产品推荐
相关产品推荐

