Linked List c ++节点构造函数

时间:2015-02-09 19:48:28

标签: c++ constructor linked-list nodes

我被赋予了这个代码来操作练习链接列表,但在我开始之前,有一些我不理解的东西。首先,我认为当没有编写构造函数时,程序本身就会生成一个默认构造函数。这里有一条评论说"默认构造函数创建一个空列表"在书面构造函数旁边。我也不明白为什么旁边有一组方括号... {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;}

2 个答案:

答案 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成为它的朋友。当函数需要访问类的protectedprivate成员时,将使用head个方法。

由于LinkedListfriend的私有成员,因此<<关键字用于允许输出操作员<<访问它。在这种情况下,运算符std::cout允许您编写类以输出数据流,最值得注意的是LinkedList list; std::cout << list << std::endl; 。请看以下示例:

{{1}}