在C ++中,默认构造函数非常重要,因为它们在某些情况下会自动调用;因此,在这些情况下,类没有默认构造函数是错误的:
当没有参数列表(例如:MyClass x;)或者没有参数列表(例如:new MyClass;或new MyClass();)动态分配对象值时,MyClass的默认构造函数用于初始化对象。
当声明一个对象数组时,例如MyClass x ;;或动态分配,例如,新的MyClass。 MyClass的默认构造函数用于初始化所有元素。
当派生类构造函数未在其初始化程序列表中显式调用基类构造函数时,将调用基类的默认构造函数。
当类构造函数没有在其初始化列表中明确调用其某个对象值域的构造函数时,将调用该字段类的默认构造函数。
在标准库中,当没有明确给定值时,某些容器使用默认构造函数“填充”值。例如。向量
如果一个类没有明确定义的构造函数,编译器会隐式声明并为其定义一个默认的构造函数。这个隐式定义的默认构造函数等价于一个空体明确定义的构造函数。例如:
如果构造函数是为一个类明确定义的,但它们都是非默认的,编译器将不会隐式地定义一个默认构造函数,从而导致类没有默认构造函数的情况。 这是典型错误的原因,如下例所示。
由于程序员和编译器都没有定义默认的构造函数,因此由p指向的对象的创建会导致错误。
另一方面,在C ++ 11中,可以显式创建一个默认构造函数:
在Java和C#中,“默认构造函数”指的是如果没有为该类定义构造函数,那么编译器会自动生成一个空构造函数。 默认构造函数隐式调用超类的空构造函数,然后执行一个空体。 所有字段的初始值都为0(整数类型),0.0(浮点类型),false(布尔类型)或null(引用类型)。 一个不带参数的程序员定义的构造函数在C#中也被称为默认构造函数,但不是在Java中。