c++ - 理解默认构造函数 C++

标签 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);
  }
};

我正在阅读 thinking in c++ 第 11 章默认复制构造函数。 对于上面的代码,作者说:“类 WoCC 没有复制构造函数,但是它的构造函数会在内部字符串中存储一条消息,可以使用 print( )。此构造函数在 Composite 的 构造函数初始化列表中显式调用。

为什么必须在 Composite 的构造函数中显式调用 WoCC 构造函数?

最佳答案

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

只有在您想要传递特定字符串时才需要显式调用构造函数,正如本例中所发生的那样。

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

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

关于c++ - 理解默认构造函数 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15043933/

相关文章:

C++在同一行读取具有多种类型的文件

c++ - 通过引用设置构造函数复制?

wcf - 具有需要参数的服务的自托管(无 IIS 或 WAS)WCF

c++ - 桌面集成应用程序(类似桌面小部件)

c++ - 序列点 - 数组上的异或交换得到错误的结果

c++ - 如何使用 CIN 在一行中捕获两种不同的数据类型?

c++ - 没有合适的默认构造函数可用 - 默认构造函数在哪里调用?

c++ - 类外的默认构造函数/析构函数?

c++是在参数化构造函数中调用的默认构造函数吗?

c++ - 结构上没有合适的默认构造函数