C ++入门问题:委托给默认构造函数

时间:2017-03-11 19:46:31

标签: c++ constructor

做出如此错误的猜测,我不小心。我做了很多无用的工作,因为我忽略了在书上声明默认构造函数的行。对不起。

=============以下内容是原始问题=================

我有一个关于示例&的问题在C ++ Primer 5th,P.292的解释,它是关于如何使用委托构造函数:

class Sales_data {
public:
//target constructor
Sales_data(std::string s, unsigned cnt, double price) :
        bookNo(s), units_sold(cnt), revenue(cnt * price) { }
//delegate constructor that I have question on
Sales_data(std::istream &is): Sales_data() {read(is, *this)}
};

用于解释此委托构造函数的工作原理,该书说:

  

它委托给默认构造函数,而构造函数又委托给三参数构造函数。

我对这个解释感到困惑。我不明白为什么委托构造函数首先委托默认构造函数,然后仍然需要委托目标构造函数。

为了确认我的想法,我做了一些实验:

首先,我想到目标构造函数会自动生成一个默认构造函数,因为示例代码中没有默认的构造函数声明;我知道当我有自定义构造函数时,默认构造函数是必须的。所以我试着用一些简单的测试代码编译类:

int main(int argc, char const *argv[]) {
    Sale_data item1(std::cin);
    print(std::cout, item1);    
    return 0;
}

我收到了一个错误:

error: no matching function for call to Sale_data::Sale_data()

然后我添加了Sales_data() = default,程序打印出正确的结果。

接下来,我删除了我的目标构造函数。但是,该程序仍然表示与我从步骤2得到的结果相同:看起来默认构造函数完成了它的工作。

与本书所解释的内容相比,我的实验表明,在我的情况下,目标构造函数与委托构造函数没有任何关系。你能指出我错在哪里吗?

先谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

  

首先,我想到目标构造函数会自动生成   生成默认构造函数,因为没有默认值   示例代码中的构造函数声明;

书中有一个默认构造函数。就在三个参数目标consturctor之后。您是否引用了错误的代码示例?

Sales_data(): Sales_data("", 0, 0) {}