指向成员的指针运算符 .* 与 ->* 的区别
目录
[1] 成员指针访问运算符 .*
先来一个类STUDENT,注意其中将要表演的fun()函数要是共有的,不然后面不能够进行访问(私有成员函数的话!!!)。
class STUDENT
{
public:
STUDENT();
~STUDENT();
int fun();
private:
char m_name[20];
int m_age;
};
int STUDENT::fun()
{
cout << "这是STUDENT类的公有成员函数" << endl;
return 0;
}
STUDENT::STUDENT()
{
}
STUDENT::~STUDENT()
{
}
然后接下来我们该怎么使用这个符号呢?(知道一说起来指针,就会有很多的人是柑橘到头疼的,这里可以参考我前一篇关于指针详解的一篇二维数组、指针详解,如果这一篇理解,那么对于这么加深理解就会变得很容易。关键在于弄清楚指针和数组对应的相应是几级指针对应几维数组)
使用规则:(类的具体对象.*类的函数指针)( )
首先分别定义STUDENT的对象student和指向类的公有成员函数指针p;然后调用,得到结果
STUDENT student;
int (STUDENT::*p)() = &STUDENT::fun;
(student.*p)();
[2] 成员指针访问运算符 ->*
我们还是沿用上面一个例子的类和对象,然后我们需要在使用的时候做一个改变,
使用规则:(类的具体对象的指针.*类的函数指针)( )
首先分别定义STUDENT的对象的student的指针pt和指向类的公有成员函数指针p;然后调用,得到结果
STUDENT student;
STUDENT *pt = &student;
int (STUDENT::*p)() = &STUDENT::fun;
(pt->*p)();
运行结果:
自己写了调用的成员函数的三种方法,其中显而易见的区分了 .* 与 ->* 的区别,心急的可以直接逃过看最后的结论部分,不过还是建议自己是动手写一下。
其中补充说明一点:
使用类的成员函数指针进行赋值时候,一定要叫上&,否则报错误,这里并不是说它错了,而是说它这样子可能不规范。有的编译器不会通过,比如VS2015
。
所以说书上的也需要自己动手确定实践,另外就是书写规范,会帮助我们避免很多错误。另外突然发现这两个符号在msdn上面居然有说明,啊啊啊啊啊啊。传送门https://msdn.microsoft.com/zh-cn/library/k8336763.aspx。这两个符号大二初学习时候一直不明白,但是现在大四回过头来看,竟然是如此的简单,可能一次不理解的,多看几次就会理解。
总结:
指向成员的指针运算符(.* 和 –>*)返回表达式左侧上指定的对象的特定类成员的值。右侧必须指定该类的成员。
二元运算符 .* 将其第一操作数(必须是类类型的对象)与其第二操作数(必须是指向成员的指针类型)组合在一起。
二元运算符 –>* 将其第一操作数(必须是指向类类型的对象的指针)与其第二操作数(必须是指向成员的指针类型)组合在一起。
在包含 .* 运算符的表达式中,第一操作数必须是类类型且可访问,而指向第二操作数中指定的成员的指针或可访问类型的成员的指针明确从该类派生并且可供该类访问。
在包含 –>* 运算符的表达方式中,第一操作数必须是第二操作数中指定的类型的“指向类类型的指针”或明确地从该类派生的类型。