对象的成员是要占用存储空间的,因此对象也是有指针的,因为C++非常强调类型安全和编译时检查,因此C++的指针一共被分为4类,而且之间不能随便转换:
- 数据指针
- 函数指针
- 数据成员指针
- 成员函数指针
数据指针和函数指针是普通指针,C语言里也有,而后面的两种,数据成员指针和成员函数指针被称为成员指针,是C所没有而C++才有的。
成员指针是指向类的某一个成员的指针,它的类型与类的类型和成员的类型有关,它只应用于类的非静态成员。(类的静态成员是为类所有,不属于任何对象,所以静态成员指针用的是普通指针。)
下面是成员指针的定义方式:
1.定义数据成员指针的一般定义形式:数据成员类型 类名::*指针变量名=成员地址初值;
举个例子:String Data::*ptr_x=&Data::x;(其中x是类Data的数据成员,而这个数据成员是String类型的。)
2.定义成员函数指针的一般形式为:
- 返回类型 (类名::*指针变量名) (形式参数列表) = 成员地址初值;
- 返回类型 (类名::*指针变量名) (形式参数列表) const = 成员地址初值;
注意:定义成员函数指针时,必须确保在3个方面与它所指向的函数的类型相匹配
①函数形参的类型和数目,包括成员是否为const(是否是常成员函数);
②返回类型;③所属类的类型。
举栗子:“char get() const”成员函数的指针可以这样定义和初始化:
- char ( Data::*ptr_func ) ( ) const = &Data::get;//注意取地址符号&后面的get没有括号
- 或者也可以这样,先为成员函数指针使用类型别名,例如:
typedef char ( Data::*GETFUNC ) ( Data::index, Data::index ) const; //Data::是类限定,index对应的函数参数的类型
GETFUNC ptr_func = &Data::get;
说了数据成员指针和成员函数指针的定义方式,那么怎么使用呢?其实和普通指针的使用方式没啥区别,下面来看一段代码:
或许有同学会问,啰里啰嗦讲了这么多成员指针的知识,那么什么情况会用到成员指针呢?目前为止我还没找到特别合理的该用成员指针的地方,下面贴一张和大佬的聊天图....
下面是一个很好消化的栗子: