昨天把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;
语言之间的细小差别的确挺让人郁闷。
对象数组在Java & C++ 中实例化的区别
最新推荐文章于 2022-07-21 13:49:15 发布