隐式默认构造函数有一个空主体和一个空初始值设定项列表(未定义的原始类型,默认构造函数用于用户定义的类型)。
这篇帖子说
MyClass *c = new MyClass();
确实进行了成员级值初始化,但在进行初始化时调用默认构造函数有什么意义
MyClass c;
?
是否调用隐式默认构造函数,以确保调用用户定义类型(可能具有非平凡的默认构造函数)的默认构造函数?
使现代化
似乎在调用编译器生成的隐式默认构造函数后,对象可能无法一致实例化,即未定义基元类型,并且用户定义的类型可能(或可能不)处于已知状态,这取决于程序员是否提供了默认构造函数。
那么,为什么编译器会生成一个隐式默认构造函数,调用该构造函数时可能会实例化处于未知状态的对象?
我在维基百科虚拟方法表中读到
因此,编译器还必须在每个类的构造函数中生成“隐藏”代码,以将新对象的vpointer初始化为其类的vtable地址。
也许这就是拥有默认隐式构造函数的原因之一——当存在带有虚拟方法的类层次结构时,每个实例都需要正确地设置vpointer。
无论你这样做:
MyClass c;
或这个:
MyClass *c = new MyClass();
您正在调用默认构造函数。
您是对的,隐式默认构造函数确实没有初始化诸如int和double之类的基元类型。但它确实通过调用其默认构造函数(隐式或显式)来初始化任何其他成员变量,例如字符串。
隐式默认构造函数的点与任何其他构造函数的点相同。
需要构造给定类的每个实例。类实例本身不会凭空出现。某物在某处具有构造对象的任务。
如果未声明显式构造函数,则会自动定义隐式默认构造函数,该默认构造函数构造类的超类和任何类成员。
这里,“默认构造”还包括“不做任何事情”选项,如果类成员是没有显式构造函数的基元类型。因此,最终,隐式默认构造函数可能什么都不做。但是,如果没有指定显式构造函数(当然,如果没有显式删除隐式默认构造函数),它仍然是定义的。
问题内容: 我有一些简单的Java代码,其结构与此类似: 我将有很多的子类,每个子类以自己的方式(模板方法模式)实现方法。 这很好用,但是我不喜欢子类中有多余的构造函数。输入更多,难以维护。如果要更改构造函数的方法签名,则必须更改所有子类。 当我从子类中删除构造函数时,出现此编译时错误: 我想做的事可能吗? 问题答案: 你会收到此错误,因为没有构造函数的类具有默认构造函数,该构造函数没有参数,并且
问题内容: 所以我正在学习Java。我有一个月的时间,我刚刚了解了构造函数。但是我看不到创建一个的全部目的。为什么我什么时候要使用?我知道它没有主方法,您可以从主类中调用构造函数。任何人都可以启发我这个话题,这对我有很大帮助。 问题答案: 构造函数是用来初始化/设置类实例的对象。 如果您有一个对象需要一些处理才能使用(例如,初始化成员),则应在构造函数中执行此操作。 理想情况下,您永远不应拥有“部
问题内容: 在Java中调用基类构造函数是强制性的吗?在C ++中,它是可选的,所以我问这个问题。 当我扩展时,我得到这个错误: 那么,调用基本构造函数的目的是什么?当我创建对象时,基类的构造函数将调用&然后涉及到派生权。 问题答案: 如果您自己不调用no- args构造函数,则该隐式调用;如果该构造函数不存在,则无效。要求调用超构造函数的原因是,超类通常在构造后会处于其预期的状态,其中可能包含无
问题内容: 我有一条记录,想要向其中添加默认构造函数。 但是它创建了带参数的构造函数。 我们如何向记录添加默认构造函数? 问题答案: 为了分裂头发,您永远无法定义默认构造函数,因为在没有定义构造函数的情况下,编译器会生成默认构造函数,因此根据定义,任何定义的构造函数都不是默认构造函数。 如果希望记录具有无参数构造函数,则记录确实允许添加额外的构造函数或工厂方法,只要调用将所有记录字段作为参数的“规
问题内容: 试图屈服于Javascript对OO的追求,并且像其他许多人一样,对该属性感到困惑。特别是,属性的重要性,因为我似乎无法使其发挥任何作用。例如: 在上面的示例中,该对象似乎具有名为()的正确构造函数-并且它继承了的age属性。那么为什么很多人建议将此作为必要步骤: 显然,在构造 时 调用了正确的构造函数,那么这个原型属性有什么影响?我很想知道“正确设置”构造函数的属性会对实际产生什么影
问题内容: 默认构造函数到底是什么?你能告诉我以下哪个是默认构造函数,它与其他构造函数有何不同? 问题答案: 他们都不是。如果定义,则不是默认值。 除非你定义另一个构造函数,否则默认构造函数是自动生成的无参数构造函数。任何未初始化的字段都将设置为其默认值。对于你的榜样,它看起来像这样假设的类型String,int以及int,那类本身是公共的: 这与 完全没有构造函数。但是,如果定义至少一个构造函数