4

在“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() { }. 我的直觉反应是这是一个错字,因为 h() 看起来与函数声明非常相似。另一方面,我只是尝试在 g++ 下编译并运行使用此类的示例代码,它似乎工作正常。有什么想法吗?

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

4

3 回答 3

6

您所拥有的Sales_item(): h() { }是具有数据成员初始化的构造函数。

我本来期望像这样的:

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

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

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

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


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

于 2010-05-17T07:48:10.947 回答
2

代码完全正确 - h() 表示使用默认构造函数来构造 h。在这种情况下,它也是不必要的,因为如果您不提供显式初始化,将使用默认构造函数。默认构造函数是可以在没有参数的情况下调用的任何构造函数,句柄类具有,因为它的默认参数值。

于 2010-05-17T07:48:42.833 回答
1

h是 的一个成员变量的名字Sales_item,它的类Handle有一个带默认参数的构造函数,所以h()正确地构造了这个成员。它相当于h(0)

于 2010-05-17T07:48:39.927 回答