13.1.9 指向类成员的指针
在C++语言中,可以定义一个指针,使其指向类成员或成员函数,然后通过指针来访问类的成员。这包括指向属性成员的指针和指向成员函数的指针。
1.指向数据成员的指针
在C++语言中,可以定义一个指针,使其指向类成员。当属性成员为静态和非静态时,指针的使用也有不同。其中,指向非静态数据成员的指针定义格式如下:
1. <数据类型><类名>::*<指针名>[=&<类名>::<非静态数据成员>]
指向非静态数据成员的指针在定义时必须和类相关联,在使用时必须和具体的对象关联。
1. <类对象名>.*<指向非静态数据成员的指针>
指向静态数据成员的指针的定义和使用与普通指针相同,在定义时无须和类相关联,在使用时也无须和具体的对象相关联。
【示例13-14】 假设已经定义了一个类student,该类有非静态成员math,静态成员chin-ese,代码演示了指向它们的指针定义方式。
1. student s1;
2. int student::*pm=&student::math; //指向非静态属性
3. s1.*pm=100; //设置非静态属性
4. int *pc=&student::chinese; //指向静态属性
5. *pc=10; //设置静态属性
分析:该示例定义了指针pc和pm,分别指向类的静态数据成员chinese和非静态数据成员math。访问pm时,必须使用类实例来修饰。而访问pc时,与普通指针没有区别。
2.指向成员函数的指针
定义一个指向非静态成员函数的指针必须在三个方面与其指向的成员函数保持一致:参数列表要相同、返回类型要相同、所属的类型要相同。定义格式如下:
1. <数据类型>(<类名>::*<指针名>)(<参数列表>)[=&<类名>::<非静态成员函数>]
使用指向非静态成员函数的指针的方法和使用指向非静态数据成员的指针的方法相同,格式如下:
1. (<类对象名>.*<指向非静态成员函数的指针>)(<参数列表>);
指向静态成员函数的指针和普通指针相同,在定义时无须和类相关联,在使用时也无须和具体的对象相关联。
1. <数据类型>(*<指针名>)(<参数列表>)[=&<类名>::<静态成员函数>]
【示例13-15】 假设类student有非静态成员函数f1,非静态成员函数f2,代码演示指向它们的函数指针的定义方式。
1. student s1;
2. float (student::*pf1)()=&student::f1; //指向非静态成员函数的指针
3. (s1.*pf1)(); //调用指向非静态成员函数的指针
4. void (*pf2)()=&student::f2; //指向静态成员函数的指针
5. pf2(); //调用静态成员函数
分析:指向非静态成员函数时,必须用类名作限定符,使用时则必须用类的实例作限定符。指向静态成员函数时,则不需要使用类名作限定符。