对象数组

对象数组初始化:

  • 数组中每一个元素对象被创建时,系统都会调用类构造函数初始化该对象
  • 可以通过初始化列表赋值,例:Point a[10] = {Point(1,2), Point(3,4)};
  • 如果没有为数组元素指定显式初始值,数组元素便会调用默认构造函数
  • 数组中每一个对象被删除时系统都要调用一次析构函数


例子:

#include
#include
using namespace std;
class Point
{
	public:
		Point(): x(0), y(0) {  sum++;  }			//默认构造函数,即未提供显式初始值时,用来初始化对象的构造函数
		Point(int x, int y): x(x), y(y) {  sum++;  }
		Point(const Point &b)  {  sum++;  }
		static int Getsum()  {  return sum;  }
		int Getx()  {  return x;  }
		int Gety()  {  return y;  }
		void Move(int t)  {  x += t, y += t;  }
		~Point()  {  sum--;  }
	private:
		int x, y;
		static int sum;
};
int Point::sum = 0;
void Change(Point s[][2], int t)
{		//注意别忘了传递二维数组时,一定要告知编译器第二维的大小,因为编译器必须知道每行元素的个数,才能正确计算arr[i][j]的地址 
	int i, j;
	for(i=0;i<=4;i++)
	{
		for(j=0;j<=1;j++)
			s[i][j].Move(t);
	}
}
int main(void)
{
	int i, j;
	Point s[5][2] = {{Point(0,0), Point(3,4)}, {Point(5,6)}};
	printf("%d\n", Point::Getsum());		//输出结果:10
	for(i=0;i<=4;i++)
	{
		for(j=0;j<=1;j++)
			printf("s[%d][%d] = (%d, %d);   ", i, j, s[i][j].Getx(), s[i][j].Gety());
		puts("");
	}
	Change(s, 100);
	for(i=0;i<=4;i++)
	{
		for(j=0;j<=1;j++)
			printf("s[%d][%d] = (%d, %d);   ", i, j, s[i][j].Getx(), s[i][j].Gety());
		puts("");
	}
	return 0;
}
/*
s[0][0] = (0, 0);   s[0][1] = (3, 4);
s[1][0] = (5, 6);   s[1][1] = (0, 0);
s[2][0] = (0, 0);   s[2][1] = (0, 0);
s[3][0] = (0, 0);   s[3][1] = (0, 0);
s[4][0] = (0, 0);   s[4][1] = (0, 0);
s[0][0] = (100, 100);   s[0][1] = (103, 104);
s[1][0] = (105, 106);   s[1][1] = (100, 100);
s[2][0] = (100, 100);   s[2][1] = (100, 100);
s[3][0] = (100, 100);   s[3][1] = (100, 100);
s[4][0] = (100, 100);   s[4][1] = (100, 100);
*/

你可能感兴趣的:(C++)