您的位置:首页 > 其它

对象数组和指向对象的指针 指向类成员的指针

2012-12-31 23:44 253 查看
1 对象数组

对象数组是指数组元素为对象的数组。这种对象数组与其它数据类型的数组定义方式相同。如:
X a[10];
它创建了一个对象数组a,有10个数组元素,每个数组元素a [i]都是一个对象,所以,需要10次调用构造函数。
C++语言不允许初始化对象数组,所以要创建一个类的对象数组,这个类必须具备以下三个条件之一:
(1) 没有构造函数;
(2) 有构造函数,但要有一个构造函数不带参数;
(3) 有构造函数,但要有一个构造函数具有的参数全是缺省参数。

2
指向对象的指针

一个基类型为类类型的指针称为对象指针,每一个对象创建之后都会在内存中占有一定的存储空间,对象指针用来存放对象存储空间的首地址。
说明指向对象的指针的语法与说明指向其他任何数据类型的指针的语法相同。
X *a; //注意不是指向类的指针
a是一个指向X类对象的指针;这样,可以用指向对象的指针来访问对象的成员,格式如下:
对象指针->数据成员
或者
对象指针->成员函数

X obj;
X *p; //声明指向对象的指针,没有调用构造函数

p=&obj; //将指针p指向

3 指向类成员的指针

这里需要说的是所有的指针需要地址,但在类内部是没有地址的,选择一个类的成员就是指定这个成员在类中的偏移。只有把这个偏移和具体对象的开始地址相结合,才能得到实际地址。
C++既包含指向类数据成员的指针,又包含指向成员函数的指针。

(1) 指向类数据成员的指针

声明指向类X中类型为type的数据成员的指针的语法格式为:
type X::*pointer;
若类X的数据成员a的类型为type。则语句:
pointer=&X:: a;
是将该成员的地址存入pointer中。注意,取一个类成员的地址使用表达式&X:: a。这样得到的地址不是真实地址,而是成员a在类X中相对于对象起始地址的偏移。因此,若要访问某个对象中pointer所指向的成员,应使用两个指向成员的指针(针对类对象和引用的是.*,以及针对指向类对象的指针的是->*)例如:



class A
{
private:
int a;
public:
int b;
A (int i)
{
a=i;
}
int func( )
{
return (a+b);
}
};

对类A可以有如下定义:
int A::* pb; //一个指向类A的数据成员的指针变量pb
pb=&A:: b; //使指针变量pb指向类A的数据成员b
因为b是类A的公有成员,在程序中才能这样定义。
由于类是通过对象来实例化的。因此,在使用这类指针时,需要首先指定类A的一个对象,然后通过对象或者指向对象的指针来访问类成员指针所指向的成员。例如:
A a;
A *p=&a; //定义类A对象指针p,并指向对象a
a.*pb=2; //为对象a的数据成员赋值2
也可以这样写:
p->*pb=2;

(2) 指向成员函数的指针

指向成员函数的指针与指向成员变量的指针工作原理相似,主要的区别是语法更复杂。
下面仍然使用上一小节的类A,说明建立一个fp的变量,它可以指向无参数,返回值为整型的A的成员函数:
int (A::* fp)( );
fp是一个指向类A成员函数的指针。下面说明如何使用它:
fp=A:: func //fp指向类A的成员函数funcA a;
A *p=&a; //定义类A对象指针p,并指向对象a
(a.*fp)( ); //调用类A的成员函数func
(p->*fp)( ); //调用类A的成员函数func
语句fp=A:: func是将该函数的地址(即它在该类所有对象中的偏移)赋给了指针fp。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: