成员变量指针
静态成员变量、静态成员函数与对象无关,静态成员指针与普通指针一致
本质就是特定成员变量在对象实例中的相对地址,解引用时再根据调用对象的地址计算该成员变量的绝对地址
定义
类型 类名 ::* 成员变量指针 = &类名 ::成员变量
使用
对象.*成员变量指针对象指针->*成员变量指针 =====> .*成员变量解引用->* 间接成员变量解引用
成员函数指针
虽然成员函数并不存储在对象中,但也要通过对象或者对象指针对成员函数指针解引用,其目的只有一个,即提供this指针
定义
返回类型(类型::*成员函数指针)(形参表) = &类名::成员函数名;
使用
(对象.*成员函数指针)(实参表)
(对象指针->*成员函数指针)(实参表)
#include "stdafx.h" #include<iostream> #include<string> using namespace std; class Student { public: Student(const string & name = "",int age = 0):m_name(name),m_age(age){} string m_name; int m_age; static int m_data; static int add(int x , int y) { return x+y; } void who() { cout << m_name << " " << m_age << endl; } }; int Student::m_data = 100; int _tmain(int argc, _TCHAR* argv[]) {//成员变量指针 string Student::*pname = &Student::m_name;//pname的初始化不需要对象,他将指向任何对象的m_name //存成员变量的偏移量,在解引用时,使用起始位置+偏移量 int Student ::*page = &Student::m_age; Student s1("张飞",24),s2("赵云",25); //成员函数指针 void (Student::*pwho)(void) = &Student::who; //成员指针时,取地址必须写 cout << s1.*pname << endl;//(.*,成员指针解引用运算符->*间接成员指针解引用运算符) cout << s2.*pname <<endl; cout << s1.*page << endl; cout << s2.*page << endl; (s1.*pwho)(); (s2.*pwho)(); int *pdata = &Student::m_data; cout << *pdata << endl; int(*padd)(int ,int ) = Student ::add; cout << padd(100,200) << endl; system("pause"); return 0; }