首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++默认构造函数不可用

C++默认构造函数不可用
EN

Stack Overflow用户
提问于 2013-09-26 09:32:02
回答 3查看 1.4K关注 0票数 0

我目前正在学习C++和阅读"C++初级第5版“。我刚开始学习构造函数,我遇到了一个我无法解决的问题。

代码语言:javascript
复制
#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对象时:

代码语言:javascript
复制
Sales_data total;

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

代码语言:javascript
复制
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) { }

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-26 09:37:10

默认构造函数是可以不传递任何参数而调用的构造函数。

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

例如,当您编写

代码语言:javascript
复制
MyClass x;

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

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

票数 3
EN

Stack Overflow用户

发布于 2013-09-26 10:01:58

这个问题与默认构造函数无关。问题确实存在于Sales_data total;中。total的书号、售价和销售号码是多少?您必须在构建total时提供它们。

票数 0
EN

Stack Overflow用户

发布于 2013-09-26 10:11:22

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

代码语言:javascript
复制
Sales_data total;

因为没有提供参数,所以编译器尝试使用不接受任何参数的构造函数。这样的构造函数也称为“默认构造函数”。您的类没有没有参数的构造函数,因此这是行不通的。

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

代码语言:javascript
复制
Sales_data total("books", 28, 15.99);

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19024442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档