C++ 构造函数初始化列表:来自C++;入门,第16章
在《C++入门》第16章的末尾,我遇到了以下代码(我删除了一大堆行): 我本以为会发生这样的事情: a)C++ 构造函数初始化列表:来自C++;入门,第16章,c++,initialization-list,C++,Initialization List,在《C++入门》第16章的末尾,我遇到了以下代码(我删除了一大堆行): 我本以为会发生这样的事情: a) Sales_item():h(0){}这是作者在前几章中反复使用的约定,或者 b) Handle()如果目的是调用Handle类的默认构造函数 相反,这本书的内容是Sales\u item():h(){}。我的直觉反应是这是一个输入错误,因为h()看起来与函数声明非常相似。另一方面,我只是尝试在g++下编译并运行使用该类的示例代码,它似乎工作正常。有什么想法吗 编辑:所有好答案,谢谢!在接下
Sales_item():h(0){}
这是作者在前几章中反复使用的约定,或者
b) Handle()
如果目的是调用Handle类的默认构造函数
相反,这本书的内容是Sales\u item():h(){}
。我的直觉反应是这是一个输入错误,因为h()看起来与函数声明非常相似。另一方面,我只是尝试在g++下编译并运行使用该类的示例代码,它似乎工作正常。有什么想法吗
编辑:所有好答案,谢谢!在接下来的30分钟里,我找到了同一本书第12章的相关引用:“当我们初始化一个类类型的成员时,我们正在指定要传递给该成员类型的构造函数之一的参数。我们可以使用该类型的任何构造函数。”正如大家所指出的,在本例中,我们传递的是零参数。您使用的
Sales\u item():h(){}
是一个具有数据成员初始化的构造函数
我本以为会发生这样的事情:
a) Sales_item():h(0){}
这是作者在前几章中反复使用的约定,或者
这不是必需的,因为Handle()
的构造函数可以在没有参数的情况下调用。(它的一个参数具有默认值,因此可以省略。)
b) Handle()
如果目的是调用Handle类的默认构造函数
这完全是不正确的语法。该语法用于基类,在那里很好,因为任何类只能从Handle()
继承一次。但是,它可以有许多该类型的数据元素,因此为了初始化正确的数据成员,将使用其名称而不是其类型
顺便说一句,这是你正在学习的一本非常好的书。读完这本书后,你可能想看看更多的好输入。
h
是Sales\u item
的一个成员变量的名称,它的类Handle
有一个带有默认参数的构造函数,因此h()
正确地构造了该成员。它相当于h(0)
代码完全正确-h()表示使用默认构造函数来构造h。在这种情况下,它也是不必要的,因为如果不提供显式初始化,将使用默认构造函数。默认构造函数是任何可以在没有参数的情况下调用的构造函数,handle类有参数,这是由于它的默认参数值。关于b点,您完全正确。从我的编辑中可以清楚地看出,我不太确定这篇文章的意思是什么。
class Sales_item {
public:
// default constructor: unbound handle
Sales_item(): h() { }
private:
Handle<Item_base> h; // use-counted handle
};
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
};