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具有默认构造函数,因为采用 a 的构造函数string具有该字符串的默认值。

如果你想传递一个特定的字符串,则只需要显式调用构造函数,就像在这种情况下发生的那样。

但是,如果参数没有默认值(删除= ""),那么您确实必须在Composose. 这是因为定义您自己的任何构造函数都会阻止编译器隐式生成默认的默认构造函数。如果它没有默认构造函数,那么您需要确保为该wocc成员调用正确的构造函数。

此外,WoCC确实有一个复制构造函数。delete如果您没有定义一个,编译器会生成一个隐式复制构造函数(如果您提供移动构造函数,它只会将其定义为d)。

于 2013-02-23T18:31:14.173 回答