我正在学习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) { }
如果那些不是默认构造函数,那么它们的目的究竟是什么?
答案 0 :(得分:3)
默认构造函数是一个可以在不传递任何参数的情况下调用的构造函数。
这意味着它必须不带任何参数,或者所有参数都必须具有默认值。
例如,当您编写
时,需要默认构造函数MyClass x;
因为编译器必须能够生成代码来构建这样一个没有任何参数的对象。
标准容器也可能需要默认构造函数,具体取决于您使用它们的方式:例如,如果使用std::vector::resize
,可以要求库增加包含类实例的向量的大小,因此它必须能够创建元素而不提供任何参数。
答案 1 :(得分:0)
问题与默认构造函数无关。确实问题出在Sales_data total;
。什么是total
的图书编号,销售价格和销售数量?在构建total
时,您必须提供它们。
答案 2 :(得分:0)
您的类的构造函数有三个参数,当您尝试构造对象时必须提供这些参数。您当前的变量声明不提供任何参数:
Sales_data total;
因为没有提供参数,编译器会尝试使用不带任何参数的构造函数。这样的构造函数也称为“默认构造函数”。你的类没有没有参数的构造函数,所以这不起作用。
要使用现有构造函数,必须在创建对象时提供参数:
Sales_data total("books", 28, 15.99);
或者,您可以向Sales_data
添加一个不带任何参数(默认构造函数)的构造函数,并使用一些默认值初始化该类。