0
class WithCC { // With copy-constructor
public:
  // Explicit default constructor required:
  WithCC() {}
  WithCC(const WithCC&) {
    cout << "WithCC(WithCC&)" << endl;
  }
};

class WoCC { // Without copy-constructor
  string id;
public:
  WoCC(const string& ident = "") : id(ident) {}
  void print(const string& msg = "") const {
    if(msg.size() != 0) cout << msg << ": ";
    cout << id << endl;
  }
};

class Composite {
  WithCC withcc; // Embedded objects
  WoCC wocc;
public:
  Composite() : wocc("Composite()") {}
  void print(const string& msg = "") const {
    wocc.print(msg);
  }
};

私はC++の第11章のデフォルトのコピーコンストラクタで考えを読んでいます。上記のコードについて、作成者は次のように述べています。「クラスWoCCにはコピーコンストラクターはありませんが、そのコンストラクターは、を使用して出力できる内部文字列にメッセージを格納します print( )。このコンストラクターは、コンストラクター初期化子リストで明示的に呼び出されComposite’sます」。

WoCCコンストラクターをのコンストラクターで明示的に呼び出す必要があるのはなぜCompositeですか?

4

1 に答える 1

1

wocc暗黙的にデフォルトで構築されるため、明示的な構築を省略できます。デフォルトのコンストラクターは、引数をとらないコンストラクターです。をとるコンストラクターにはその文字列のデフォルト値があるWoCCため、にはデフォルトのコンストラクターがあります。string

この場合のように、特定の文字列を渡したい場合にのみ、コンストラクターを明示的に呼び出す必要があります。

ただし、引数にデフォルト値(remove = "")がない場合は、実際にで正しいコンストラクターを明示的に呼び出す必要がありますComposose。これは、独自のコンストラクターを定義すると、コンパイラーがデフォルトのデフォルトコンストラクターを暗黙的に生成するのを防ぐためです。デフォルトのコンストラクターがない場合は、woccメンバーに対して正しいコンストラクターが呼び出されていることを確認する必要があります。

また、WoCC確かにコピーコンストラクタがあります。コンパイラーは、暗黙のコピーコンストラクターを定義しない場合に生成します(delete移動コンストラクターを指定した場合にのみdとして定義します)。

于 2013-02-23T18:31:14.173 に答える