在c++ 中,可以說明指向類的資料成員和成員函式的指標
1、指向資料成員的指標格式如下:
《型別說明符》《類名》::*《指標名》
2、指向成員函式的指標格式如下:
《型別說明符》(《類名》::*《指標名》)(《參數列》)
如下例:
class a
public:
int fun(int b)
a(int i)
int c;
private:
int 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;
讓我們再看看指向一般函式的指標的定義格式:
關於給指向的函式的指標賦值的格斯如下:
《指向函式的指標名》=《函式名》
在程式中,使用指向函式的指標的呼叫函式的格式如下:
(*《指向函式的指標名》)(《實參表》)
如果是指向類的成員函式的指標還應加上相應的物件名和物件成員運算子
下面給出乙個使用指向類成員指標的例子:
#include
class a
public:
a(int i)
int fun(int b)
int c;
private:
int a;
void main()
a x(8); //定義類a的乙個物件,並給其建構函式賦初值
int a::*pc; //定義乙個指向類資料成員的指標pc
pc = &a::c; //給指標pc賦值
x.*pc = 3; //用指標方式給類成員c賦值為3
int(a::*pfun)(int); //定義乙個指向類成員函式的指標pfun
pfun = a::fun; //給指標pfun賦值
a *p = &x; //定義乙個物件指標p,並賦初值為x
cout << (p->*pfun)(5) << endl; //用物件指標呼叫指向類成員函式指標pfun指向的函式
以上程式定義好幾個指標,雖然它們都是指標,但是所指向的物件時不同的。
p是指向類的物件;
pc是指向類的資料成員;
pfun是指向類的成員函式;
因此它們的值是不相同的。
物件指標和物件引用做函式的引數
1、物件指標做函式的引數
使用物件指標做函式引數 要經使用物件作函式引數更普遍一些。因此使用物件指標作函式引數,因為使用物件指標作函式引數有如下兩點好處:
(1)實現傳址呼叫。可以被呼叫函式中改變呼叫函式的引數物件的值,實現函式之間的資訊傳遞
(2)使用物件指標實參僅將物件的位址值傳給形參,而不進行副本的拷貝,這樣可以提高執行效率,減少時空開銷。
當形參是指向物件指標時,呼叫函式的對應實參應該是某個物件的位址值,一般使用&後加物件名,
下面舉一例子說明物件指標做函式引數:
#include
class m
public:
m()m(int i, int j)
void copy(m *m);
void setxy(int i, int j)
void print()
private:
int x,y;
void m::copy(m *m)
x = m->x;
y = m->y;
void fun(m m1, m *m2);
void main()
m p(5, 7), q;
q.copy(&p);
fun(p, &q);
p.print();
q.print();
void fun(m m1, m *m2)
m1.setxy(12, 15);
m2->setxy(22, 25);
輸出結構為:
5,722,25
從輸出結果可以看出,當在被呼叫函式fun中,改變而來物件的資料成員值[m1.setxy(12, 15)]和指向物件指標的
資料成員值[m2->***y(22. 25)]以後,可以看到只有指向物件指標做引數所指向的物件被改變了,而另乙個物件作引數,
形參物件值改變了,可實參物件之並沒有改變。因此輸出上述結果。
2、物件引用做函式引數
在實際中,使用物件引用做函式引數要比使用對物件音質用象指標函式更普遍,這是因為使用物件引用做
函式引數具有物件指標作函式引數的優點,而用物件引用作函式引數將更簡單,更直接。所以,在c++程式設計
中,人們喜歡用物件引用作函式引數,現舉一例子說明物件引用作函式引數的格式。
#include
class m
public:
m()m(int i, int j)
void copy(m &m);
void setxy(int i, int j)
void print()
private:
int x,y;
void m::copy(m &m)
x = m.x;
y = m.y;
void fun(m m1, m &m2);
void main()
m p(5, 7), q;
q.copy(p);
fun(p, q);
p.print();
q.print();
void fun(m m1, m &m2)
m1.setxy(12, 15);
m2.setxy(22, 25);
該例子與上面的例子輸出相同的結果,只是呼叫時的引數不一樣。
this指標
this指標時乙個隱含於每乙個成員函式中的特殊指標,他是乙個指向正在被該成員函式操作的
物件,也就是要操作該成員函式物件。
當對乙個物件呼叫成員函式時,編譯程式先將物件的位址賦給this指標,然後呼叫成員函式,每次成員函式訪問資料成員時,
由隱含作用this指標,而通常不去顯示地使用this指標來引用資料成員。同樣也可以使用*this來表示呼叫該成員函式的物件
如下例:
#include
class a
public:
a()a(int i, int j)
void copy(a &aa); //物件引用做函式引數
void print()
private:
int a, b;
void a::copy(a &aa)
if(this == &aa)return; //這個this是操作該成員函式的物件位址,在這裡是物件a1的位址
*this = aa; //*this是操作該成員函式的物件,在這裡是物件a1.
//此語句是物件aa賦給a1,也就是aa具有的資料成員的值賦給a1的資料成員
void main()
a a1,a2(3, 4);
a1.copy(a2);
a1.print();
執行結果:
3, 4
C 中的物件指標和物件引用
在c 中,可以說明指向類的資料成員和成員函式的指標。指向資料成員的指標格式如下 型別說明符 類名 指標名 指向成員函式的指標格式如下 型別說明符 類名 指標名 參數列 例如,設有如下乙個類a 定義乙個指向類a的資料成員c的指標pc,其格式如下 int a pc a c 再定義乙個指向類a的成員函式f...
物件和物件指標以及物件引用的使用
如下程式 include include using namespace std class m 向編譯系統宣告,m類在整個源程式內已經定義 class student void set string str void print class m m類的有參建構函式 m m類的無參建構函式 int ...
物件和物件引用
每天都在變化,每天都在進步 基礎情況 a a new a a a 建立了個a 型別的引用a,此時指向null new a 在堆中建立了乙個類a的物件,返回其引用位址 將物件的位址給予引用 情景1a a new a 01 a b a 02 a null 03 此時b仍然有資料,因為 02 的時候,發生...