1.对于成员函数,用到函数名的地方,函数名表示的意义与全局函数或静态函数有所区别,函数名只表示函数名称(或函数变量(对象))。如:对成员函数中调用test()是可以的,但调用(*test)()是非法的,显示Error:“*”的操作数必须是指针。这表示test不能再表示指针(在全局函数中不存在此问题),&test也是不行的。
2.对于在调用成员函数时,A::test()与test()在类内部是一样的,都A::表示test()与类A绑定了。在外部表示不一样A::表示要调用静态的成员函数。
3.对于int *C::func();和int C::(*func)();是不同的。int *C::func()等价于int *func();。int C::(*func)()和int (*func)()也是不一样的。对于int (*func)()这样的函数指针定义直接用一个函数地址定义,没有对象绑定,对于类成员函数,有类型的绑定,成员函数地址是和全局函数地址表示不同,和类型相关,直接赋值函数地址定义的话不行。那么这就出现一个定义叫类成员(函数或变量)指针。先看如下程序:
class C
{
public:
void (C::*func1)();//放到类外一样
void func2() { cout << "func2()" << endl; }
void (*func3)();
void test()
{
func1 = &func2;//error
func1 = &C::func2;
(this->*func1)();
i3 = &i1;//虽然对于成员函数无法直接取其地址,成员变量可以直接取其地址
}
public:
int i1;
int C::i2;
int *C::i3;
};
我们想给func3赋值时,但不想用全局函数和类内静态函数,而想用类成员函数赋值,那么
func3 = func2//这样不对,因为类成员函数单独使用名字(*func2, &func2, C c, c.func, &(c.func), *(c.func) 都是错误的,但全局函数,静态函数都可以),只能用于函数调用。
c++规定了一个类成员函数指针作为特殊的函数指针。即:
func1 = &C::func;//正确
对于类变量指针,虽然对于成员函数无法直接取其地址,成员变量可以直接取其地址。同样类变量指针可以和成员函数指针一样特殊的定义。
int C::*i1; i1 = &C::i2;
成员函数/变量指针通过.*或->*访问
调用
c.*func1();//正确
&(c.*func1)//错误,因为指向绑定函数的指针,只能用于函数调用。
c.*i1;//正确
&(c.*i1)//也是正确的
4.(参考)由于成员函数与类绑定(成员函数默认有个参数为类对象,所以取其指针时候,该函数有个默认的参数没有直接表明,为了表明要用A::修饰),那么取函数指针时,c++规定要显示注明A::(函数调用不必要)&A::test。如:
#include <iostream>
using namespace std;
class A
{
public:
void (A::*fun)();
void test(){ cout << "ok" << endl; }
public:
void doTest();
};
void A::doTest()
{
fun=&A::test;
(this->*fun)();
}
int main()
{
A a;
a.doTest();
&A::test//甚至在外边也可以访问到
}