成员变量指针,成员函数指针
成员变量指针
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;
} 相关推荐
csdnyasin 2020-06-28
penkgao 2020-06-13
qscool 2020-06-12
fengjing81 2020-06-06
AaronPlay 2020-06-02
lynjay 2020-06-02
twater000 2020-05-29
徐建岗网络管理 2020-05-13
qingsongzdq 2020-05-07
jeonkc 2020-05-06
lynjay 2020-05-03
徐建岗网络管理 2020-05-03
shangs00 2020-04-27
xuguiyi00 2020-04-22
qscool 2020-04-18
GoatSucker 2020-04-11