c++ - 构造函数初始化列表: code from the C++ Primer,第16章

标签 c++ initialization-list

在“C++ Primer”第 16 章快结束时,我遇到了以下代码(我删除了一堆行):

class Sales_item {
public:
    // default constructor: unbound handle
    Sales_item(): h() { }
private:
    Handle<Item_base> h;   // use-counted handle
};

我的问题是 Sales_item(): h() { }线。

为了完整起见,让我也引用 Handle 类模板中我认为与我的问题相关的部分(我认为我不需要显示 Item_base 类):

template <class T> class Handle {
public:
    // unbound handle
    Handle(T *p = 0): ptr(p), use(new size_t(1)) { }
private:
    T* ptr;          // shared object
    size_t *use;     // count of how many Handles point to *ptr
};

我会期待这样的事情:

a) Sales_item(): h(0) { }这是作者在前面的章节中反复使用的约定,或者

b) Handle<Item_base>()如果意图是调用 Handle 类的默认构造函数。

相反,这本书的内容是 Sales_item(): h() { } .我的直觉 react 是这是一个拼写错误,因为 h() 看起来与函数声明非常相似。另一方面,我只是尝试在 g++ 下编译并运行使用此类的示例代码,它似乎工作正常。有什么想法吗?

编辑: 所有好的答案,谢谢!在这期间的 30 分钟内,我找到了同一本书第 12 章中的相关引述:“当我们初始化类类型的成员时,我们正在指定要传递给该成员类型的构造函数之一的参数。我们可以使用该类型的任何构造函数。”正如你们都指出的那样,在这种情况下,我们将传递零参数。

最佳答案

你有什么 Sales_item(): h() { }是一个带有数据成员初始化的构造函数。

I would have expected something like either:

a) Sales_item(): h(0) { } which is a convention the authors have used repeatedly in earlier chapters, or

这不是必需的,因为 Handle<Item_base>() 的构造函数可以在没有参数的情况下调用。 (它的一个参数有一个默认值,因此可以省略。)

b) Handle<Item_base>() if the intention was to invoke the default constructor of the Handle class.

这是完全错误的语法。该语法用于基类并且很好,因为任何类只能从 Handle<Item_base>() 继承一次。 .但是,它可以有许多该类型的数据元素,因此为了初始化正确的数据成员,使用它的名称而不是它的类型。


顺便说一句,这是一本非常好的书,您可以从中学习。完成后,您可能想看看 The Definitive C++ Guide and List以获得更多好的输入。

关于c++ - 构造函数初始化列表: code from the C++ Primer,第16章,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2847334/

相关文章:

c++ - 使用可变参数函数的初始化列表

c++ - 防止 Core Dump 使用空指针初始化字符串

c++ - 带 swig 的 auto_ptr

c++ - Enter 和 Backspace 键中的 getch() 异常

c++ - 我可以将指向派生类字段的指针传递给 super 构造函数的 super 构造函数不使用该指针吗?

c++ - 有没有办法绕过不同编译器上的 printf 错误?

c++ - 在运行时添加字段 : suffer either vtable-cost or cache miss at destructor

C++ 构造函数初始化

c++ - 在 C++ 中初始化对成员的引用为 NULL