C++中类类型的数组

前些天看到一段以前没见过的类实例化的方式,自己琢磨了一下有了自己的理解。先看看这种实例化的方式:

#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;
}

同样可以输出相同的结果,只是这种指针的写法有点费事,如果需要同时实例化很多不同的对象时,指针操作就不那么省事了,这种情况考虑用数组实例化可能更为便捷。

  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值