2013-10-24 61 views
-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) { } 
}; 

两个构造没有参数和为其参数提供默认参数的构造函数是默认构造函数?或默认参数是否意味着第二个构造将需要看起来像:图书():页(5),价格(46),字体(“宋体”){}

+6

默认参数表示类似于“Book(int n = 0,double p = 0.0 ... etc.”),所以你的第二个构造函数不会是默认的ctor。“ –

+0

”也定义了默认构造函数“应该表示”也可以用来定义默认构造函数“。它并不打算暗示你可以有意义地拥有两个默认的构造函数。 –

+0

@PeteBecker我不知道标准中的措辞是否真的是错误的。它说“默认构造函数”,而不是“默认构造函数(候选)”。这是否意味着我给出的答案应该被标准的符合编译器拒绝?还是应该澄清措辞,因为没有“默认构造函数”这样的东西? –

回答

1

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

这意味着使用默认参数。在你的榜样,这意味着:

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

如果你可以构造你的对象,而不调用构造函数明确*,那么你有一个默认构造。一个类有一个默认的构造函数:

  • 如果你没有创建任何构造函数。 (= default

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

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


*要清除的语句,你必须使对象像下面的能力:

Book book; 
+1

@clcto:这不是一个默认的构造函数。这是一个参数构造函数。不同之处在于,在* default-initializing *实例时使用默认构造函数。默认初始化是当你声明实例变量并且不给它任何东西时发生的事情。 – greyfade

+0

@M M.在我的例子中,写作Book(){}和写作Book()= default之间有区别吗? ?它似乎有相同的效果,但我的书说如果有另一个构造函数,那么我应该使用= default。 – FrostyStraw

+0

@FrostyStraw:没有区别。我不确定这本书的说法。 – deepmax

2

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

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

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

A a; 

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

0

您正在使用有关构造函数的类型。所以有三个,默认构造函数由编译器,缺省构造函数由程序员使用默认参数,缺省构造函数由程序员没有默认参数。所以你在谈论第二种类型。是的,这是一种默认结构

相关问题