对象数组和指向对象的指针 指向类成员的指针
2012-10-15 17:01
260 查看
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。
对象数组是指数组元素为对象的数组。这种对象数组与其它数据类型的数组定义方式相同。如:
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。
相关文章推荐
- 对象数组和指向对象的指针 指向类成员的指针
- 指向自由存储区中对象的指针数组
- 利用指向类成员函数的指针数组,实现更加隐蔽的接口
- 建立一个对象数组,内放5个学生数据(学号、成绩),用指针指向数组首元素,输出学生的数据
- 建立一个对象数组,内放5个学生的数据(学号,成绩),用指向对象的指针做函数参数,在max函数中找出5个学生中成绩最高者,并输出其学号。
- Chapter9——建立一个对象数组,内放5个学生的数据(学号,成绩),设立一个函数max,用指向对象的指针做函数参数,在max函数中找出5个学生中成绩最高者,并输出其学号。
- C++:指向对象成员函数的指针
- 指向类成员函数指针之指针数组
- 类和对象深入讨论——指向类的成员的指针
- 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用
- 7.22通过指向对象的指针访问对象中的成员
- 指向对象成员变量的指针和指向成员函数的指针
- 基类指针指向子类对象数组的问题
- 指向数组的引用;指向数组的指针;指向类成员的指针;指向类数组成员的指针;二维字符串数组指针
- 对象数组和指向对象的指针 指向类成员的指针
- C++之指向对象成员函数的指针
- this指针指向当前调用对象,只是用于类的非静态成员函数。静态函数和全局函数 无当前对象,无this指针。
- VC++之对象含指针成员指向堆空间并调用复制构造函数问题—参考范磊VC++
- 指向对象指向对象成员的指针
- 第五周 阅读程序 在 main 函数中,可设置指向对象public 成员、对象函数还有对象的指针