我得到了这段代码来操作链表,但在我开始之前,有一些事情我不明白。首先,我认为默认构造函数是由程序本身在没有编写构造函数时创建的。这里有一条注释,说"默认构造函数创建一个空列表"旁边是一个书面构造函数。我也不明白为什么旁边有一组方括号......{ head = 空; }
但最重要的是我不明白这行代码... friend ostream& operator<<( 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;}
首先,我认为默认构造函数是由程序本身在没有编写构造函数时创建的。
default constructor
是可以在没有参数的情况下调用的。因此,在本例中,我们有一个用户定义的默认构造函数。这是完全有效的。
但最重要的是我不明白这行代码...
friend ostream& operator<<( ostream& os, const LinkedList &ll );
类中的这段代码允许operator<<
成为它的朋友。 当函数需要访问类的protected
或private
成员时,将使用Friend
方法。
由于head
是LinkedList
的私有成员,friend
关键字用于允许输出运算符<<
访问它。在这种情况下,运算符 <<
允许您编写类以输出数据流,最明显的是 std::cout
.举个例子:
LinkedList list;
std::cout << list << std::endl;
首先,我认为默认构造函数是由程序本身在没有编写构造函数时创建的。
好吧,默认构造函数是可以在没有参数的情况下调用的任何构造函数。但是编译器确实会生成默认的默认构造函数,并且默认初始化(uff!(所有成员。但是head
是一个没有默认初始化的指针。如果没有head = NULL
,它的价值将是不确定的。不过,更好的方法是:
LinkedList() : head(NULL) {}
但最重要的是我不明白这行代码...friend ostream& operator<<( ostream& os, const LinkedList &ll (;
它在全局范围内(类外部(定义运算符<<,这也是类的友元。同样可以做到:
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
(的第一个参数。