0

我目前正在学习 C++ 并阅读“C++ Primer 5th Edition”。我刚开始学习构造函数,但遇到了一些我无法弄清楚的问题。

#ifndef SALES_DATA_H
#define SALES_DATA_H
#include <string>
struct Sales_data
{
    //default constructor
    Sales_data(const std::string &s, unsigned n, double p):
               bookNo(s), units_sold(n), revenue(p*n) { } 
    //new members: operations on Sales_data objects
    std::string isbn() const { return bookNo; }
    Sales_data& combine(const Sales_data&);
    double avg_price() const;
    //data members
    std::string bookNo;
    unsigned units_sold;
    double revenue;
};

我很确定我写的默认构造函数是正确的(考虑到它是书中写的),但显然我在这里遗漏了一些东西。我没有看到任何语法错误或任何东西,并且所有内置成员都正在初始化,所以我不知道出了什么问题。

编辑 :

我刚刚发现不是我的头文件给出了错误,它实际上是我的源文件。当我创建一个 Sales_data 对象时,例如:

Sales_data total;

它给了我“没有适当的默认构造函数可用”错误。考虑到作者给出了三种编写默认构造函数的方法,我仍然不确定出了什么问题,它们是:

struct Sales_data {
// constructors added
Sales_data() = default;   //Number 1
Sales_data(const std::string &s): bookNo(s) { }    //Number 2
Sales_data(const std::string &s, unsigned n, double p):    //Number 3
           bookNo(s), units_sold(n), revenue(p*n) { }

如果这些不是默认构造函数,那么它们到底是什么/它们的目的是什么?

4

3 回答 3

3

默认构造函数是可以在不传递任何参数的情况下调用的构造函数。

这意味着它不能接受任何参数,或者所有参数都必须具有默认值。

例如,当您编写时需要默认构造函数

MyClass x;

因为编译器必须能够生成代码来构建这样一个没有任何参数的对象。

此外,标准容器可能需要一个默认构造函数,具体取决于您使用它们的方式:例如,如果您使用std::vector::resize该库,可能会要求您增加包含您的类实例的向量的大小,因此它必须能够在不提供任何参数的情况下创建元素。

于 2013-09-26T09:37:10.983 回答
0

该问题与默认构造函数无关。问题确实在Sales_data total;. 书号、售价和销量是total多少?您必须在构建时提供它们total

于 2013-09-26T10:01:58.320 回答
0

您的类的构造函数需要三个参数,当您尝试构造对象时必须提供这些参数。您当前的变量声明不提供任何参数:

Sales_data total;

因为没有提供参数,编译器尝试使用不带任何参数的构造函数。这样的构造函数也称为“默认构造函数”。你的类没有没有参数的构造函数,所以这不起作用。

要使用现有的构造函数,您必须在创建对象时提供参数:

Sales_data total("books", 28, 15.99);

或者,您可以添加一个Sales_data不带任何参数的构造函数(默认构造函数),并使用一些默认值初始化该类。

于 2013-09-26T10:11:22.050 回答