是否在构造函数中初始化有什么区别?
以下两个类的定义有什么区别?
class test
{int i=1;
...
}
class test
{int i;
public test()
{i=1;
...
}
...
}
------解决方案--------------------没区别吧
class test
{int i;
public test()
{i=1;
...
}
...
}
这样我觉得更好一些
------解决方案--------------------可能导致调用上变量值差别:变量初始化在构造函数之后。。。。
------解决方案--------------------i的初始化迟早问题,在初始化的时候
int i=1; 比在构造器中初始化早 !
------解决方案--------------------i的初始化时间问题,int i=1;比在构造器中初始化早,其他没有任何区别.
------解决方案--------------------在构造器中初始化应该能保证初始化始终能得到进行吧
区别应该没什么
------解决方案--------------------没区别
------解决方案--------------------微小的区别
------解决方案--------------------单看这个例子几乎没有什么区别(使用效果上几乎完全一样)。
但如果把 int i 换成 SomeObject o 的话,甚至,会有多个这样的“对象型成员变量”的话,那么,它们的初始化顺序问题就比较复杂了,有时甚至是致命的。
------解决方案--------------------有区别,在构造函数中初始化变量,如果你没创建test类对象的话 直接打印的结果为0,而只有创建对象,再调用i结果才是构造函数里面你给的值!
------解决方案--------------------我觉得有必要纠正一下,构造函数中的那句不叫初始化,而是一次赋值。
JAVA中,成员变量是一定会初始化的,这个初始化的位置就是在变量声明的地方。比如,下面的代码
public class T {
int i;
int j = 100;
}
执行new T()的时候,i已经被初始化为0了,而j被初始化为100。
如果要在构造函数中再加一句i = 100,将导致i首先被初始化0,然后再被重新赋值为100。相比而言,当然是直接将i初始化为100效率更高。
与JAVA的处理方式不同的是,C++中不对成员变量进行初始化,如果你定义下面的类:
class T {
int i, j;
};
i和j不会初始化为0,而是内存中的垃圾值,这显然是出于效率上的考虑。
JAVA牺牲了某些效率,但避免了程序员由于不慎使用垃圾值而导致的错误。为此,JAVA对成员变量一率进行自动初始化,而对于局部变量,没有初始化将不能使用。从而将由于初始化不当而造成的错误都拦截在编译阶段。