8、对象指针 声明: 类名 *对象指针名
Point A(5,10);
Point *ptr;
ptr=&A;//通过指针访问对象成员:对象指针名->成员名。ptr->getX();相当于(*ptr).getX;
曾经错误的前向引用的例子
class Fred; //前向引用声明
class Barney { Fred x; //错误:类Fred的声明尚不完善,若改成Fred *x;就正确了。 };//因为没有声明fred类的对象,编译器不知道如何分配内存,所以出错,如果//改成指针类型的对象,相当于unsigned long类型,编译器可以明确处理。
class Fred { Barney y; };
This指针 隐含于每一个类的成员函数中的特殊指针,存放当前对象的地址,通过对象名调用成员函数,系统先将该对象的地址赋给this指针,然后调用成员函数,成员函数对对象的数据进行操作时,就隐含使用了this指针。如:point类的构造函数中语句 X=xx;相当于this->X=xx;
8.1 指向类的非静态成员的指针 通过指向成员的指针只能访问公有成员,声明:指向公有数据成员的指针 类型说明符 类名::*指针名; 指向公有函数成员的指针 类型说明符 (类名::*指针名)(参数表);仅仅这样声明之后并不能直接使用,必须指明指针指向那个成员,需要赋给指针地址(初始化)。指针名=&类名::数据成员名;该处只是赋给指针一个相对地址,因为一个数据成员名并没有一个确切的地址,因此还需要落实到对象名(起始地址),结合相对地址(偏移量)才能真正访问到数据成员:
对象名.*类成员指针名; 对象指针名->*类成员指针名;
例6-13 访问对象的公有成员函数的不同方式
int main() //主函数
{ Point A(4,5); //声明对象A
Point *p1=&A; //声明对象指针并初始化
//声明成员函数指针并初始化
int (Point:::*p_GetX)()=Point::GetX;
//(1)使用成员函数指针访问成员函数
cout<<(A.*p_GetX)()<<endl;
//(2)使用对象指针访问成员函数
cout<<(p1->GetX)()<<endl;
//(3)使用对象名访问成员函数
cout<<A.GetX()<<endl; }