那么一个类有两个默认构造函数吗?

时间:2013-10-24 19:19:17

标签: c++

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

所以在以下代码中:

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 个答案:

答案 0 :(得分:3)

有趣的是,你的类可以有多个构造函数重载,它可以不使用任何参数,因此是有效的默认构造函数:

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

这是完全合法的写作。因此,标题中问题的答案是:是。唯一的问题是你不能使用它们 - 它们含糊不清。当你写:

A a;

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

答案 1 :(得分:2)

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

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

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

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


* 要清除该陈述,您必须能够制作如下对象:

Book book;

答案 2 :(得分:1)

  

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

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

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

答案 3 :(得分:0)

你正在考虑构造函数的类型。所以有三个默认构造函数由complier,默认构造函数由程序员使用默认参数,默认构造函数由程序员没有dafault参数。所以你在谈论第二种类型。是的,它是一种默认构造