在C ++中为链接列表类创建实例

时间:2018-10-21 07:31:18

标签: c++ class linked-list

我目前正在学习C ++链表,我从教科书中看到了这段代码。我对此很难理解:

const string& e

我试图在我的主要函数中为此类编写一些实例,以查看事情如何工作但不知道如何工作。 例如,我要在列表中添加3、5、7,并在列表的前面添加1,而不是从列表中删除7。

#include <cstdlib>
#include <iostream>
#include <string>

using std::string;
using namespace std;



class StringNode {                      // a node in a list of strings
private:
  string elem;                              // element value
  StringNode* next;                     // next item in the list

  friend class StringLinkedList;                // provide StringLinkedList 
                                                // access
};

class StringLinkedList {                    // a linked list of strings
public:
  StringLinkedList();                       // empty list constructor
  ~StringLinkedList();                          // destructor
  bool empty() const;                       // is list empty?
  const string& front() const;                      // get front element
  void addFront(const string& e);               // add to front of list
  void removeFront();                       // remove front item list
private:
  StringNode* head;                     // pointer to the head of list
};

StringLinkedList::StringLinkedList()            // constructor
  : head(NULL) { }

StringLinkedList::~StringLinkedList()           // destructor
  { while (!empty()) removeFront(); }

bool StringLinkedList::empty() const            // is list empty?
  { return head == NULL; }

const string& StringLinkedList::front() const       // get front element
  { return head->elem; }



void StringLinkedList::addFront(const string& e) {  // add to front of list
  StringNode* v = new StringNode;           // create new node
  v->elem = e;                          // store data
  v->next = head;                   // head now follows v
  head = v;                     // v is now the head
}



void StringLinkedList::removeFront() {              // remove front item
  StringNode* old = head;               // save current head
  head = old->next;                 // skip over old head
  delete old;                       // delete the old head
}

1 个答案:

答案 0 :(得分:0)

我试图寻找一个重复的词,该词解释了C++如何使用按值调用。

在C ++中,类型T的函数参数将在调用函数之前创建对象的副本。

int myFunction( int value )
{
     value = value + 1;
}

int main( int argc, char * argv[] )
{
    int elem = 6;
    myFunction( elem );
    printf( "%d\n", elem ); // elem = 6;
}

在上面的示例中,复制了int值并将其发送到myFunction,并且该副本递增。

这可能不是所需要的,我们可以通过修改myFunction以引用该值来将结果更改为7。这是通过使用“&”描述参考值来完成的。

int myFunction( int & value )
{
     value = value + 1;
}

int main( int argc, char * argv[] )
{
    int elem = 6;
    myFunction( elem );
    printf( "%d\n", elem ); // elem = 7;
}

在上述情况下,不进行任何复制,并且elem得到更新。

将引用传递给函数的主要原因有两个

  1. 允许更新值(或对象)。
  2. 为避免复制值而产生的费用。

在您引用的示例中,第二种情况是为什么使用const string &(对字符串对象的引用)。 std::string的建造和销毁费用很高,因此发送参考以避免这种情况会更有效。

通常使用const作为引用,以补充这种用法,以说服编译器不应更改该值。