Создание экземпляров для класса связанного списка в C ++ - PullRequest
0 голосов
/ 21 октября 2018

В настоящее время я изучаю связанный список 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 голосов
/ 21 октября 2018

Я попытался найти дубликат, который объясняет, как 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, и копия увеличивается.

Это не может бытьчто нужно, и мы можем изменить результат на 7, изменив myFunction, чтобы получить ссылку на значение.Это делается с помощью символа «&» для описания ссылочного значения.

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, чтобы убедить компилятор в том, чтозначение не должно быть изменено.

...