我被赋予了这个代码来操作练习链接列表,但在我开始之前,有一些我不理解的东西。首先,我认为当没有编写构造函数时,程序本身就会生成一个默认构造函数。这里有一条评论说"默认构造函数创建一个空列表"在书面构造函数旁边。我也不明白为什么旁边有一组方括号... {head = NULL; }
但最重要的是我不明白这行代码...... 朋友ostream&运算符<<(ostream& os,const LinkedList& ll);
这是做什么的?
#include <iostream>
#include <cstdlib>
using namespace std;
class LinkedList
{
public:
LinkedList() { head = NULL; } // default constructor makes an empty list
// functions to aid in debugging
// -----------------------------
friend ostream& operator<<( ostream& os, const LinkedList &ll );
void insertHead( int item );
private:
class Node // inner class for a linked list node
{
public:
Node( int item, Node *n ) // constructor
int data; // the data item in a node
Node *next; // a pointer to the next node in the list
};
Node *head; // the head of the list
};
friend ostream& operator<<( ostream& os, const LinkedList &ll )
{
for (Node *current = ll.head; current != NULL; current = current->next)
os << current->data << " ";
return os;
}
void LinkedList::insertHead( int item ) // insert at head of list
{
head = new Node( item, head );
}
LinkedList::Node::Node( int item, Node *n ) {Node::data = item; next = n;}
答案 0 :(得分:1)
首先,我认为当没有编写构造函数时,程序本身就会生成一个默认构造函数。
嗯,默认构造函数是可以不带参数调用的任何构造函数。但是编译器会生成默认的默认构造函数,并默认初始化(uff!)所有成员。但是head
是一个没有默认初始化的指针。没有head = NULL
,其值将是不确定的。不过,更好的方法是:
LinkedList() : head(NULL) {}
但最重要的是我不理解这行代码...朋友ostream&amp;运算符&lt;&lt;(ostream&amp; os,const LinkedList&amp; ll);
它定义了运算符&lt;&lt;在全球范围内(课外),也是班级的朋友。同样可以用:
class LinkedList
{
friend ostream& operator<<( ostream& os, const LinkedList &ll );
};
ostream& operator<<( ostream& os, const LinkedList &ll )
{
…
}
按以下方式将数据发送到输出流(源自std::ostream
)时,按惯例使用此运算符:
LinkedList list;
cout << list << endl; // Dumps the list to standard output
根据这个约定,这个运算符返回它作为第一个参数(ostream&
)得到的相同引用,以便它可以如上所示进行链式链接;第一个操作符调用(cout << list
)的返回值用作第二个操作符调用的第一个参数([returned value] << endl
)。
答案 1 :(得分:1)
首先,我认为当没有编写构造函数时,程序本身就会生成一个默认构造函数。
default constructor
是可以不带参数调用的friend ostream& operator<<( ostream& os, const LinkedList &ll );
。因此,在这种情况下,我们有一个用户定义的默认构造函数。这完全有效。
但最重要的是我不理解这行代码......
operator<<
该类中的代码允许Friend
成为它的朋友。当函数需要访问类的protected
或private
成员时,将使用head
个方法。
由于LinkedList
是friend
的私有成员,因此<<
关键字用于允许输出操作员<<
访问它。在这种情况下,运算符std::cout
允许您编写类以输出数据流,最值得注意的是LinkedList list;
std::cout << list << std::endl;
。请看以下示例:
{{1}}