原创文章,转载请注明出处,谢谢!
作者:清林,博客名:飞空静渡
在C++中,有两个运算符我们很少用到,这两个运算符就是反引用运算符:->*和.*。
下面介绍一下这反引用运算符的使用。
在C++中,我们定义一个变量的指针可以这样:
int a=5;
int *pA = &a;
然后,我们就可以使用pA来获得a的值。
而在C++中,我们定义函数指针大概是这样的:
void (*pFun)(int);
如果是定义一个函数指针类型,就是这样:
typedef void (*pFun_t)(int);
如果我们有这样一个函数:
void fun(int i)
{
......
}
那么我们就可以这样
pFun_t pfun = fun;
然后就可以使用pfun来代替fun,下面是使用代码:
说完C++中的普通变量的指针和函数指针后,我们来看看反引用运算符的用法。
假设我们有一个类:
那么,我们又怎么定义类A中的这两个成员的指针呢,定义类的成员的指针是这样的:
void (A::*pFun)(int) = &A::fun;
int A::*pNum = &A::num;
我们看到成员变量指针的定义比普通变量指针和函数指针的定义多了域操作符A::。
那么我们定义完这些成员变量的指针后,就应该运用反引用运算符来使用这些成员变量指针了,我们先看这两个反引用运算符的用法:
->* :可以用类对象指针反引用成员指针。
.* :可以用类对象反引用成员指针。
其使用如下:
我们看到,上面是这样使用的:
(pA->*pFun)(12);
那为什么不是这样使用呢?
pA->*pFun(12);
这里的原因是函数的调用的优先级要比反引用运算符->*要高,所以如果这样使用就会编译出错,因此我们必须在这里使用括号来改变运算符的优先级。
那成员变量可以这样使用:
int a = pA->*pNum;
如果我们这样使用会怎么样:
int a = ++pA->*pNum;
这里++运算符要比->*运算符优先级高,因此会让pA自加后再调用num成员。
.*反引用运算符的使用和->*的用法一样,只不过是对应于类的对象,而不是类的对象指针。