对象数组在Java & C++ 中实例化的区别

昨天把C++和Java里的对象构造机制搞混了。起因是一个程序的片段,用new构造一个数组。C++是会对每一个数组元素调用构造函数的,我想当然地以为Java也会这么做。但事实正与我想的相反。我写了一个Java程序测试了一下: 

class Test 
{
    public Test(){
        id=getNextId();
        System.out.println("I am object "+id+".");
    }
    private int getNextId(){
        return nextId++;
    }
    public static void main(String[] args) 
    {
        Test test1=new Test();
        Test test2=new Test();
        Test[] testers=new Test[4];
        System.out.println(testers[1]);
    }
    private static int nextId=1;
    private int id;
}

设一个静态变量,这样可以方便的表示出每一个对象。这种方法是我测试时常用的。测试结果是test1和test2的构造函数执行了,但testers数组没有动静。随便找一个testers[1],结果还是null。刚才找来一本《Java编程思想》里有解释,说的是定义数组时只是声明了那么多的引用,并没有去生成对象。

但C++里就不同了:


class A{
public:
    A(){
        id=get_next_id();
        cout<<"Object: "<<id<<" was born."<<endl;
    }
    ~A(){
        cout<<"Object: "<<id<<" is dead."<<endl;
    }
    int get_id();
private:
    int get_next_id();
    int id;
    static int next_id;
};
int A::next_id=1;
int A::get_next_id(){
    int id=next_id;
    ++next_id;
    return id;
}
int A::get_id(){
    return id;
}
int main(){
    A *arr=new A[3];
    delete[] arr;
    system("pause");
    return 0;
}

输出结果:


Object: 1 was born.
Object: 2 was born.
Object: 3 was born.
Object: 3 is dead.
Object: 2 is dead.
Object: 1 is dead.

写这个C++片段时发生了一点波折。一开始我把那个静态变量在class里初始化了,结果编译器gcc给我来了个“error: ISO C++ forbids in-class initialization of non-const static member `next_id'”。瞎改了几下,没碰对,索性打开电脑上的《C++ Primer》,才想起来静态成员是在class外面初始化的,而且还要指明类型:
int A::next_id=1;

语言之间的细小差别的确挺让人郁闷。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值