天天看點

C++學習之成員指針

  1. 成員變量指針

    1)定義

    類型 類名::*成員指針變量名 = &類名::成員變量;

    2)使用

    對象.成員指針變量名;

    注:"."被稱為直接成員指針解引用操作符

    對象指針->*成員指針變量名;

    注:"->*"被稱為間接成員指針解引用操作符

    #include <iostream>
    #include <cstdio>
    using namespace std;
    class Student{
    public:
        Student(const string& name):m_name(name){}
        int m_age;
        string m_name;
    };
    int main(void){
        //成員變量指針
        string Student::*pname = &Student::m_name;
        Student s("張飛");
        Student* ps = new Student("趙雲");
        cout << s.*pname << endl;//.* ->*不可用空格分隔
        cout << ps->*pname << endl;
       
        //實際上就是某個字段在該類的對象中的偏移量,即相對位置
    	//成員變量位址=對象位址+成員變量指針相對位址
        printf("pname=%p\n",pname);
        printf("&s=%p\n",&s);
        printf("&s.m_name=%p\n",&s.m_name);
    
        return 0;
    }
               
  2. 成員函數指針

    1)定義

    傳回類型 (類名::*成員函數指針)(參數表)=&類名::成員函數;

    2)使用

    (對象.*成員函數指針)(實參表);

    (對象指針->*成員函數指針)(實參表);

    #include <iostream>
    using namespace std;
    class A{
    public:
        void func1(void){
            cout << "A::func1" << endl;
        }
        void func2(void){
            cout << "A::func2" << endl;
        }
    };
    int main(void){
        void (A::*pfunc)(void) = &A::func1;
        A a;
        A* pa = new A;
        (a.*pfunc)();
        (pa->*pfunc)();
    
        pfunc = &A::func2;
        (a.*pfunc)();
        (pa->*pfunc)();
    
        return 0;
    }
               

繼續閱讀