C++对象数组与对象指针
(一)对象数组
将具有相同类类型的对象有序地集合在一起便构成了对象数组,以一维对象数组为例,其定义形式为:
类名 对象数组名[];
Point points[100];
关于对象数组的几点说明:
(1)在建立对象数组的时候需要调用构造函数。如果对象数组有100个元素,就需要调用100次构造函数。
(2)如果对象数组所属类有带参数的构造函数时,可用初始化列表按顺序调用构造函数,使用复制初始化来初始化每个数组元素。
Point A[3]={Point(0,0),Point(1,1),Point(2,2)}; //Point(int a=0,int b=0)
Point A[3]={Point(1),Point(2),Point(3)}; //Point(int a=0,int b=0)
(3)如果对象数组所属类有单个参数的构造函数时候,定义数组时可以直接在初值列表中提供实参。
Point A[3] ={1,2,3}; //Point(int a=0,int b=0)
等价与:
Point A[3]={Point(1),Point(2),Point(3)};
(4)如果对象数组在创建时没有初始化,则所属类要么有合成默认构造函数,要么定义无参数的构造函数或全部参数为默认参数的构造函数。
(5)对象数组的初始化形式本质上取决于所属类的构造函数,需要清晰初始化实参与构造函数形参的对应关系,避免出现歧义性。
(6)如果对象数组所属类含有析构函数,那么每当建立对象数组时,按照每个元素的排列顺序调用构造函数;每当撤销数组时,按照相反的顺序调用析构函数。
(二)对象指针
1)指向对象的指针
在建立对象时,编译器会为每一个对象分配一定的存储空间,以存放其成员。对象内存单元的起始位置地址就是对象的指针。可以定义一个指针变量,用来存放对象的指针。指向类对象的指针变量的定义形式为:
类名* 对象指针变量名=初值;
例子:
Point one(0,0),*p; //p为指向对象的指针变量
p=&one; //指向对象
2)类成员指针
成员对象要占用存储空间,因此也有地址。指向对象成员的指针变量,一般形式为:
数据成员类型* 指针变量名=初值;
注意,C++比C语言有着更加严格的静态类型,更加强调类型安全与编译时检查。因此,C++指针被分为数据指针,函数指针,数据成员指针,成员函数指针四种,而且不能随意转换。其中前两种是C语言的称为普通指针;后两种是C++专门为类扩展的,称为成员指针。
成员指针与类的类型和成员的类型相关,它只应用于类的非静态成员。由于静态成员不是任何对象的组成部分,所以静态成员指针可用普通指针。
a)数据成员指针
数据成员类型是 类名::*指针变量名=成员地址初值;
b)成员函数指针
定义成员函数指针时必须确保在三个方面与它所指函数的类型相匹配: