C++指向類成員(資料、函式)的指標
阿新 • • 發佈:2019-02-17
指向【類】的成員的指標包含兩種:
- ★指向【類】的資料成員的指標
- ★指向【類】的成員函式的指標
注意:指向的是【類的成員】,和類發生關係
★★★指向非靜態公有資料成員的指標,在定義時必須和類相關聯,在使用時必須和物件相關聯
1、指向類的資料成員的指標
1.1 定義+初始化的格式:
資料型別 型別:: *指標名 = &型別:: 非靜態公有資料成員
1.2通過資料成員指標訪問資料成員的格式:
- 物件.*資料成員指標
- 物件指標—>*資料成員指標
class Stu
{
public:
string name;
int age;
}
int Stu :: *pAge =&Stu::age;//★定義一個指向類的Stu資料成員age的指標
string Stu :: *pName=&Stu::name;//★定義有個指向Stu資料成員name的指標
例1、程式碼及執行結果
#include<iostream>
#include <string>
using namespace std;
class Stu
{
public:
string name;
int age;
public:
Stu(string str="NULL",int ag=0):name(str),age(ag)//構造器初始化
{
}
void Show()
{
cout<<name<<" "<<age<<endl ;
}
};
int main()
{
Stu s1;//使用預設引數建立物件
Stu s2("LaoWang" ,66);//傳參建立物件
string Stu::*pName =&Stu::name;//★定義時和類關聯
int Stu::*pNum=&Stu::age; //★定義時和類關聯
cout<<s1.name<<" "<<s1.age<<endl;
cout<<s2.name<<" "<<s2.age<<endl;
cout<<s1.*pName<<" "<<s1.*pNum<<endl;//★使用時和物件關聯
cout<<s2.*pName<<" "<<s2.*pNum<<endl;//★使用時和物件關聯
return 0;
}
//指向類的非靜態成員的指標,在定義時必須和類關聯,在使用時必須和對相關聯的
2、指向類的成員函式的指標
//定義+初始化的格式:
資料型別 (型別::*p)(引數列表)=& 類名::非靜態函式成員
void (Stu :: *P)() =&Stu::Show; //定義了一個指向Stu類的成員函式的
Show()的指標
通過成員函式指標訪問成員函式的格式:
- (物件.*成員函式指標)()
- (物件指標->*成員函式指標)()
class Stu
{
public:
string name;
int age;
void Show()
{
cout<<name<<" "<<age<<endl;
}
}
例2、程式碼及執行結果
#include<iostream>
#include <string>
using namespace std;
class Stu
{
public:
string name;
int age;
public:
Stu(string str="wang",int num=18):name(str),age(num)
{
}
void Show()
{
cout<<name<<" "<<age<<endl ;
}
};
int main()
{
Stu s1("Google",1);
Stu * p = new Stu("ali",14);//在堆內建立一個物件
void (Stu::*pf)() =&Stu::Show;//定義時和類關聯
(s1.*pf)();//(物件.*成員函式指標)()
(p->*pf)();//(物件指標->*成員函式指標)()
return 0;
}
執行結果如下圖:
3、練習:函式指標陣列
#include<iostream>
using namespace std;
class Widget
{
private:
void a() {cout<<"void a()"<<endl;}
void b() {cout<<"void b()"<<endl;}
void c() {cout<<"void c()"<<endl;}
void d() {cout<<"vodi d()"<<endl;}
void (Widget::*pa[4])(); //定義了一個函式指標指標陣列
public:
void select(int idx)
{
/* *(pa[idx])();*/
(this->*pa[idx])(); //陣列記錄的只是偏移量
}
Widget() //構造器
{ //初始化
pa[0]=&Widget::a;
pa[1]=&Widget::b;
pa[2]=&Widget::c;
pa[3]=&Widget::d;
}
};
int main()
{
Widget A;
A.select(0);
A.select(1);
A.select(2);
A.select(3);
return 0;
}
執行結果如下;