前些天看到一段以前没见过的类实例化的方式,自己琢磨了一下有了自己的理解。先看看这种实例化的方式:
#include<iostream>
using namespace std;
class A
{
public:
static int b;
int a;
A(int t=2):a(t){b++;}
void print(){cout<<a<<'\t'<<b<<endl;}
};
int A::b;
int main()
{
A x[5]={1,2,3};
x->print();
(x+2)->print();
x[4].print();
return 0;
}
运行结果如下:
刚开始看到这段代码很疑惑(本人见识太短),搞不清楚是怎么回事,后来单步跟踪了一下,发现类实例化时调用构造函数时,类似于一个循环:
for(int i=0;i<5;i++)
{
A x[i];
}
但有一点还是不解,单步跟踪时,构造函数并没有调用五次,但后面显示b(记录构造函数调用次数)的值为5,这里我猜测是因为数组x虽长度为5,但只储存了3个值,所以在实例化过程中,到数组下标为3的时候编译器就没有显示构造函数的调用了,对此,我试着将数组存储五个值,发现结果没变;更改语句x[4].print();发现无论是更改该语句的位置,还是更改数组的偏移量(中括号中数组下标)结果都没发生变化,所以构造函数是在执行到 A x[5]时连续调用了五次,即于上述for循环类似。
想到素组调用可以把数组名当作指针进行内存地址偏移的操作,脑补了用类类型的指针(new好多个对象)来实现类类型数组的相同操作,是实现如下:
#include<iostream>
using namespace std;
class A
{
public:
static int b;
int a;
A(int t=2):a(t){b++;}
void print(){cout<<a<<'\t'<<b<<endl;}
};
int A::b;
int main()
{
A *p1,*p2,*p3,*p4,*p5;
p1=new A(1);p2=new A(2);p3=new A(3);p4=new A;p5=new A;
p1->print();
p3->print();
p5->print();
return 0;
}
同样可以输出相同的结果,只是这种指针的写法有点费事,如果需要同时实例化很多不同的对象时,指针操作就不那么省事了,这种情况考虑用数组实例化可能更为便捷。