#include <iostream>
using namespace std;
class A
{
public :
A (int i)
{
a = i;
}
int fun(int b)
{
return a*c+b;
}
int c;
private :
int a;
};
int main()
{
A x(18);
int A::*pc;
pc = &A::c;
x.*pc = 5;
int (A::*pfun)(int);
pfun = A::fun;
A *p = &x;
cout << (p->*pfun)(10)<<endl;
return 0;
using namespace std;
class A
{
public :
A (int i)
{
a = i;
}
int fun(int b)
{
return a*c+b;
}
int c;
private :
int a;
};
int main()
{
A x(18);
int A::*pc;
pc = &A::c;
x.*pc = 5;
int (A::*pfun)(int);
pfun = A::fun;
A *p = &x;
cout << (p->*pfun)(10)<<endl;
return 0;
}
会出现错误:error: invalid use of non-static member function 'int A::fun(int)'|
int (A::*pfun)(int)=A::fun;
改成
int (A::*pfun)(int)=&A::fun;
在C++语言中,对于一个由类名加俩冒号再加成员名构成的东西(学名叫“quilified-id”),比如:A::x,只有当x是A类的静态成员的时候,A::x才能表示一个左值。
而对于函数类型到函数指针类型的默认转换,只有当函数类型是左值的时候才行。所有对于非静态的成员函数,就不存在这种从函数类型到函数指针类型的默认转换,于是编译器也就不知道这个
p = A::f
该怎么搞了。
(1)要说函数地址确定不确定,由于非静态成员函数指针可以有多态行为,因此,至少在编译期,其地址还真的无法确定。
(2)虽然所有的编译器都肯定会把类的非静态成员函数的代码只生成一份(不管是编译时还是运行时),这一点跟非静态成员变量不一样,变量每个对象都有独立的一份。——但我认为,这依然是编译器的实现细节而已,而不是语言特性。从抽象的语言特性角度讲,非静态的成员函数跟非静态的成员变量一样,在没有对象实例的时候,是形不成左值的。