2015-04-11 2 views
0

Что касается бинарных деревьев - я видел следующий код как часть решения проблемы:Pointer Синтаксис C++

struct Node 
{ 
    int key; 
    struct Node *left, *right; 
}; 

Мой вопрос: что делает «структура Node * влево * право» означает, учитывая то определяется w/в теле первого определения узла узла. Кроме того, если это C++, зачем использовать здесь вместо класса или объекта?

+1

'struct' и' class' - это по сути то же самое в C++. Единственное отличие состоит в том, что члены 'struct' являются' public' по умолчанию, а члены 'class' являются' private' по умолчанию. По этой причине обычно использовать 'class' в любое время, когда вы хотите инкапсулировать, и' struct', когда вы просто хотите собрать вместе связанных публичных элементов данных, например. [ 'Станд :: pair'] (http://en.cppreference.com/w/cpp/utility/pair). – JBentley

+1

Это было ответило ранее: http://stackoverflow.com/a/7729819/1236397 –

+0

Почему вы не могли просто написать «Node * left, * right» вместо «struct Node» left, * right » – djfkdjfkd39939

ответ

2

В C++ (и особенно в C) типы обычно всегда представлены их конструкцией.

Например,

enum Foo { ... }; 
void doSomethingWithAFoo(enum Foo f); 

struct Bar { ... }; 
void doSomethingWithABar(struct Bar bar); 

Хотя это требуется в C, это не в C++. В C это достигается с помощью typedef.

typedef struct { ... } Foo; // Can now be referenced with just `Foo` 

Однако есть определенная часть спецификации, которая гласит, что типы структуры не могут иметь экземпляра себя внутри них (более конкретно говорится типы не могут относиться к себе, прежде чем они полностью объявлены) ,

За исключением формы указателя. Это связано с тем, что указатели известны в начале компиляции, тогда как структуры известны только после их объявления.


С struct сек предшествуют C++ (только немного) и присутствует с ANSI C (C89) и до этого в большинстве крупных составителей, они также присутствуют в C++ (с ANSI C может быть скомпилирован изящно совместимые компиляторы C++).

Однако C++ добавляет понятие классов, которые не имеют. На C. Как упоминалось выше, классы и структуры аналогичны тем, что они оба содержат элементы. В C++ структуры могут иметь методы, подобные классам - очевидно, это не так. C.

Единственная разница, насколько мне известно, - это видимость; struct По умолчанию для общего доступа и class es по умолчанию для частного. C не имеет понятия видимости.

+0

Я объясняю это; вы, скорее всего, работаете с кодом, который на самом деле C. Это просто происходит с вашим компилятором на C++. – Qix

+0

Интересно, поэтому в форме указателя bc он имеет тип struct и его рекурсивный (т. Е. «Struct Node * left, * right» вместо «struct Node left, right»)? – djfkdjfkd39939

+0

Правильно. Думаю об этом; если структура должна была выделить пространство для себя, а затем сама копия, эти копии сами по себе также должны были бы выделить место для большего количества копий и т. д. Это никогда не закончится. – Qix

1

Значит, как выглядит. Рекурсивное объявление просто означает, что структура узла имеет два поля, которые являются указателями на другие узлы.

Я читал, что основное различие между структурами и классами в C++ - это разрешения по умолчанию (по умолчанию все структуры общедоступны). Немного проще, тем более, что наследование маловероятно.

+0

Почему вы не могли просто написать «Node * left, * right» вместо «struct Node» left , *правильно"? – djfkdjfkd39939

0

Значение struct Node *left, *right; в пределах определения struct Node является то, что каждый экземпляр struct Node содержит элементы (left и right), которые указывают на другие struct Node с.

Обязанность программиста обеспечить, чтобы при создании struct Node эти элементы были инициализированы соответствующим образом. Они могут быть установлены в NULL (указывая, что они не указывают на какой-либо объект) или на адрес другого struct Node.

В C++ инициализация left и right часто выполняется в конструкторе. C не имеет такой функции, поэтому каждый раз, когда какой-то код C создает struct Node, ему обычно нужно явно инициализировать левый и правый элементы.

Код, который вы показали, действительно C, хотя он будет принят компилятором C++. C++ позволяет декларации struct Node *left, *right; опустить ключевое слово struct. C нет.

В С ++ struct и class одно и то же - разница доступности членов: C++ struct члены public и class члены private по умолчанию. C++ struct s (и class es) способны делать множество других вещей, которые C struct не могут.