2012-09-23 56 views
1
class A 
{ 
    static int i; 
    A() 
    { 
    System.out.println(++i); 
    } 
    public static void main(String h[]) 
    { 
    A obj[] = new A[30]; 
    } 
} 

A obj [30] = new A [30]; : - 这一行应该调用默认的 构造函数30次?通过数组对象调用构造函数

+0

如果我带一个内部流(非静态)让我们说int b;那么obj [0] .b = 1;说空指针异常,我很好理解。但是如何obob [0] .i = 3;作品? – Nil

+0

它的工作原理是因为'i'是静态的,不需要'A'的任何实例来保存一个值。 – Reimeus

回答

11

线

A obj[30] = new A[30]; 

不会调用构造函数A。它创建了30个未被引用的参考文献A;

实例化30个对象引用,可以使用:

for (int i=0; i < obj.length; i++) { 
    obj[i] = new A(); 
} 

注意,阵列中的第一次使用的30

A obj[] = { new A(), new A(), ..28 more -> 
}; 
在这种情况下给定的元件的数量

或更好大小声明是非法的。

A obj[30] = new A[30]; 
    ^
+0

in C++ A obj [30];会有效吗? – Nil

+0

自从我使用C++以来已经有一段时间了,但我不相信它会构建30个'A'实例...? –

+0

A obj [30] =新A [30]; ...对于错字感到抱歉。并且我想要一个不带循环或递归的实现,所以感谢第一种方法 – Nil

2

没有,此行不会调用构造函数的。它只创建了30个元素,类型为A。阵列的每个元素是null

0

有没有办法做的正是你想做的事,但在这里是非常接近,都调用默认的构造函数30次两件事情:

A *obj = new A[30]; 

A obj[30]; 

第一个答案将在堆上创建一个30个A对象的数组,为每个对象调用默认构造函数。 obj可以传回给这个函数的调用者,因为它不在栈上。问题是,obj不再具有A [30]类型,所以sizeof(obj)将与原始问题中的代码不同。 (请注意,删除[]必须用于obj,而不仅仅是“删除”。)

第二个答案将在栈上创建一个30个A对象的数组。现在编译器会理解obj有30个元素,sizeof(obj)将与你的问题相同。然而,obj只能用在这个函数中(或者它调用的函数),因为一旦函数返回,它就会从堆栈中消除,在进程中调用30个析构函数。 (它只是一个局部变量。)使用C++(或任何良好的面向对象的语言),创建一个对象始终意味着既分配空间又调用构造函数。否则,你真的没有一个有用的对象。因此,当以任何受支持的方式创建对象(本地变量或C++的“新”)时,它总是为您创建并且现在有权访问的每个对象调用默认构造函数。 (请注意,如果没有默认的构造函数,那么这两个答案都不会编译!)

相关问题