1. 程式人生 > >C++指向類成員(資料、函式)的指標

C++指向類成員(資料、函式)的指標

指向【類】的成員的指標包含兩種:

  • ★指向【類】的資料成員的指標
  • ★指向【類】的成員函式的指標
    注意:指向的是【類的成員】,和類發生關係
    ★★★指向非靜態公有資料成員的指標,在定義時必須和類相關聯,在使用時必須和物件相關聯

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;
}

執行結果如下;
這裡寫圖片描述