成員變數指針 解引用: 成員變數指針存的不是絕對的地址,而是成員變數相對與對象開頭地址的長度,解引用時根據對象的起始地址和成員變數指針中存放的相對地址,計算其目標成員的絕對地址,這樣就可以訪問成員變數了 例子 成員函數指針 通過成員函數指針調用函數 Note: 成員函數指針存儲的就是特定函數的在代碼 ...
成員變數指針
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;
}