struct SalesData {
SalesData() = default;
SalesData(const string&s) : bookNo(s) {}
string bookNo;
unsigned copies_sold = 0;
double revenue = 0;
};
デフォルトのコンストラクタについて議論していますが、プライマーは上記のコードのようにコンストラクタをデフォルトにすることができます。そのキーワードは、クラス内の宣言、またはクラス外の定義とともに現れます。 コンパイラがクラス内イニシャライザを使用できない場合は、2番目のコンストラクタと同じようにイニシャライザリストを使用できます。C++プライマーは、 "=デフォルト"のコンストラクタにイニシャライザリストを使用できると述べています。
しかし、形式は何ですか?
まず、私は直接初期化リストを使用しようとしました:
SalesData() = default:bookNo(""), copies_sold(1), revenue(2){};
をしかし、それは動作しないことができ、コンパイラは「デフォルト」のaferコロンがあってはならないと言います。
は、その後、私はクラスで「=デフォルト」でコンストラクタを宣言し、初期化子リストを使用せず、外部にそれを定義しようとしました:
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セミコロンがなければならないと述べました。
私は同様の質問についてはGoogleで検索しましたが、何も見つかりませんでした。
"=デフォルト"とイニシャライザのリストはどのように連携できますか?
「=デフォルト」をクラス本体の外で使うべきですか?
初期化子リストがある場合、これはデフォルトのバージョンではなく、ユーザー定義のコンストラクタです。だから '= default'をスキップするだけです。 –
'= default'は、コンパイラにコンストラクタ/代入を生成させたいときに指定します。これはあなたがそれの定義を持つことができないことを意味します。これはデフォルト(より多くの単語が必要)にのみ適用され、initializer_listを持つユーザー定義のコンストラクタではなく、コンストラクタとそれぞれの割り当てをコピーして移動します。 – DeiDei