对象数组初始化:
- 数组中每一个元素对象被创建时,系统都会调用类构造函数初始化该对象
- 可以通过初始化列表赋值,例:Point a[10] = {Point(1,2), Point(3,4)};
- 如果没有为数组元素指定显式初始值,数组元素便会调用默认构造函数
- 数组中每一个对象被删除时系统都要调用一次析构函数
例子:
#include<stdio.h>
#include<iostream>
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);
*/