1. 程式人生 > >C++中的物件指標和物件引用

C++中的物件指標和物件引用

在C++中,可以說明指向類的資料成員和成員函式的指標。
    指向資料成員的指標格式如下:
    <型別說明符><類名>::*<指標名>
    指向成員函式的指標格式如下:
    <型別說明符>(<類名>::*<指標名>)(<引數表>)
    例如,設有如下一個類A:


    定義一個指向類A的資料成員c的指標pc,其格式如下:
    int A:: *pc = &A::c;
    再定義一個指向類A的成員函式fun的指標pfun,其格式如下:
    int (A:: *pfun)(int) = A::fun;
    由於類不是執行時存在的物件。因此,在使用這類指標時,需要首先指定A類的一個物件,然後,通過物件來引用指標所指向的成員。例如,給pc指標所指向的資料成員c賦值8,可以表示如下:
    A a;
    a.*pc = 8;
    其中,運算子.*是用來對指向類成員的指標來操作該類的物件的。
    如果使用指向物件的指標來對指向類成員的指標進行操作時,使用運算子->*。例如:
    A *p = &a;    //a是類A的一個物件,p是指向物件a的指標。
    p ->* pc = 8;
    讓我們再看看指向一般函式的指標的定義格式:
    <型別說明符>*<指向函式指標名>(<引數表>)
    關於給指向函式的指標賦值的格式如下:
    <指向函式的指標名>=<函式名>
    關於在程式中,使用指向函式的指標呼叫函式的格式如下:
    (*<指向函式的指標名>)(<實參表>)
    如果是指向類的成員函式的指標還應加上相應的物件名和物件成員運算子。
    下面給出一個使用指向類成員指標的例子:
  

    以上程式定義了好幾個指標,雖然它們都是指標,但是所指向的物件是不同的。p是指向類的物件;pc是指向類的資料成員;pfun是指向類的成員函式。因此它們的值也是不相同的。
物件指標和物件引用作函式的引數
    1. 物件指標作函式的引數
    使用物件指標作為函式引數要經使用物件作函式引數更普遍一些。因為使用物件指標作函式引數有如下兩點好處:
    (1) 實現傳址呼叫。可在被呼叫函式中改變呼叫函式的引數物件的值,實現函式之間的資訊傳遞。
    (2) 使用物件指標實參僅將物件的地址值傳給形參,而不進行副本的拷貝,這樣可以提高執行效率,減少時空開銷。
    當形參是指向物件指標時,呼叫函式的對應實參應該是某個物件的地址值,一般使用&後加物件名。下面舉一例子說明物件指標作函式引數。
  

    輸出結果為:
    5,7
    22,25
    從輸出結果可以看出,當在被呼叫函式fun中,改變了物件的資料成員值[m1.setxy(12, 15)]和指向物件指標的資料成員值[m2->setxy(22, 25)]以後,可以看到只有指向物件指標作引數所指向的物件被改變了,而另一個物件作引數,形參物件值改變了,可實參物件值並沒有改變。因此輸出上述結果。
    2. 物件引用作函式引數
    在實際中,使用物件引用作函式引數要比使用物件指標作函式更普遍,這是因為使用物件引用作函式引數具有用物件指標作函式引數的優點,而用物件引用作函式引數將更簡單,更直接。所以,在C++程式設計中,人們喜歡用物件引用作函式引數。現舉一例子說明物件引用作函式引數的格式。
  
    該例子與上面的例子輸出相同的結果,只是呼叫時的引數不一樣。
this指標
    this指標是一個隱含於每一個成員函式中的特殊指標。它是一個指向正在被該成員函式操作的物件,也就是要操作該成員函式的物件。
    當對一個物件呼叫成員函式時,編譯程式先將物件的地址賦給this指標,然後呼叫成員函式,每次成員函式存取資料成員時,由隱含作用this指標。而通常不去顯式地使用this指標來引用資料成員。同樣也可以使用*this來標識呼叫該成員函式的物件。下面舉一例子說明this指標的應用。
    
    執行結果:
    3, 4