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“默认”。
我搜索了类似的问题,但没有找到。
“= default”和初始化列表如何协同工作?
我应该如何在课堂体外使用“= default”?
答案 0 :(得分:3)
如果函数声明为=default
,则无法提供初始化列表(对于构造函数),也不能提供函数体。
这本书是错的,或者你误解了这本书的内容。
答案 1 :(得分:2)
在某些情况下,编译器会自动为您生成默认ctor等特殊功能。 =default
是一种告诉编译器显式生成函数的方法,即使在不会自动发生的情况下也是如此。
关键是:你要么像往常一样自己实现这个功能或你=default
它。你不能同时兼顾两种功能。影响编译器生成的唯一方法是通过默认初始值设定项,例如double revenue = 0;
编译器生成的实现可用于默认ctor,copy ctor,copy assignment,move ctor,move assignment和destructor。有关详细信息,请参阅this answer。 SalesData(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
关键字也可用于析构函数。