当前位置:   article > 正文

c++ 类成员函数地址。_c++成员函数地址

c++成员函数地址

类成员函数类型声明和变量定义

c++ 成员函数地址声明方式和定义如下:

类型声明:typedef void (MyClass::*pFunType)(); 或using pFunType2 = void (MyClass::*)();

变量定义:void (MyClass::*p1)();

例子:

  1. class MyClass
  2. {
  3. public:
  4. void Show(){}
  5. };
  6. int main()
  7. {
  8. typedef void (MyClass::*pFunType)();
  9. using pFunType2 = void (MyClass::*)();
  10. void (MyClass::*p1)();
  11. p1 = &MyClass::Show;
  12. pFunType p2 = &MyClass::Show;
  13. pFunType2 p3 = &MyClass::Show;
  14. return 0;
  15. }

类成员函数使用

类成员函数使用需要3个特殊运算符: ::*  .* 和 ->*

在类型声明时需要使用 ::* 比如: void (MyClass::*p1)();

使用时需要.* 和 ->* 比如:MyClass a; (a.*p1)();


类成员函数的大小

指针大小32为下是4个字节,64位下是8个字节。然而类成员函数的大小呢?

gcc编译器5.4版本,类成员函数地址是void *大小的两倍。

vs 编译器在单继承或不继承的情况下函数地址大小和void*一样,多继承类成员函数地址是void *大小的两倍。

  1. #include <iostream>
  2. class IType {
  3. public:
  4. void Show1() {
  5. }
  6. };
  7. class IType2 {
  8. public:
  9. void Show2() {
  10. }
  11. };
  12. class MyClass : IType, IType2
  13. {
  14. public:
  15. void Show3() {}
  16. };
  17. int main()
  18. {
  19. int a = sizeof(&MyClass::Show3);
  20. std::cout << sizeof(void *) << "," << a << std::endl; //vs 下输出4,8。g++ 下输出4,8
  21. return 0;
  22. }
//vs 下输出4,8。g++ 下输出4,8

所以那些把类成员函数地址保存为void*兄弟都悲剧了。


有几篇文章写的挺不错的推荐一下:

作者翻译了一篇英文:https://kelvinh.github.io/blog/2014/03/27/cpp-tutorial-pointer-to-member-function/

讨论了编译器对函数地址的实现:https://blog.csdn.net/ym19860303/article/details/8586971


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/244108
推荐阅读
相关标签
  

闽ICP备14008679号