缺省构造函数

科技工作者之家 2020-11-17

缺省构造函数又叫默认构造函数,英文名称default constructor,是当声明对象的时候,编译器会调用的一个构造函数。

在计算机编程语言中,缺省构造函数可以指编译器在没有任何程序员定义的构造函数(例如Java)的情况下自动生成的构造函数,通常是无用的构造函数。 在其他语言中(例如在C ++中),无论构造函数是自动生成的还是用户定义的,它都是可以调用的构造函数,无需提供任何参数。 请注意,如果在构造函数的定义中提供了默认参数,那么带有形参的构造函数仍然可以不带参数地被调用。

C++在C ++中,该标准将类的默认构造函数描述为可以不带任何参数调用的构造函数(其中包含一个构造函数,其参数都具有缺省参数)。 例如1:

class MyClass{public: MyClass(); // constructor declaredprivate: int x;};MyClass::MyClass() : x(100) // constructor defined{}int main(){ MyClass m; // at runtime, object m is created, and the default constructor is called}当动态分配内存时,可以通过在类名后添加括号来调用构造函数。 从某种意义上说,这是对构造函数的显式调用:

int main(){ MyClass * pointer = new MyClass(); // at runtime, an object is created, and the // default constructor is called}如果构造函数确实有一个或多个参数,但它们都有默认值,那么它仍然是一个默认的构造函数。 请记住,每个类最多可以有一个默认构造函数,其中一个没有参数,或者所有参数都有默认值的构造函数,比如在这种情况下:

class MyClass{public: MyClass (int i = 0, std::string s = ""); // constructor declaredprivate: int x; int y; std::string z;};MyClass::MyClass(int i, std::string s) // constructor defined{ x = 100; y = i; z = s;}在C ++中,默认构造函数非常重要,因为它们在某些情况下会自动调用;因此,在这些情况下,类没有默认构造函数是错误的:

当没有参数列表(例如:MyClass x;)或者没有参数列表(例如:new MyClass;或new MyClass();)动态分配对象值时,MyClass的默认构造函数用于初始化对象。

当声明一个对象数组时,例如MyClass x ;;或动态分配,例如,新的MyClass。 MyClass的默认构造函数用于初始化所有元素。

当派生类构造函数未在其初始化程序列表中显式调用基类构造函数时,将调用基类的默认构造函数。

当类构造函数没有在其初始化列表中明确调用其某个对象值域的构造函数时,将调用该字段类的默认构造函数。

在标准库中,当没有明确给定值时,某些容器使用默认构造函数“填充”值。例如。向量(10);用10个元素初始化矢量,这些元素用默认构造的MyClass对象填充。

如果一个类没有明确定义的构造函数,编译器会隐式声明并为其定义一个默认的构造函数。这个隐式定义的默认构造函数等价于一个空体明确定义的构造函数。例如:

class MyClass{ int x; // no constructor, so the compiler produces an (implicit) default constructor};int main(){ MyClass m; // no error at runtime: the (implicit) default constructor is called}如果构造函数是为一个类明确定义的,但它们都是非默认的,编译器将不会隐式地定义一个默认构造函数,从而导致类没有默认构造函数的情况。 这是典型错误的原因,如下例所示。

class MyClass{public: MyClass (int y); // declaration a non-default constructorprivate: int x;};MyClass::MyClass (int y){ x = y;}int main(){ MyClass m(100); // the non-default constructor is called MyClass * p; // for pointer declarations, the compiler does not need to know about constructors p = new MyClass(); // error at compilation: no default constructor return 0;}由于程序员和编译器都没有定义默认的构造函数,因此由p指向的对象的创建会导致错误。

另一方面,在C ++ 11中,可以显式创建一个默认构造函数:

class MyClass{public: MyClass () = default; // force generation of a default constructor};Java和C#在Java和C#中,“默认构造函数”指的是如果没有为该类定义构造函数,那么编译器会自动生成一个空构造函数。 默认构造函数隐式调用超类的空构造函数,然后执行一个空体。 所有字段的初始值都为0(整数类型),0.0(浮点类型),false(布尔类型)或null(引用类型)。 一个不带参数的程序员定义的构造函数在C#中也被称为默认构造函数,但不是在Java中。

本词条内容贡献者为:

李岳阳 - 副教授 - 江南大学

科技工作者之家

科技工作者之家APP是专注科技人才,知识分享与人才交流的服务平台。