理解默认构造函数c ++

时间:2013-02-23 18:20:46

标签: c++ default-constructor

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构造函数?

1 个答案:

答案 0 :(得分:1)

您可以高兴地省略显式构造,因为wocc将隐式构造。默认构造函数是不带参数的构造函数。 WoCC有一个默认构造函数,因为带string的构造函数具有该字符串的默认值。

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

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

此外,WoCC确实有一个复制构造函数。如果你没有定义一个隐式拷贝构造函数,它就会生成一个隐式拷贝构造函数(如果你提供一个移动构造函数,它只会将它定义为delete。)