编程爱好者联盟 2016-09-30
class 类名{ public: 数据类型 成员变量; }; 数据类型 类名::*成员指针=&类名::成员变量; 类名 对象(构造实参表),*对象指针=&对象;
解引用:
对象.*成员指针 //直接解引用 对象指针->*成员指针 //间接解引用
成员变量指针存的不是绝对的地址,而是成员变量相对与对象开头地址的长度,解引用时根据对象的起始地址和成员变量指针中存放的相对地址,计算其目标成员的绝对地址,这样就可以访问成员变量了
#include<cstring> #include<iostream> using namespace std; class Student{ public: Student(int age,string const& name):m_age(age),m_name(name){} void who(void)const{ cout<<m_age<<","<<m_name<<endl; } int m_age; string m_name; }; int main(void){ //指向Sudent类的m_name成员变量的指针 string Student::*pname=&Student::m_name; // cout<<pname<<endl;//cout只是打印它能识别的类型,对于不识别的,只打印空or非空 // void* pv=pname; //编译错误 void* pv; memcpy(&pv,&pname,sizeof(pv)); //绕过类型检查 cout<<pv<<endl; //0x4 Student sa(20,"ZHANG Fei"),*sc=new Student(22,"ZHAO Yun"); cout<<sa.*pname<<endl; cout<<sc->*pname<<endl; void (Student::*pwho)(void)const=&Student::who; memcpy(&pv,&pwho,sizeof(pv)); cout<<pv<<endl; (sa.*pwho)(); (sc->*pwho)(); delete sc; // return 0; }
class 类名{ public: 返回类型 成员函数名(形参表){...} }; 返回类型 (类名::*成员函数指针)(形参表)=&类名::成员函数名;
通过成员函数指针调用函数
(对象.*成员函数指针)(实参表) (对象指针->*成员函数指针)(实参表)
Note: 成员函数指针存储的就是特定函数的在代码区中的绝对地址,但是调用时依然需要对象或者对象指针,其目的不是为了计算函数地址,而是为了向this指针传递实参。
#include<iostream> using namespace std; class Date{ int year; int month; int day; public: Date(int year,int month,int day):year(year),month(month),day(day){ } int getYear(){ return year; } int getMonth(){ return month; } }; int main(){ Date date(2020,12,2); //通过成员函数指针来获取year和month的值 int (Date::*pfcn)(); pfcn=&Date::getYear; cout<<(date.*pfcn)()<<endl; pfcn=&Date::getMonth; cout<<(date.*pfcn)()<<endl; return 0; }