一个类也可以有两个默认构造函数

So can a class have two default constructors?

本文关键字:两个 构造函数 默认 一个 也可以      更新时间:2023-10-16

我正在读我的书,它说"为其所有参数提供默认参数的构造函数也定义了默认构造函数"

所以在下面的代码中:

class Book {
    public: 
    int pages = 25;
    double price = 10.0;
    std::string font = "Times New Roman";
    Book() {}
    Book(int n, double p, std::string f): pages(n), price(p), font(f) { }
};
不带参数的构造函数和为其参数提供默认参数的构造

函数都是默认构造函数?或者默认参数是否意味着第二个构造函数需要看起来像这样:Book(): pages(5), price(46), font("Times New Roman") {}

有趣的是

,您的类可以有多个构造函数重载,这些重载可以在没有参数的情况下工作,因此是有效的默认构造函数:

struct A
{
    A() {}
    A( int i = 0 ) {}
};

这是完全合法的。因此,标题中问题的答案是:是的。唯一的问题是你不能使用它们——它们是模棱两可的。当你写:

A a;

您会收到一个错误,因为两者都会匹配。

如果可以在不显式调用构造函数*的情况下构造对象,则具有默认构造函数。类具有默认构造函数:

  • 如果不创建任何构造函数。( = default

  • 如果创建没有任何参数的构造函数。

  • 如果创建一个构造函数,其所有参数都具有默认值。


* 要清除语句,您必须能够制作如下对象:

Book book;

为其所有参数提供默认参数的构造函数还定义了默认构造函数

这意味着使用默认参数。在您的示例中,这意味着:

Book( int n = 5, double p = 46, std::string f = "Times New Roman" ) :
    pages( n ),
    price( p ),
    font( f ) {}

你正在研究构造函数的类型。所以有三个,编译器的默认构造函数,程序员的默认构造函数,带有默认参数,程序员的默认构造函数没有 dafault 参数。所以你说的是第二种类型。是的,它是一种默认构造