1.对象数组
数组是有一定顺序关系的,同类型的数据集合。
对象是属于自定义类的实例。
我们可以由一个个对象构成数组,只要这些对象属于同一个类型就可以。这就是对象数组。
定义对象数组: 类名 数组名[元素个数];
访问对象数组元素:通过下标访问:数组名[下标].成员名
2.对象数组初始化
数组中每一个元素对象被创建时,系统都会调用类构造函数初始化该对象。
通过初始化列表赋值。例如:Point a[2]={Point(1,2),Point(3,4)};
如果没有为数组元素指定显式初始值,数组元素便使用默认值初始化(调用默认构造函数)。
数组元素的构造和析构:
构造数组时,元素所属的类未声明构造函数,则采用默认构造函数。
各元素对象的初值要求为相同的值时,可以声明具有默认形参值的构造函数。
各元素对象的初值要求为不同的值时,需要声明带形参的构造函数。
当数组中每一个对象被删除时,系统都要调用一次析构函数。
3.对象数组应用举例:
//Point.h
#ifndef POINT_H
#define POINT_H
class Point
{
public: //外部接口
Point();
Point(int x,int y);
~Point();
void move(int newX,int newY);
int getX() const {return x;}
int getY() const {return y;}
static void showCount(); //静态函数成员
private: //私有数据成员
int x,y;
};
#endif //_POINT_H
//Point.cpp
#include<iostream>
#include "Point.h"
using namespace std;
Point::Point():x(0),y(0)
{
cout<<"Default Constructor called."<<endl;
}
Point::Point(int x,int y):x(x),y(y)
{
cout<<"Constructor called."<<endl;
}
Point::~Point()
{
cout<<"Destructor called."<<endl;
}
void Point::move(int newX,int newY)
{
cout<<"Moving the point to ("<<newX<<","<<newY<<")"<<endl;
x=newX;
y=newY;
}
//main.cpp
#include <iostream>
#include "Point.h"
using namespace std;
int main()
{
cout << "Entering main..." << endl;
Point a[2];
for(int i=0;i<2;i++)
a[i].move(i+10,i+20);
cout<<"Exiting main..."<<endl;
return 0;
}
4.基于范围的for循环
C++11提供了一种新的循环语句,基于范围的for循环。他最擅长的就是自动遍历整个容器,比如数组就是一个容器,基于范围的for循环就可以不用我们控制循环次数,能自动把整个数组力的元素遍历一遍。例子:
#include <iostream>
//using namespace std;
int main()
{
int array[3]={1,2,3};
for(int & e:array)
{
e+=2;
std::cout<<e<<std::endl;
}
return 0;
}
可以对比不使用基于范围的for循环:
#include <iostream>
using namespace std;
int main()
{
int array[3]={1,2,3};
int *p;
for(p=array;p<array+sizeof(array)/sizeof(int);++p)
{
*p+=2;
cout<<p<<endl;
}
return 0;
}
基于范围的for循环在处理容器类的时候更有用。