成员变量指针,成员函数指针

编程爱好者联盟 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;
}

相关推荐