C ++入门说我们可以使用“= default”构造函数的初始化列表

时间:2016-10-08 08:02:42

标签: c++ constructor default

struct SalesData {

    SalesData() = default;
    SalesData(const string&s) : bookNo(s) {}

    string bookNo;
    unsigned copies_sold = 0;
    double revenue = 0;
};

在讨论默认构造函数时,primer说我们可以使用关键字“= default”来构造默认构造函数,就像上面的代码一样。该关键字可以与类中的声明一起出现,也可以与类外的定义一起出现。 如果编译器不能使用类内初始化器,我们可以像第二个构造函数一样使用初始化器列表。

但格式是什么?

首先我尝试直接使用初始化列表:

SalesData() = default:bookNo(""), copies_sold(1), revenue(2){};

但是它不起作用,编译器说不应该有冒号“默认”。

然后我尝试在类中使用“= default”声明构造函数并在外部定义它,而不使用初始化列表:

struct SalesData {
    SalesData() = default;
   /*...*/}

SalesData::SalesData() {
    bookNo = "";
    copies_sold + 0;
    revenue = 0;
}

编译器说这是重新定义的错误。 然后我把关键字移到了外面,引子说应该没问题:

struct SalesData {
    SalesData();
   /*...*/}

SalesData::SalesData()=default {
    bookNo = "";
    copies_sold + 0;
    revenue = 0;
}

它仍然失败,编译器说应该有一个分号behine“默认”。

我搜索了类似的问题,但没有找到。

  1. “= default”和初始化列表如何协同工作?

  2. 我应该如何在课堂体外使用“= default”?

3 个答案:

答案 0 :(得分:3)

如果函数声明为=default,则无法提供初始化列表(对于构造函数),也不能提供函数体。

这本书是错的,或者你误解了这本书的内容。

答案 1 :(得分:2)

在某些情况下,编译器会自动为您生成默认ctor等特殊功能。 =default是一种告诉编译器显式生成函数的方法,即使在不会自动发生的情况下也是如此。

关键是:你要么像往常一样自己实现这个功能=default它。你不能同时兼顾两种功能。影响编译器生成的唯一方法是通过默认初始值设定项,例如double revenue = 0;

编译器生成的实现可用于默认ctor,copy ctor,copy assignment,move ctor,move assignment和destructor。有关详细信息,请参阅this answerSalesData(const string&)既不是=default,也不是myEncoder = OneHotEncoder(sparse=False, handle_unknown='ignore') myEncoder.fit(df[columnsToEncode]) pd.concat([df.drop(columnsToEncode, 1), pd.DataFrame(myEncoder.transform(df[columnsToEncode]))], axis=1).reindex()

答案 2 :(得分:1)

一些补充。

如果未在类中指定任何构造函数,编译器将生成默认构造函数。这个构造函数只是用它们的默认(空)构造函数初始化所有成员(当然,如果该构造函数存在,否则它会运行到编译错误)。

如果指定非默认构造函数,则编译器不会自动生成默认构造函数。在这里你可以找到一些细节:

Conditions for automatic generation of default/copy/move ctor and copy/move assignment operator?

=default关键字意味着显式要求编译器使用默认主体生成默认构造函数(如果已经指定了另一个)。这意味着此构造函数的 body 由编译器而不是您创建。这就是为什么在尝试定义编译错误时会出现编译错误的原因。

请注意,=default关键字也可用于析构函数。