-1

我正在读我的书,上面写着“为所有参数提供默认参数的构造函数也定义了默认构造函数”

所以在下面的代码中:

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") {}

4

4 回答 4

4

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

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

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

A a;

你会得到一个错误,因为两者都会匹配。

于 2013-10-24T19:28:38.123 回答
3

如果您可以在不显式调用构造函数的情况下构造对象*,那么您就有了默认构造函数。一个类有一个默认构造函数:

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

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

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


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

Book book;
于 2013-10-24T19:23:56.083 回答
1

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

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

Book( int n = 5, double p = 46, std::string f = "Times New Roman" ) :
    pages( n ),
    price( p ),
    font( f ) {}
于 2013-10-24T19:23:28.837 回答
0

您正在考虑构造函数的类型。所以有三种,编译器的默认构造函数,程序员使用默认参数的默认构造函数,以及程序员没有默认参数的默认构造函数。所以你说的是第二种类型。是的,它是一种默认构造

于 2013-10-24T19:43:53.410 回答