指向類的成員的指針 在C++中,可以說(shuō)明
指向類的數(shù)據(jù)成員和成員函數(shù)的指針。
指向數(shù)據(jù)成員的指針格式如下:
<類型說(shuō)明符><類名>::*<指針名> 指向成員函數(shù)的指針格式如下:
<類型說(shuō)明符>(<類名>::*<指針名>)(<參數(shù)表>) 例如,設(shè)有如下一個(gè)類A:
class A
{
public:
int fun (int b) { return a*c+b; }
A(int i) { a=i; }
int c;
private:
int a;
};
定義一個(gè)指向類A的數(shù)據(jù)成員c的指針pc,其格式如下:
int A:: *pc = &A::c; 再定義一個(gè)指向類A的成員函數(shù)fun的指針pfun,其格式如下:
int (A:: *pfun)(int) = A::fun; 由于類不是運(yùn)行時(shí)存在的對(duì)象。因此,在使用這類指針時(shí),需要首先指定A類的一個(gè)對(duì)象,然后,通過(guò)對(duì)象來(lái)引用指針?biāo)赶虻某蓡T。例如,給pc指針?biāo)赶虻臄?shù)據(jù)成員c賦值8,可以表示如下:
A a; a.*pc = 8;
其中,
運(yùn)算符.*是用來(lái)對(duì)指向類成員的指針來(lái)操作該類的對(duì)象的。
如果使用指向?qū)ο蟮闹羔榿?lái)對(duì)指向類成員的指針進(jìn)行操作時(shí),使用運(yùn)算符
->*。例如:
A *p = &a; //a是類A的一個(gè)對(duì)象,p是指向?qū)ο骯的指針。 p ->* pc = 8;
讓我們?cè)倏纯粗赶?font color="#0000ff">一般函數(shù)的指針的定義格式:
<類型說(shuō)明符>*<指向函數(shù)指針名>(<參數(shù)表>) 關(guān)于給指向函數(shù)的指針賦值的格式如下:
<指向函數(shù)的指針名>=<函數(shù)名> 關(guān)于在
程序中,使用指向函數(shù)的指針調(diào)用函數(shù)的格式如下: (*<指向函數(shù)的指針名>)(<實(shí)參表>) 如果是指向類的成員函數(shù)的指針還應(yīng)加上相應(yīng)的對(duì)象名和對(duì)象成員運(yùn)算符。 下面給出一個(gè)使用指向類成員指針的例子:
#include <iostream.h>
class A
{
public:
A(int i) { a=i; }
int fun(int b) { return a*c+b; }
int c;
private:
int a;
};
void main()
{
A x(8); //定義類A的一個(gè)對(duì)象x
int A::*pc; //定義一個(gè)指向類數(shù)據(jù)成員的指針pc
pc=&A::c; //給指針pc賦值
x.*pc=3; //用指針方式給類成員c賦值為3
int (A::*pfun)(int); //定義一個(gè)指向類成員函數(shù)的指針pfun
pfun=A::fun; //給指針pfun賦值
A *p=&x; //定義一個(gè)對(duì)象指針p,并賦初值為x
cout<<(p->*pfun)(5)<<endl; //用對(duì)象指針調(diào)用指向類成員函數(shù)指針pfun指向的函數(shù)
}
以上
程序定義了好幾個(gè)指針,雖然它們都是指針,但是所指向的對(duì)象是不同的。p是指向類的對(duì)象;pc是指向類的數(shù)據(jù)成員;pfun是指向類的成員函數(shù)。因此它們的值也是不相同的。對(duì)象指針和對(duì)象引用作函數(shù)的參數(shù) 1. 對(duì)象指針作函數(shù)的參數(shù)
使用對(duì)象指針作為函數(shù)參數(shù)要經(jīng)使用對(duì)象作函數(shù)參數(shù)更普遍一些。因?yàn)槭褂脤?duì)象指針作函數(shù)參數(shù)有如下兩點(diǎn)好處:
(1) 實(shí)現(xiàn)傳址調(diào)用。可在被調(diào)用函數(shù)中改變調(diào)用函數(shù)的參數(shù)對(duì)象的值,實(shí)現(xiàn)函數(shù)之間的信息傳遞。
(2)
使用對(duì)象指針實(shí)參僅將對(duì)象的地址值傳給形參,而不進(jìn)行副本的拷貝,這樣可以提高運(yùn)行效率,減少時(shí)空開銷。
當(dāng)形參是指向?qū)ο笾羔槙r(shí),調(diào)用函數(shù)的對(duì)應(yīng)實(shí)參應(yīng)該是某個(gè)對(duì)象的地址值,一般使用&后加對(duì)象名。下面舉一例子說(shuō)明對(duì)象指針作函數(shù)參數(shù)。
#include <iostream.h>
class M
{
public:
M() { x=y=0; }
M(int i, int j) { x=i; y=j; }
void copy(M *m);
void setxy(int i, int j) { x=i; y=j; }
void print() { cout<<x<<","<<y<<endl; }
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);
}
輸出結(jié)果為:
5,7
22,25
從輸出結(jié)果可以看出,當(dāng)在被調(diào)用函數(shù)fun中,改變了對(duì)象的數(shù)據(jù)成員值[m1.setxy(12, 15)]和指向?qū)ο笾羔樀臄?shù)據(jù)成員值[m2->setxy(22, 25)]以后,可以看到只有指向?qū)ο笾羔樧鲄?shù)所指向的對(duì)象被改變了,而另一個(gè)對(duì)象作參數(shù),形參對(duì)象值改變了,可實(shí)參對(duì)象值并沒有改變。因此輸出上述結(jié)果。
2. 對(duì)象引用作函數(shù)參數(shù)
在實(shí)際中,使用對(duì)象引用作函數(shù)參數(shù)要比使用對(duì)象指針作函數(shù)更普遍,這是因?yàn)槭褂脤?duì)象引用作函數(shù)參數(shù)具有用對(duì)象指針作函數(shù)參數(shù)的優(yōu)點(diǎn),而用對(duì)象引用作函數(shù)參數(shù)將更簡(jiǎn)單,更直接。所以,在C++編程中,人們喜歡用對(duì)象引用作函數(shù)參數(shù)。現(xiàn)舉一例子說(shuō)明對(duì)象引用作函數(shù)參數(shù)的格式。
#include <iostream.h>
class M
{
public:
M() { x=y=0; }
M(int i, int j) { x=i; y=j; }
void copy(M &m);
void setxy(int i, int j) { x=i; y=j; }
void print() {cout<<x<<","<<y<<endl; }
private:
int x, y;
};
void M::copy(M &m)
{
x=m.x;
x=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);
}
該例子與上面的例子輸出相同的結(jié)果,只是調(diào)用時(shí)的參數(shù)不一樣。
this指針
this指針是一個(gè)隱含于每一個(gè)成員函數(shù)中的特殊指針。
它是一個(gè)指向正在被該成員函數(shù)操作的對(duì)象,也就是要操作該成員函數(shù)的對(duì)象。
當(dāng)對(duì)一個(gè)對(duì)象調(diào)用成員函數(shù)時(shí),編譯
程序先將對(duì)象的地址賦給this指針,然后調(diào)用成員函數(shù),每次成員函數(shù)存取數(shù)據(jù)成員時(shí),由隱含作用this指針。而通常不去顯式地使用this指針來(lái)引用數(shù)據(jù)成員。同樣也可以使用*this來(lái)標(biāo)識(shí)調(diào)用該成員函數(shù)的對(duì)象。下面舉一例子說(shuō)明this指針的應(yīng)用。 #include <iostream.h>
class A
{
public:
A() { a=b=0; }
A(int i, int j) { a=i; b=j; }
void copy(A &aa); //對(duì)象引用作函數(shù)參數(shù)
void print() {cout<<a<<","<<b<<endl; }
private:
int a, b;
};
void A::copy(A &aa) {
if (this == &aa) return; //這個(gè)this是操作該成員函數(shù)的對(duì)象的地址,在這里是對(duì)象a1的地址
*this = aa; //*this是操作該成員函數(shù)的對(duì)象,在這里是對(duì)象a1。
//此語(yǔ)句是對(duì)象aa賦給a1,也就是aa具有的數(shù)據(jù)成員的值賦給a1的數(shù)據(jù)成員
}
void main()
{
A a1, a2(3, 4);
a1.copy(a2);
a1.print();
}
運(yùn)行結(jié)果:
3, 4