为什么不能用它的名字打印成员函数的地址?

时间:2015-12-23 10:08:40

标签: c++ class

我了解到函数名称等于函数地址 像这样:

void func(){}
void main() { cout << func; }

但是当我使用相同的代码打印memeber函数时,它出错了。

class Test{
public:
    void func() {}
    void printFunc1() {
    cout << func << endl;
   }
    void printFunc2() {
    void (Test::*ptrtofn)() = &Test::func;
    cout << (void*&)ptrtofn << endl;
  }
};

printFunction2()工作但printFunction1()没有

有什么区别?

会员功能的名称不是会员功能的地址? 有什么理由吗?

2 个答案:

答案 0 :(得分:4)

成员函数!=独立函数

只能将独立函数隐式转换为指针。

  

4.3函数到指针的转换[conv.func]
   1 函数类型T的左值可以转换为“指向T的指针”的prvalue。结果是指向函数的指针。 58

     

58)此转换从不适用于非静态成员函数    因为引用非静态成员函数的左值不能   获得。

答案 1 :(得分:0)

请理解“func”是该类的成员函数。直接访问它本身就是一个编译错误。你应该尝试使用指向成员函数的指针,就像你在printFunction2中所做的那样: 否则,如果func是在类范围之外的函数。那么它可以如下完成:

#include <iostream>
using namespace std;
 void func() {cout<<"\n calling func\n";}
    void printFunc1() {
       cout << endl<<hex<<(void*)func << endl;
    }
int main() {

    printFunc1();
    return 0;
}