Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 构造函数初始化列表:来自C++;入门,第16章_C++_Initialization List - Fatal编程技术网

C++ 构造函数初始化列表:来自C++;入门,第16章

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++下编译并运行使用该类的示例代码,它似乎工作正常。有什么想法吗 编辑:所有好答案,谢谢!在接下

在《C++入门》第16章的末尾,我遇到了以下代码(我删除了一大堆行):

我本以为会发生这样的事情:

a)
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
};