Ale*_*lis 4 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
};
Run Code Online (Sandbox Code Playgroud)
我的问题在于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
};
Run Code Online (Sandbox Code Playgroud)
我原以为是这样的:
a)Sales_item(): h(0) { }这是作者在前几章中反复使用的惯例,或者
b)Handle<Item_base>()如果打算调用Handle类的默认构造函数.
相反,这本书有什么Sales_item(): h() { }.我的直觉反应是这是一个错字,因为h()看起来与函数声明看起来很可疑.另一方面,我只是尝试在g ++下编译并运行使用此类的示例代码,它似乎正常工作.有什么想法吗?
编辑:所有的好答案,谢谢!我在30分钟内跟踪了同一本书第12章中的相关引用:"当我们初始化类类型的成员时,我们指定要传递给该成员类型的构造函数之一的参数.我们可以使用任何一种类型的构造函数." 正如大家所指出的,在这种情况下,我们传递零参数.
你所拥有的Sales_item(): h() { }是一个具有数据成员初始化的构造函数.
我原以为是这样的:
a)
Sales_item(): h(0) { }这是作者在前几章中反复使用的惯例,或者
这不是必需的,因为Handle<Item_base>()可以在没有参数的情况下调用构造函数.(它的一个参数有一个默认值,因此可以省略.)
b)
Handle<Item_base>()如果打算调用Handle类的默认构造函数.
这只是不正确的语法.该语法用于基类,并且它很好,因为任何类只能从中继承一次Handle<Item_base>().但是,它可以具有该类型的许多数据元素,因此为了初始化正确的数据成员,使用其名称而不是其类型.
这是你正在学习的一本非常好的书,BTW.一旦完成它,您可能需要查看"最终C++指南和列表"以获得更好的输入.